20200215
Plan
60min: CPP
Notes
构造函数
- 如果成员是 const、引用或者属于某种未提供默认构造函数的类,需要通过构造函数初始值列表进行初始化。
- 成员初始化顺序和类定义中的出现顺序一致。
- 如果一个构造函数为所有参数都提供了默认实参,那么实际上也定义了默认构造函数(当然如果直接定义了 default 函数的话,那么提供实参的构造函数不是 default 函数)。
struct Cls {
int i_;
Cls() = default;
Cls(int i): i_(i) {}
};
Cls instance1; // correct
// Cls instance(); // wrong
Cls instance2(2); // correct
- 如果定义了一个拥有一个实参参数的构造函数,那么实际上定义了一个从该实参到这个类的隐式转换规则。
Cls instance3 = 3;
- 上一条提到的隐式转换规则只会执行一步转换
struct Cls2 {
Cls inner_;
Cls2(Cls inner): inner_(inner) {}
};
// 这一行试图通过两步转换
// Cls2 instance4 = 3; // wrong
// 这一行实际上发生了 3 到 Cls 类型的转换
Cls2 instance4(3); // correct
- 使用 explict 关键字阻止隐式转换的方式,需要注意的是 explict 只能对拥有一个参数的构造函数起作用,并且只能在类的内部定义。