本文旨在说清楚一个问题,就是当我们用C++写下default
时,到底发生了什么。
首先,default
关键字是我们告诉编译器(Compiler)我们需要一个自动生成(synthesized)的特殊成员函数(Special member functions),这类的特殊成员函数包括以下几种:
- Default constructor
- Copy constructor
- Move constructor
- Copy assignment operator
- Move assignment operator
- Destructor
接下来所有的情况,都会围绕以上这6个函数来展开,我们依次来说default
关键字的作用效果。
Default Constructor
Default constructor的定义是参数列表为空的构造函数(constructor)
如果class中的data memeber具有in-class initializer, 那么就使用它来初始化(initialize)这个member
否则,就使用default-initialize来初始化member
简而言之就是Synthesized Default Constructor函数体为空
class Sales_data { |
Copy/Move Constructor
按照class中data member在class definition body中的declaration顺序进行一个一个的初始化,初始化的方式是从给定参数object中copy / move member
class Sales_data { |
这里要注意的是,default
只能保证尽量将每个data member进行move constructor(右值)进行初始化。如果说有一个data member的type声明move constructor = delete,那么所有的data member都会变成使用copy constructor(左值)进行初始化;如果说有一个data member的type只声明了copy constructor,那么编译器不会implicit生成move constructor,因此该data member将使用copy constructor(左值)进行初始化,而其他的data member不受影响,继续使用move constructor(右值)进行初始化。
Copy/Move Assignment Operator
对于class中的data member,依次用right-hand object中的member对left-hand object中的member进行拷贝赋值操作(调用member的copy assignment operator)/ 移动赋值操作(调用member的move assignment operator)
class Sales_data { |
Destructor
Synthesized Default Destructor的函数体为空
class Sales_data { |
另外,想说一点小细节就是,当我们在class body内的member declaration中使用=default
,那么自动生成的函数是inline
的;如果不希望变成inline
function,就需要在member definition中使用=default