一、特殊成员函数
- 析构(C++98)
- 拷贝构造(C++98)
- 拷贝赋值(C++98)
- 移动构造(C++11)
- 移动赋值(C++11)
- 默认构造函数(C++98)
存在意义:避免写重复的代码,编译器会默认合成上面的函数
二、三(C++98)/五(C++11)法则
- 声明上面5个函数中的任意一个都应该同时将另外4个也声明出来。因为只有需要手动资源管理的类,才会声明这些函数,并且一般来说,声明其重要一个,那么另外4个也不应该使用默认的。
- 为了兼容C++98, 声明1/2/3 其中某几个,不会阻止另外几个
- C++11及时止损。
- 声明 1/2/3 就不会生成 4/5
- 声明 4/5 就不会生成 2/3/4/5,析构函数一定会生成
struct Base { virtual ~Base() {...} Base(Base&&) = default; // 如果不写移动构造就会被阻止 }
- 移动构造/赋值更像是一种请求,但这种请求很容易让代码变得低效
class StringTable{ public: StringTable(){...} ~StringTable(){...} // 之前没有写,现在写了;可能之前所有的移动操作都会变成拷贝 // 解决方案1:定义移动构造函数 // 解决方案2: // StringTable(StringTable&&)=default; private: std::map<int, std::string>value; }