面试问题摘录(一)c++类对象的初始化顺序

c++类对象的初始化顺序,有多重继承的初始化顺序

#include <iostream>
using namespace std;

class A
{
      public:
            A(){ cout<<"A"<<endl;}
            virtual ~A(){ cout<<"~A"<<endl; }
};

class B: public A
{
      public:
             B(){ cout<<"B"<<endl;}
             ~B() {cout<<"~B"<<endl; }
      private:
              A a;
};

class C: public A, public B     //类在派生表中的继承列表
{
      public:
              C() {cout<<"C"<<endl;}
              ~C() {cout<<"~C"<<endl; }
      private:

      public:
             A a;
             B b;
};

int main()
{
    C * p = new C;
    delete p;

    return 0;
}

初始化优先级

父类构造函数–>成员类对象构造函数–>自身构造函数

其中成员变量的初始化与声明顺序有关:这句话是指C类中的成员变量A a和B b 顺序不一样,输出的结果也会不一样。

构造函数的调用顺序是类派生列表中的顺序:这句话是指C类的继承public A和publicB调换顺序,输出结果也会不一样。

输出结果:

A               //   A类的构造函数体

A               //   调用父类A的构造函数体

A               //   当B类调用构造函数体时,先对B类中的数据成员  A   a初始化

B               //   B类构造函数体

A               //    C类成员变量  A   a初始化

A               //    C类成员变量  B   b初始化

A

B

C               // C类的构造函数体

析构相反我就不写了。 

构造函数的作用就是对对象进行初始化,构造函数=(如果存在继承先调用基类的构造函数)+(然后对成员变量初始化)+(构造函数函数体)就连这句话的解释也是嵌套的,有点像递归。

也就是说    A是A类的构造函数,AAB是B类的构造函数,AAABAAABC是C类的构造函数。

反正是存在嵌套关系的很抽象难以理解,用上面的代码自己试一试,才容易理解。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值