提问人:Mas Bagol 提问时间:3/20/2015 最后编辑:PharapMas Bagol 更新时间:4/18/2018 访问量:2752
何时调用复制分配运算符?
When is the copy assignment operator called?
问:
当我读到复制构造函数和复制赋值构造函数时,我的理解是两者都相互释放它们的属性,并且它们都是由编译器隐式声明的(如果未定义)。因此,无论是否做一些有用的事情,两者都必须存在。
然后我测试了这段代码:
#include <iostream>
using namespace std;
class Test {
public:
Test () {
cout << "Default constructor" << endl;
}
Test (const Test& empty) {
cout << "Copy constructor" << endl;
}
Test& operator=(const Test& empty) {
cout << "Copy assignment operator" << endl;
}
private:
};
int main () {
Test a; // Test default constructor
Test b (a); // Test copy constructor
Test c = b; // Test copy assignment constructor
system ("pause");
return 0;
}
但似乎根本没有调用复制赋值运算符。我尝试了三个条件:
一切都包括在内。它打印出:
// Default constructor // Copy constructor // Copy constructor # Why not prints out "Copy assignment operator"?
Whitout 复制赋值运算符只是复制构造函数。它打印出:
// Default constructor // Copy constructor // Copy constructor # Why it's printed out even though I didn't define it?
Whitout copy 构造函数只是复制赋值运算符。它打印出:
// Default constructor # Why "Copy assignment operator" is not printed out?
只有构造函数。它打印出:
// Default constructor # Understandable
所以,就像编译器甚至不在乎我是否定义了复制赋值运算符一样。上面的四个示例中没有一个打印出“复制赋值运算符”。那么它是什么时候被调用的,如果它真的存在并且有意义呢?
答:
19赞
Emil Laine
3/20/2015
#1
Test c = b
是初始化,而不是赋值。
如果您已执行此操作:
Test c;
c = b;
然后,它将调用复制赋值运算符。
评论
0赞
Andreas Vennström
3/20/2015
这是否意味着和是相同的?Test c(b)
Test c = b
6赞
David G
3/20/2015
@AndreasVennström 不,它们不完全相同。它们在此代码中具有相同的效果,但它们是两种不同类型的初始化。请参阅 bit.ly/1FLauIT 并阅读有关直接初始化和复制初始化的信息。
评论
c
是新对象,所以它是复制结构