C++中构造函数、析构函数以及类成员初始化顺序详解

来源:互联网 发布:linux shell脚本减法 编辑:程序博客网 时间:2024/06/11 21:13

实验代码:

 

#include <iostream>

#include <stdlib.h>

 

using namespace std;

 

class base

{

public:

      virtual void get()=0;

      int a;

      base(inti)

      {

           a = i;

           cout<<"base:"<<i<<endl;

      }

      ~base()

      {

           cout<<"baseis destroyed : "<<a<<endl;

           getchar();

      }

};

 

class base1:publicbase

{

public:

      int a;

      void get()

      {

      }

      base1(inti):base(i)

      {

           cout<<"base1:"<<i<<endl;

           a = i;

      }

      ~base1()

      {

           cout<<"base1is destroyed : "<<a<<endl;

      }

};

 

class base2:publicbase1

{

public:

      void get()

      {

      }

      base2(inti,int j = 0):mem(4),mem2(5),base1(3)

      {

           cout<<"base2:"<<i<<endl;

      }

      ~base2()

      {

           cout<<"base2is destroyed"<<endl;

      }

 

      base1 mem;

      base1 mem2;

};

 

int main()

{

      base2 b(1);

      return 0;

}

 

 

结果:

 

 不必理会行…… 只是为了让程序不至于被关闭才出的下策

结论:

1、首先不管父类是不是虚函数,它的构造函数和析构函数都是会被调用的。

2、基类先调用父类的构造函数,再初始化类成员对象,最后才会调用基类的构造函数。(所以base2(int i,int j = 0):mem(4),mem2(5),base1(3)中的base1(3)不管放在最前面或者最后面都会先被调用)

2、构造函数的调用顺序是,从父类开始,先调用父类的构造函数,然后一层一层往外直到基类。

3、析构函数的调用顺序是,由基类向父类一层一层往里调用。

4、最后还有两点要注意:

1) 在基类中析构函数的调用优先于基类中成员对象的销毁之后会销毁基类的成员对象。(这个很好理解,因为析构函数的作用是打扫战场,如果类成员中有使用new方法创建的对象,就必须在析构函数中去将类成员delete掉,如果类成员先于析构函数被销毁,那析构函数中的delete语句不就一点用都没有了嘛)

2) 成员对象销毁之后才会调用父类的析构函数,一层一层往里调用。(实际上就是基类完全被释放之后才会释放父类)

0 0
原创粉丝点击