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 &,但不要返回引用。
  • 成员变量尽量为私有。
  • 和类相关的方法:成员方法、友元、以及参数为该类的普通函数,这些设计,对类资源的可见性不同。实际上,尽量使用普通函数可以减少类成员的访问入口。
  • 设计的接口应该容易被正确使用,尽量让留给clientcovererror变少,但这是性能和易用性的trade-off

Implementations

  • 和c不同,c++中延迟一个变量的声明,意义会不一样。c中的变量都会在编译期就安排在栈上。在c++中,如果这个变量是对象,那么会隐式地伴随构造、析构。所以应该尽可能延迟声明变量,避免不必要的开销。
  • Now we strive to write exception-safe code.

Effective Modern c++

Deducing Types