如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。
构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。
如果声明了任何非默认构造函数,编译器不会提供默认构造函数。
父类没有声明构造函数
父类会由编译器生成默认构造函数,子类先调用父类默认的构造函数,再调用自己的构造函数。
父类只声明了无参构造函数
如果子类的构造函数没有显式地调用父类的构造函数,则将会隐式调用父类的无参构造函数。
父类只声明了带参构造函数
如果父类只有有参数的构造方法,则子类必须显示调用此带参构造方法。
父类同时声明了无参和带参构造函数
子类只需要实现父类的一个构造函数即可,不管是无参的还是带参的构造函数。如果子类的构造函数没有显示地调用父类的构造函数,则默认调用父类的无参构造函数。
#include <iostream.h>
class animal
{
public:
animal(int height, int weight)
{
cout<<"animal construct"<<endl;
}
…
};
class fish:public animal
{
public:
fish():animal(400,300)
{
cout<<"fish construct"<<endl;
}
…
};
void main()
{
fish fh;
}
补充:构造函数和析构函数的顺序
当在基类的构造函数中申请了资源的时候,派生类继承了基类,也就基础了基类的构造函数。所以析构的时候也要调用基类的析构函数。构造和析构的顺序是相反的。构造时,基类先构造,然后再派生类。析构时则反过来。先调用派生类的析构,再调用基类的析构。这符合资源栈的操作。先进后出,先申请的资源后释放