4

我正在学习 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”。我在这里缺少什么明显的东西?

4

1 回答 1

7

简短的回答

正如 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;

作为一般经验法则,当您需要定义 a 时operator=,您可能还需要定义 acopy constructor和 a destructor

有关详细信息,请参阅三法则。

于 2013-05-25T18:54:19.913 回答