cpp特殊成员函数
内容简介
特殊成员函数包括默认构造、析构、拷贝构造、拷贝赋值、移动构造、移动赋值。它们决定对象如何创建、复制、移动和销毁。
这部分是所有权模型的核心:只要类直接管理资源,就必须认真处理这些函数。
三/五/零法则
| 法则 | 含义 |
|---|---|
| 三法则 | 自定义析构、拷贝构造、拷贝赋值中的一个,通常也要考虑另外两个 |
| 五法则 | C++11 后还要考虑移动构造和移动赋值 |
| 零法则 | 优先用 RAII 成员,让编译器生成默认特殊成员函数 |
推荐方向
#include <string>
#include <vector>
struct User {
std::string name;
std::vector<int> scores;
};这种类没有手动管理资源,通常遵守零法则即可。
需要小心的方向
class Buffer {
public:
Buffer(int size) : data_(new int[size]) {}
~Buffer() { delete[] data_; }
private:
int* data_ = nullptr;
};这个类有析构函数,但默认拷贝会浅拷贝 data_,容易重复释放。此时要么补齐拷贝/移动语义,要么改用 std::vector<int>。
注意事项
- 能用标准库对象管理资源,就不要自己写
new/delete。 - 有独占资源时,通常禁用拷贝,允许移动。
- 移动构造和移动赋值通常应该标记
noexcept。
相关:所有权模型、cpp深拷贝和浅拷贝、移动语义、新对象特性