基类的构造函数和析构函数不能被派生类继承。
基类的构造函数不能被派生类继承,派生类中需要声明自己的构造函数。在设计派生类的构造函数时,不仅需要考虑派生类增加的数据成员的初始化,也要考虑基类的数据成员的初始化。声明构造函数时,只需要对本类中新增成员进行初始化,对继承而来的基类成员的初始化,需要调用基类的构造函数完成。
基类的析构函数不能被派生类继承,派生类需要自行声明自己的析构函数。声明方法与一般的析构函数不同,不需要调用基类的析构函数,系统会自动隐式调用。析构函数的调用次序和构造函数相反。
类的成员变量的初始化顺序只与变量在类中的声明顺序有关,与在构造函数中的初始化列表的顺序无关。
成员变量的初始化次序跟变量在内存中的次序有关,而内存中的排列顺序早在编译期就根据变量的定义次序决定啦。
从全局看,变量的初始化顺序如下:
1)基类的静态变量或全局变量。
2)派生类的静态变量或全局变量。
3)基类的成员变量。
4)派生类的成员变量。
构造函数没有返回值,如何得知对象是否构造成功
因为构造函数没有返回值,所以通知对象的构造失败的唯一方法就是在构造函数中抛出异常。构造函数中抛出异常将导致对象的析构函数不被执行,当对象发生部分构造时,已经构造完毕的子对象将会逆序地被析构。
构造函数与析构函数的区别
构造函数有以下特点:
1.构造函数的名字必须与类名相同;
2.构造函数可以有任意类型的参数,但不能具有返回类型;
3.定义对象时,编译系统会自动地调用构造函数;
4.构造函数是特殊的成员函数,函数体可以在类体内,也可写在类体外;
5.构造函数被声明为公有函数,但它不能像其他成员函数那样被显式调用,它是在定义对象的同时被调用的。
析构函数有以下特点:
1.析构函数的名字必须与类名相同,但它前面必须加一个波浪号 ~ ;
2.析构函数没有参数,也没有返回值,而且不能被重载,因此在一个类中只能有一个析构函数;
3.当撤销对象时,编译系统会自动地调用析构函数。