C++编程入门(二) 互动版

构造函数

前面说过,子类不仅有继承自父类的成员,还有自己声明的成员。父类的构造函数和析构函数只是关于父类成员的初始化和释放,所以要在子类中重新定义构造函数和析构函数。子类的构造函数格式为:

子类名(总参数列表):基类名(参数列表1),基类名2(参数列表2)
{
    子类构造函数体
}

子类对象的建立过程为,编译器自动调用父类的构造函数、再调用子类的构造函数。如果子类中没有写构造函数,那么调用完父类的构造函数后,再调用自动生成的子类的构造函数。如果父类也没有构造函数,那么先后调用各自自动生成的构造函数。

析构函数

与一般类的析构函数没有什么不同,对象的释放过程于构造函数正好相反。编译器自动调用子类的析构函数、再调用父类的析构函数。

#include <iostream>
using namespace std;
class Location
{
    public:
        Location(int a,int b){x=a;y=b;cout<<"Location Constructor"<<endl;}
        void SetXY(int a,int b){x=a;y=b;}
        ~Location(){cout<<"Location Delete"<<endl;}
    private:
        int x,y;
};
class Rectangle: public Location
{
    public:
        Rectangle(int a,int b,int c,int d):Location(a,b){h=c;w=d;cout<<"Rectangle Constructor"<<endl;}
        void SetHW(int a,int b){h=a;w=b;}
        ~Rectangle(){cout<<"Rectangle Delete"<<endl;}
    private:
        int h,w;
};
void main()
{
    Rectangle r(1,2,3,4);
    r.SetHW(1,1);
}

输出结果为:

Location Constructor

Rectangle Constructor

Rectangle Delete

Location Delete

从输出结果看看构造函数和析构函数的调用顺序。