more effective C++ 读书笔记 基础议题

95 阅读2分钟

基础议题

1. 区分指针和引用

  1. 不存在空引用(Null referewnce),一个引用必须代表着某个对象。
    • 如果一个变量其目的是代表某个变量,但是其也有可能不指向任何对象,则用指针。
    • 如果一个变量总是代表一个对象,则用指针
  2. 指针可以重新赋值,但是引用总是指向最开始获得的那个对象。
    • 指针可以用来代表另一个对象,可以实现不同时刻指向不同的对象
    • 引用总是会代表某个对象,一旦代表便不再改变

2.最好使用C++转型操作符

  1. static_cast<>() 与C旧式转换的威力和意义相同。不能移除变量的常量性。
  2. const_cast<>() 用来改变变量的常量性(const)或易变性(volatile)。
  3. dynamic_cast<>() 用于执行继承体系中,父类的指针(或引用)向子类对象的指针(或引用)的转换。其无法应用于缺乏虚函数的的类型上 也不可以改变常量性。
  4. reinterpret_cast<>() 与编译平台相关,不具备移植性 常用于函数指针的转换,应避免使用该转换。

3.绝对不要以多态的形式处理数组

  1. 数组下标操作的原理
int arr[10];
//代表*(arr+i);针对指针的加i的长度与数组所代表的元素类型相关
//本例中加i的实际长度为i*sizeof(int)
arr[i]]
  1. 父类子类对象的实际长度必定是不同,否则便失去了继承的意义。所以对父类对象和子类对象分别施加sizeof计算,长度必定不同。则应用于多态形式的数组通过下表索引时,计算的位置必定不对,出现的未定义值。

多态方式处理数组的示例代码

总之:多态和指针算数不要混用,或者一个具体类不要继承自另一个具体类

4.非必要不提供默认构造函数

  1. 凡是可以合理的从无到有生成对象的类,都应该内涵默认构造函数;而必须有某些外来信息才能生成对象的类,则不必拥有默认构造函数。
  2. 当类不存在默认构造函数时,便无法定义该类的对象数组,因为无法为类的对象指定构造函数的默认值;类的指针数组是可以定义的,指针数组无需调用构造函数。
  3. 当不存在默认构造函数的类,不适用于部分模板容器类,对于这些模板来讲,被实例化的目标类型需要默认构造函数。
  4. 无默认构造函数的虚基类,那么虚基类的自编量必须由其子类来提供,即使有N多层。