测试环境:ubuntu18.04 gcc-7.5.0
1.1 const 修饰的普通成员变量
两种显式初始化方式:
- 构造函数初始化列表
- 在声明处直接提供初始值
如果两种初始化方式都没有提供,代码将无法编译通过;
特别注意,当没有在声明处显式初始化时,存在两种编译错误情况:
- 提供了构造函数,但没有对const成员变量进行初始化,编译器直接提示“必须初始化”(错误比较直观);
- 没有提供构造函数,一般情况下,如果类中不存在未初始化的const成员,普通成员的初始化工作将由编译器自动生成的默认构造来完成;但编译器在生成默认构造前,检测到存在未初始化的const成员,将不再生成默认构造。所以,在业务代码中使用默认构造时将发现编译器报了一个较隐蔽的错误:“无法引用 “…” 的默认构造函数 – 它是已删除的函数”
1.2 引用类型的成员变量
初始化规则与常量成员类似;
1.3 总结
此类较隐蔽的错误,其实也可以将其归纳为编程习惯(规范)这一类,即不纠结于“普通类型”、“常量”、“静态类型”之间初始化方式的差异(除非是专门研究类型初始化机制),而是养成对所有类型的变量都进行初始化的习惯。