类成员初始化

成员初始化的时机:

  1. 行内初始化:成员声明时,可以行内初始化,如果没有显式地进行行内初始化,就调用无参构造函数进行初始化。
  2. 构造函数中初始化:通过 :<member>(value) 来初始化。如果存在这种初始化,行内初始化就不会生效。

继承时构造和析构的调用顺序

存在继承时,构造函数和析构函数的调用顺序
image.png
注:

  • 子类声明了构造函数,需要在其中显式调用父类的「构造函数」。

编译器提供的函数

如果用户没用定义,编译器会自动生成一些特殊函数
image.png
注:

  • 如果用户定义了「构造函数」,编译器将不会提供「默认构造函数」
  • 对于上面的 6 种函数,用户可以通过 X() = default;来让编译器生成默认的函数
  • 也可以 X() = delete;来阻止编译器自动生成。

如果用户自定义了「析构函数」,那么最好也自定义「拷贝构造函数」和「拷贝赋值运算符」,例如:
image.png

写一个类

如果要写一个类,最好按照以下方式来写,不容易出错。

1、不写任何特殊成员 image.png
2、全都写全 image.png
3、只可移动,不可拷贝 image.png
4、不可拷贝,不可移动 image.png
5、只可拷贝,不可移动 image.png