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深拷贝和浅拷贝移动语义新对象特性