Effective C++阅读分享

条款1:视C++为一个语言联邦

除了过程、对象、模板、函数四种编程范式,还有元编程形式,其可包括在泛型编程里,即模板;STL就是元编程的一个典范

  • 可体会学习C++的方法

条款2:尽量以const/enum/inline替换#define

能不用#define就不用,为了方便调试;而用define容易掩盖错误,因为所有宏对编译器不可见

  1. 对于单纯常量,最好用const对象或者enums
  2. 对于形似函数的宏,最好用inline函数

条款3:尽可能使用const

数据意义上的const VS. 逻辑意义上的const

  • 编译器强制实施前者,我们编写程序时使用后者
  • 前者:真正数据意义上的const是很难实现的,涉及到指针,可能通过其他方式改变数据
  • 后者:核心的数据没变,就可以认为是逻辑意义上的const

PS:const对象和方法

image-20210707184228548
  • const对象:不能调用非const方法,因为非const方法内的变量可能发生改变
  • const方法
    • 内部是不能修改成员属性的
    • mutable变量:逻辑上的const,虽然变量可改变,但不是核心数据

条款4:确定对象被使用前已经先被初始化

1、手动初始化内置型对象

  • C++并不保证会初始化内置型对象

2、构造函数的赋值最好使用初始化列表

image-20210707184301293
  • 初始化列表调用的是构造函数
    • 构造函数和赋值运算符在C++中完全是两个概念
    • 构造函数主要负责对象初始化
  • 初始化列表(初值列)列出的成员顺序应该与它们在类内声明的顺序一致
    • 所见顺序即实际顺序,方便维护
    • 即使反着写,程序还是按照声明顺序初始化变量
  • 减少“跨编译单元之初始化次序”问题,以local static对象替换non-local static对象
    • 尽量跨文件初始化的依赖关系