我正在学习C ++,而且我没有得到关于赋值运算符的东西。据我了解,它们应该提供对象的深层副本。这是一个例子
Test::Test(int i){
value = i;
}
Test& Test::operator=(const Test& rhs){
value = rhs.value;
return *this;
}
现在:
Test* t1 = new Test(1);
Test* t2 = t1; //t2 should be now a deep copy of t1
t1->value = 2;
cout << t1->value;
cout << t2->value;
输出为22
但我预计为'21'。我在这里想到的显而易见的事情是什么?
答案 0 :(得分:6)
正如Obvlious船长建议的那样,用
打电话给你的任务操作员Test t2 = *t1
使用此行
Test* t2 = t1
您只是在指针之间进行分配,因此您声明指向Test
的指针t2
,该指针将保持指针t1
保持的相同地址。
使用t1
修改对象时,实际上是在更改t2
指向的同一对象(这解释了输出)。
如果要复制t1
,则应使用以下两种方法之一:
创建一个新的Test
对象,并使用t1
复制它:
Test t1;
Test t2(t1)
此代码将调用类Test
的复制构造函数:
Test::Test(const Test& t);
在现有Test
对象上使用赋值运算符:
Test t2;
t2 = t1;
作为一般经验法则,当您需要定义operator=
时,您可能还需要定义copy constructor
和destructor
。
有关详细信息,请参阅Rule of Three。