类成员初始化
成员初始化的时机:
- 行内初始化:成员声明时,可以行内初始化,如果没有显式地进行行内初始化,就调用无参构造函数进行初始化。
- 构造函数中初始化:通过
:<member>(value)
来初始化。如果存在这种初始化,行内初始化就不会生效。
继承时构造和析构的调用顺序
存在继承时,构造函数和析构函数的调用顺序
注:
- 子类声明了构造函数,需要在其中显式调用父类的「构造函数」。
编译器提供的函数
如果用户没用定义,编译器会自动生成一些特殊函数
注:
- 如果用户定义了「构造函数」,编译器将不会提供「默认构造函数」
- 对于上面的 6 种函数,用户可以通过
X() = default;
来让编译器生成默认的函数 - 也可以
X() = delete;
来阻止编译器自动生成。
如果用户自定义了「析构函数」,那么最好也自定义「拷贝构造函数」和「拷贝赋值运算符」,例如:
写一个类
如果要写一个类,最好按照以下方式来写,不容易出错。
1、不写任何特殊成员 | ![]() |
---|---|
2、全都写全 | ![]() |
3、只可移动,不可拷贝 | ![]() |
4、不可拷贝,不可移动 | ![]() |
5、只可拷贝,不可移动 | ![]() |