C++运算符重载(3) - 什么时候需要自定义赋值操作符

答案与拷贝构造函数一样。
如果一个类不包含指针,则不需要自定义赋值操作符与拷贝构造函数。编译器会给每个类创建一个默认的拷贝构造函数和默认的赋值操作符。
但是,当类中包含有指针或任何运行时分配的资源时,编译器生成的这两个函数,可能会失效。

参考下面程序:

#include<iostream>
using namespace std;

// 没有自定义赋值操作符
class Test {
    int* ptr;
public:
    Test(int i = 0) { ptr = new int(i); }
    void setValue(int i) { *ptr = i; }
    void print() { cout << *ptr << endl; }
};

int main() {
    Test t1(5);
    Test t2;
    t2 = t1;
    t1.setValue(10);
    t2.print();
    return 0;
}

运行结果:
10

仔细看下main函数,会发现使用setValue()修改了t1的值后,对象t2也跟着改变了。这会导致未知的行为。
因为上面程序没有自定义赋值操作符,所以编译器生成了一个默认的,会将ptr从右侧拷贝到左侧。所以两个对象中的ptr指向相同位置。

可以使用两种方法来解决上面问题:
1) 禁止对象之间进行赋值操作。我们可以使用自定义的赋值运算符并定义为private。
2) 自定义赋值运算符来实现深拷贝(deep copy)。

对于拷贝构造函数,也是同样的道理。

下面是重载了赋值运算符后的程序:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水草

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值