如何实现深拷贝并掌握拷贝构造函数的高级写法?
- 内容介绍
- 文章标签
- 相关推荐
本文共计927个文字,预计阅读时间需要4分钟。
默认的复制构造函数仅执行浅拷贝,只复制对象的类成员,而不会复制指向成员的指针。如果两个对象指向同一块堆内存,析构时重复释放同一内存会导致程序崩溃。
你不能依赖编译器生成的版本,哪怕看起来“能跑”。只要涉及动态分配,就必须显式定义:
class Buffer { char* data_; size_t size_; public: Buffer(const char* s) : size_(strlen(s)) { data_ = new char[size_ + 1]; strcpy(data_, s); } <pre class='brush:php;toolbar:false;'>// 必须写!否则是浅拷贝 Buffer(const Buffer& other) : size_(other.size_) { data_ = new char[size_ + 1]; strcpy(data_, other.data_); } ~Buffer() { delete[] data_; }
};
拷贝构造函数参数必须是 const 引用
写成 Buffer(Buffer other) 或 Buffer(Buffer& other) 都错:
前者会触发无限递归(传值调用又需要拷贝);后者无法绑定临时对象或 const 对象,限制太死。
本文共计927个文字,预计阅读时间需要4分钟。
默认的复制构造函数仅执行浅拷贝,只复制对象的类成员,而不会复制指向成员的指针。如果两个对象指向同一块堆内存,析构时重复释放同一内存会导致程序崩溃。
你不能依赖编译器生成的版本,哪怕看起来“能跑”。只要涉及动态分配,就必须显式定义:
class Buffer { char* data_; size_t size_; public: Buffer(const char* s) : size_(strlen(s)) { data_ = new char[size_ + 1]; strcpy(data_, s); } <pre class='brush:php;toolbar:false;'>// 必须写!否则是浅拷贝 Buffer(const Buffer& other) : size_(other.size_) { data_ = new char[size_ + 1]; strcpy(data_, other.data_); } ~Buffer() { delete[] data_; }
};
拷贝构造函数参数必须是 const 引用
写成 Buffer(Buffer other) 或 Buffer(Buffer& other) 都错:
前者会触发无限递归(传值调用又需要拷贝);后者无法绑定临时对象或 const 对象,限制太死。

