- 行为像值,每个对象都有独立的状态:
#include <iostream>
#include <string>
class HasPtr {
public:
HasPtr() : ps(new std::string()), i() {}
HasPtr(const std::string &s)
: ps(new std::string(s)), i() {}
HasPtr(const HasPtr &obj)
: ps(new std::string(*obj.ps)), i(obj.i) {}
// HasPtr &operator=(const HasPtr &rhs) {
// delete ps;
// ps = new std::string(*rhs.ps);
// i = rhs.i;
// return *this;
// }
HasPtr &operator=(const HasPtr &rhs) {
auto newp = new std::string(*rhs.ps);
delete ps;
ps = newp;
i = rhs.i;
return *this;
}
~HasPtr() {
delete ps;
ps = nullptr;
}
private:
std::string *ps;
int i;
};
int main() {
HasPtr a;
HasPtr b("test");
a = b;
}
编写的拷贝赋值运算符必须保证即使出现异常或者赋值给自己也能正常工作。
因此,没有像被注释的代码中一样,先delete指针,如果delete之后出现异常,则原对象不可用;如果是赋值给自己的情况,delete自己的指针之后,无法再给自己赋值。
- 行为像指针,对象之间共享状态:
本文通过C++示例代码深入探讨了深拷贝和浅拷贝的区别,特别是对于包含指针的对象。展示了如何正确实现拷贝构造函数和拷贝赋值运算符,以避免资源泄露和自我赋值问题。
845

被折叠的 条评论
为什么被折叠?



