C++中特殊的成员函数

本篇大概介绍一下C++中特殊的成员函数的生成规则

在C++98中,有几个可能会被编译器自动生成的成员函数

  1. 构造函数
  2. 拷贝构造函数
  3. 拷贝赋值运算符
  4. 析构函数

在C++11中,又增加了两个

  1. 移动构造函数
  2. 移动赋值运算符

这些函数在你自己未进行申明的时候可能会被编译器自动生成,按照以下规则

总结一下编译器会为生成默认的成员函数的条件

构造函数

  1. 无自定义的构造函数(包括拷贝构造函数和移动构造函数)

拷贝构造函数

  1. 无自定义的拷贝构造函数
  2. 无自定义的移动构造函数和移动赋值运算符

拷贝赋值运算符

  1. 无自定义的拷贝构造运算符
  2. 无自定义的移动构造函数和移动赋值运算符

移动构造函数和移动赋值运算符

移动构造函数和移动赋值运算符是一块的,只要自定定义了其中一个,编译器就不会生成默认的移动构造函数或者移动赋值运算符

  1. 无自定义的移动构造函数和移动赋值运算符
  2. 无自定义的拷贝构造函数和拷贝赋值运算符
  3. 无自定义析构函数

析构函数

  1. 无自定义的析构函数

三/五法则

三:对于C++98,对于拷贝构造函数,拷贝赋值运算符,析构函数这三者,只要定义了其中一个,那么这三个都应该一起被定义,因为一旦牵涉到其中一个,就牵涉到资源管理,那么另外两个通常也不能按照编译器生成的默认行为进行。
五:对于C++11,又多了两个,移动构造函数,移动赋值运算符。同样的,这两个函数也应该加为一体。由于牵涉到自定义析构,拷贝,那么就牵涉到资源管理,因此移动赋值运算符和移动构造函数也需要自己定义,在这种情况下,由于默认的移动操作基本肯定是有问题的,因此编译器是不会为你生成默认的移动操作函数的。