基础议题
1. 区分指针和引用
- 不存在空引用(Null referewnce),一个引用必须代表着某个对象。
- 如果一个变量其目的是代表某个变量,但是其也有可能不指向任何对象,则用指针。
- 如果一个变量总是代表一个对象,则用指针
- 指针可以重新赋值,但是引用总是指向最开始获得的那个对象。
- 指针可以用来代表另一个对象,可以实现不同时刻指向不同的对象
- 引用总是会代表某个对象,一旦代表便不再改变
2.最好使用C++转型操作符
- static_cast<>() 与C旧式转换的威力和意义相同。不能移除变量的常量性。
- const_cast<>() 用来改变变量的常量性(const)或易变性(volatile)。
- dynamic_cast<>() 用于执行继承体系中,父类的指针(或引用)向子类对象的指针(或引用)的转换。其无法应用于缺乏虚函数的的类型上 也不可以改变常量性。
- reinterpret_cast<>() 与编译平台相关,不具备移植性 常用于函数指针的转换,应避免使用该转换。
3.绝对不要以多态的形式处理数组
- 数组下标操作的原理
int arr[10];
//代表*(arr+i);针对指针的加i的长度与数组所代表的元素类型相关
//本例中加i的实际长度为i*sizeof(int)
arr[i]]
- 父类子类对象的实际长度必定是不同,否则便失去了继承的意义。所以对父类对象和子类对象分别施加sizeof计算,长度必定不同。则应用于多态形式的数组通过下表索引时,计算的位置必定不对,出现的未定义值。
总之:多态和指针算数不要混用,或者一个具体类不要继承自另一个具体类
4.非必要不提供默认构造函数
- 凡是可以合理的从无到有生成对象的类,都应该内涵默认构造函数;而必须有某些外来信息才能生成对象的类,则不必拥有默认构造函数。
- 当类不存在默认构造函数时,便无法定义该类的对象数组,因为无法为类的对象指定构造函数的默认值;类的指针数组是可以定义的,指针数组无需调用构造函数。
- 当不存在默认构造函数的类,不适用于部分模板容器类,对于这些模板来讲,被实例化的目标类型需要默认构造函数。
- 无默认构造函数的虚基类,那么虚基类的自编量必须由其子类来提供,即使有N多层。