构造函数与析构函数的注意点

1.构造函数和析构函数里不该调用虚函数数组

虚函数的多态是经过虚表和虚指针实现。虚表和虚指针是在基类和派生类初始化时逐层完善和创建。每一个类均有本身的虚表和虚指针。因此在基类构造函数里的虚表和虚指针是不完善的,调用虚函数会产生意外的结果。函数

虚函数实现了晚绑定, 析构是从最外层(晚派生)向最里层(早派生)进行析构,若是析构函数里使用虚机制,则有可能绑定到一个比当前须要析构的派生层次更晚派生的一个层次的方法上,而这一层次,已经被析构掉了,这就会出现异常。因此C++编译器忽略析构函数中使用的虚机制。指针

2.构造函数的初始化列表最好是完整的成员变量列表,且类类型成员变量最好放在初始化列表。对象

成员变量的初始化顺序与声明次序有关,与初始化列表顺序无关。内置类型的成员变量在初始化列表里初始化和在构造函数体里初始化的效率是一致的。类类型的成员变量在初始化列表里初始化,才是真正的初始化,在构造函数体里仅仅是赋值。若在构造函数体里对类类型的成员变量赋值,实际上构造函数先是在执行初始化列表时先调用该类类型的默认构造函数进行初始化后,再在构造函数体里再次赋值。编译器

3.若类具备派生类,则析构函数最好为虚函数,不然在父类指针(实际指向子类对象)析构时将不会调用子类的析构函数。编译

4.不用父类指针来释放子类对象数组。效率

由于数组是根据实际类型的大小进行偏移。若用父类指针来释放子类对象数组则,会认为该数组为父类类型对象数组,这样就会在第二个元素释放时产生错误,由于偏移量不对。变量

相关文章
相关标签/搜索