20200215

@ShiKaiWi

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 只能对拥有一个参数的构造函数起作用,并且只能在类的内部定义。

More