CPP进阶学习。
Effective C++
实际上这本书每一条守则后都有小总结,不需要再额外重复了,所以这里仅仅记录我个人一些理解和看法。
Accustoming Yourself to C++
- 放弃使用宏,编译报错不明显,没有命名空间,运算顺序容易变化。
- non-local static objects的初始化顺序不固定,相互引用会出问题,改为一个全局函数,返回一个local static object。
Constructors, Destructors, and Assignment Operators
- C++为每个类都会编译 Default Constructor, Copy Constructor, Destructor, Assignment Operator.
- 在大多时候是为了方便,但也有很多时候,默认的函数不满足需求。
- 如果类会被继承,那么析构函数应该为虚函数,不然就用final限制继承。
Resource Management
- 智能指针。
- RAII的思想,能够更好地编写资源安全(容忍异常)的代码,实现上并不特别,只是代码会清晰可读,而且安全性好。
Designs and Declarations
- explicit主要是用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换。单个参数默认开启隐式转换,多个参数默认不开启隐式转换。
- 一个类就是一种类型,而编排类型是一件非常巧妙的事情。
- 传递参数尽量考虑const &,但不要返回引用。
- 成员变量尽量为私有。
- 和类相关的方法:成员方法、友元、以及参数为该类的普通函数,这些设计,对类资源的可见性不同。实际上,尽量使用普通函数可以减少类成员的访问入口。
- 设计的接口应该容易被正确使用,尽量让留给
client
去cover
的error
变少,但这是性能和易用性的trade-off
。
Implementations
- 和c不同,c++中延迟一个变量的声明,意义会不一样。c中的变量都会在编译期就安排在栈上。在c++中,如果这个变量是对象,那么会隐式地伴随构造、析构。所以应该尽可能延迟声明变量,避免不必要的开销。
- Now we strive to write exception-safe code.