假设我有以下代码:
class A {
public:
int x;
A(){}
A(const A& a){} //copy constructor
operator= (const A &a){...}
};
class B {
public:
A a;
B(){}
};
int main() {
B b;
B c = b; //shallow copy
B d;
d = b; //shallow assignment
}
浅拷贝\赋值是否会调用成员A a的拷贝构造函数\赋值运算符重载?或者简单地说,浅拷贝执行成员对象的用户定制的拷贝构造函数和赋值操作符,或者也执行浅拷贝?
发布于 2021-01-27 00:19:09
那么答案是肯定的,复制构造函数将被调用,但赋值操作符不会被调用。
将调用复制构造函数,因为调用了默认的复制构造函数,但未调用赋值运算符。默认的赋值运算符将调用默认的复制构造函数,默认的复制构造函数将调用基类的复制构造函数,但不调用默认的赋值运算符。
原因很简单:没有调用默认的赋值操作符,因为默认的赋值操作符被声明为"A& operator=(const A& a)“。
以上是使用调用约定( "= default“是成员函数调用约定)的情况。
发布于 2021-01-27 00:21:33
术语“浅复制”用于描述在“浅复制”之后,两个对象以某种方式在内部引用同一对象的复制。因此,操作一个对象可能在概念上操作通过另一个对象可见的值。
除非存储在A
中的int
的值是对某个对象的引用,否则A
或B
中的任何内容都不会引用对象。因此,这种对象的隐式定义副本不是“浅”的(或“深的”)。这种限定并不适用于没有引用其他对象的对象。
隐式定义的复制构造函数/赋值将执行每个子对象的成员级复制。只要这些子对象有复制构造函数/赋值运算符,它们就会被隐式定义的版本调用。
https://stackoverflow.com/questions/65905010
复制相似问题