C++ 重载赋值运算符

Last updated on April 1, 2021 am

C++ 重载赋值运算符

如果在含有指针数据成员的类中没有重载赋值运算符,赋值时进行浅复制,导致被赋值对象与赋值对象指向同一地址,析构、操作数据成员时会出现不符合期望的结果,因此需要进行深复制。但仅进行深复制仍然是不够完善的。

1
2
3
4
5
Demo & Demo::operator=(const Demo & obj) {
delete ptr;
ptr = new string(*obj.ptr);
return *this;
}

上面的代码首先释放 Demo 类中的 ptr 指针,但在遇到 assigned = assigned; 这种自赋值情况时,将会错误地释放掉指针所指向的内存,造成崩溃。在开始前进行判断可避免这一情况:

1
2
3
4
5
6
7
Demo & Demo::operator=(const Demo & obj) {
if (&obj != this) {
delete ptr;
ptr = new string(*obj.ptr);
}
return *this;
}

C++ 重载赋值运算符
https://zhaozihanzzh.github.io/2021/03/31/assignmentoverride/
Author
zhaozihanzzh
Posted on
March 31, 2021
Licensed under