C++中的三法则与五法则

关于三法则:

  • 若析构函数、拷贝构造函数、赋值操作符三者自定义其一,则需要同时定义另外两个(编译器自动生成的一般语义错误)

关于五法则

  • 如果没有自定义析构函数、拷贝构造函数、赋值操作符任何其一没变压器也会自动生成移动构造和移动赋值操作符,生成的是按成员进行实例成员的移动操作请求(如果不支持,则退化为拷贝)
  • 如果自定义了析构函数、拷贝构造函数、赋值操作符任何其一,那么移动构造和移动赋值操作符都需要自定义,编译器将不再自动生成(常见陷阱的由来!)
  • 如果自定义了移动构造、移动赋值操作符任何其一,编译器将不再自动生成另外一个(注意和三法则的编译自动生成规则不同)和对应的拷贝构造、或赋值操作符
  • 简单规则: 五大特殊成员函数要么全部自定义(指针指向动态数据成员),要么全交给编译器自动生成(基本类型或对象成员)
打赏作者