C++ 派生类构造函数和析构函数

几个问题

一个类的各数据成员的构造顺序?

按他们在类定义中出现的先后顺序:先定义者先构造。

类的对象成员的构造函数与类自身的构造函数的执行顺序?

先执行对象成员的构造函数,再执行类自身的构造函数。

构造顺序与析构顺序的关系?
二者顺序相反:先构造者,后析构。

构造函数和析构函数用来创建和释放该类的对象,当这个类是派生类时,其对象的创建和释放应与其基类对象及成员对象相联系。
在声明派生类时,一般还应当自己定义派生类的构造函数和析构函数,因为构造函数和析构函数是不能从基类继承的

派生类对象的创建和初始化与基类对象的创建和初始化有关。即构造派生类对象时,要对其基类数据成员、所含对象成员的数据成员以及其他的新增数据成员一起进行初始化。这种初始化工作是由派生类的构造函数来完成的。
派生类成员包括两部分:
(1)从基类继承的成员
(2)自身定义的成员

在派生类中,构造基类数据成员的可能方式:

方式一,在派生类中直接对基类型数据成员初始化:

class BC
{
public:
    BC( )
    {
        x = y = -1;
    }
private:
    int x, y;
};
class DC : public BC
{
public:
    DC( )
    {
        x = y = -1;//错误,不能构造基类的私有成员  error C2248: “B::x”: 无法访问 private 成员(在“B”类中声明)
    }
private:
    string  S;
};

方式二,显示调用基类构造函数

class BC
{
public:
    BC( )
    {
        x = y = -1;
    }
private:
    int x, y;
};
class DC : public BC
{
public:
    DC( )
    {
        BC( );//这是构造后才调用,语义错误
    }
private:
    string  S;
};

这样的程序可以编译通过,但语意错误,这是派生类先构造后,在调用基类的构成函数。

正确构成基类数据成员的方式为:

class BC
{
public:
    BC( )
    {
        x = y = -1;
    }
private:
    int x, y;
};
class DC : public BC
{
public:
    DC( ) : BC( ), S("派生类"), { }//初始化列表
private:
    string  S;
};

在创建派生类的对象时,需要调用基类的构造函数:初始化派生类对象从基类继承的成员。在执行一个派生类的构造函数之前,总是先执行基类的构造函数。

猜你喜欢

转载自www.cnblogs.com/wkfvawl/p/10738409.html