《More Effective C++》读书笔记
基础议题
条款1 : 仔细区别pointer和references
理解:指针和引用有相似的地方,都可以间接参考操作其他对象,但因二者存在区别,而这区别也是使用指针还是引用时的重要依据。详细展开来说如下:
- 引用必须初始化,并且总是指向最初赋值的那个对象,不能改变。
这一点引用限制比指针多,指针可赋值为null,可改变指向,更加灵活。除非程序中指向性不变(合适引用),否则指针的灵活性更高,更加适合。 - 另外一种书中提到实现某些操作符,特别地必须返回某种能够被当作assignment赋值对象地东西,以
[]为例,该种情况下使用引用。
个人理解该种情况区分度较高,若是[]返回值为指针类型,则会出现如下情况vector<int> num(10); // [] 返回值类型为引用,目前stl实现 num[0] = 1; // [] 返回值类型为指针, 会造成这是个指针vector的误解 *num[0] = 1;
条款2 : 最好使用C++转型操作符
理解:编程中尽量不要使用类型转换,计算使用,也不用C格式的类型转换,即:(type) expression
C++提供了四个新型转型操作符,使用方法为xxx_cast<type>(expression):
static_cast: 与C格式的类型转换符作用基本一致const_cast: 改变常量性和变易性,最常见用途是将某个对象的常量性去除掉。(即移除const属性)dynamic_cast: 继承体系中安全的向下转型或跨系转型动作,即将指向基类的指针或者引用转换成指向派生类的指针或者对象。reinterpret_cast: 用来转换函数指针类型,与编译平台强相关,尽量不用。
条款3 : 绝对不要以多态的方式处理数组
理解: 数组对象几乎总是会涉及指针的算术运算,而多态和指针算术不能混用。
条款4 : 非必要不提供default constructor
理解: 某些类初始化需要提供参数,若为了使用类便利提供了default constructor, 则会导致部分字段无意义,反而造成软件质量下降。