7. 三大函数:拷贝构造,拷贝赋值,析构
约 405 字大约 1 分钟
2025-09-05
接下来是一个有关 Class with pointer member(s) 的例子:
7.1 Big Three, 三個特殊函數
这里介绍了构造函数、拷贝构造、拷贝赋值构造(copy assignment)
7.2 ctor和dtor(构造函數和析构函數)
在构造函数内申请开辟内存后要在析构函数手动释放内存。
7.3 class with pointer members 必须有 copy ctor 和 copy op=
编译器可以暗自为 class 创建 default构造函数、copy构造函数、copy assignment 操作符,以及析构函数,而类带指针需要自己设计拷贝构造和拷贝赋值,不能使用默认提供的copy构造函数、和copy assignment 操作符,避免浅拷贝
详情见《Effective C++》条款05:了解C++默默编写并调用哪些函数
7.4 copy ctor (拷贝构造函數)
设计拷贝构造的时候,可以直接取另一个传进来 object 的 private data,因为兄弟之间互为 friend
7.5 copy assignment operator (拷贝赋值函数)
inline
String& String::operator=(const String& str)
{
if (this == &str)
return *this;
delete[] m_data;
m_data = new char[ strlen(str.m_data) + 1 ];
strcpy(m_data, str.m_data);
return *this;
}
拷贝赋值操作顺序:
- 删除原有数据
- 新开辟一段拷贝内容大小的空间
- 将拷贝内容复制到开辟的空间
7.6 一定要在operator= 中檢查是否self assignment
拷贝赋值中注意需要检测自我赋值,直接返回即可,确保效率和正确性
详情见《Effective C++》条款 11:在operator= 中处理“自我赋值”