调用派生类的构造函数之前先调用基类的构造函数,析构函数则相反。因为派生类需要用到基类的成员,所以必须先有基类,再有派生类。
C++语法规定:
如果类没有显示定义构造函数,则编译器提供一个默认构造函数(不带参数,仅创建对象,不初始化)。
如果类显示定义了构造函数,编译器一律不提供默认构造函数。即如果一个类定义了一个带参数的构造函数,还想要无参数的构造函数,则必须自己定义。
例如:
class Animal
{
public:
如果类没有显示定义构造函数,则编译器提供一个默认构造函数(不带参数,仅创建对象,不初始化)。
如果类显示定义了构造函数,编译器一律不提供默认构造函数。即如果一个类定义了一个带参数的构造函数,还想要无参数的构造函数,则必须自己定义。
class Animal
{
public:
Animal(int height,int weight){}
};
class Fish : public Animal
{
public:
Fish()
{
}
};
编译出错:error C2512: 'Animal' : no appropriate default constructor available
调用Fish的构造函数时先调用 无参的基类构造函数,而这里没有,故实例化失败。
在不给基类添加无参的构造函数的前提下,要想编译通过,需要如下定义派生类:
class Fish : public Animal
{
public:
{
public:
Fish()
{
}
};
调用Fish的构造函数时先调用 无参的基类构造函数,而这里没有,故实例化失败。
class Fish : public Animal
{
public:
Fish(): Animal(300,400) // 添加一个初始化列表{}
};
这样可以成功构造Animal对象,便能够成功够构造Fish。
另外还有一种解决办法,就是给Animal构造函数提供默认参数,为所有形参提供默认实参的构造函数就是一个默认构造函数。
必须在构造函数初始化列表中进行初始化的类型(P388):
- 没有默认构造函数的类类型成员。
- const或引用类型(这两种类型的对象可以初始化但不能对它们赋值)。
另一篇文章“继承与构造函数”用一个例子说明了类对象的初始化过程。