1.构造函数和析构函数里不应调用虚函数
虚函数的多态是通过虚表和虚指针实现。虚表和虚指针是在基类和派生类初始化时逐层完善和建立。每个对象均有自己的虚表和虚指针。所以在基类构造函数里的虚表和虚指针是不完善的,调用虚函数会产生意外的结果。
虚函数实现了晚绑定, 析构是从最外层(晚派生)向最里层(早派生)进行析构,如果析构函数里使用虚机制,则有可能绑定到一个比当前需要析构的派生层次更晚派生的一个层次的方法上,而这一层次,已经被析构掉了,这就会出现异常。所以C++编译器忽略析构函数中使用的虚机制。
2.构造函数的初始化列表最好是完整的成员变量列表,且类类型成员变量最好放在初始化列表。
成员变量的初始化顺序与声明次序有关,与初始化列表顺序无关。内置类型的成员变量在初始化列表里初始化和在构造函数体里初始化的效率是一致的。类类型的成员变量在初始化列表里初始化,才是真正的初始化,在构造函数体里仅仅是赋值。若在构造函数体里对类类型的成员变量赋值,实际上构造函数先是在执行初始化列表时先调用该类类型的默认构造函数进行初始化后,再在构造函数体里再次赋值。
3.若类具有派生类,则析构函数最好为虚函数,否则在父类指针(实际指向子类对象)析构时将不会调用子类的析构函数。
4.不用父类指针来释放子类对象数组。
因为数组是根据实际类型的大小进行偏移。若用父类指针来释放子类对象数组则,会认为该数组为父类类型对象数组,这样就会在第二个元素释放时产生错误,因为偏移量不对。
时间: 2024-10-12 11:46:14