赋值运算符和深层复制

时间:2013-05-25 18:50:09

标签: c++

我正在学习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'。我在这里想到的显而易见的事情是什么?

1 个答案:

答案 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 constructordestructor

有关详细信息,请参阅Rule of Three