【读书笔记】《More Effective C++》- 基础议题

292 阅读2分钟

《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, 则会导致部分字段无意义,反而造成软件质量下降。