含对象成员类的构造顺序

来源:互联网 发布:sx2150k基本数据 编辑:程序博客网 时间:2024/04/30 13:43

源程序:

#include <iostream>

using namespace std;

class A
{
private:
 int m;
public:
 A(){ cout<<"In A's constructor..."<<endl;}
 ~A(){ cout<<"In A's destructor..."<<endl;}
};
class B
{
private:
 A a;
 int n;
public:
 B(){cout<<"In B's constructor..."<<endl;}
 ~B(){cout<<"In B's destructor..."<<endl;}
};
class C
{
private:
 B b;
 A a;
 int p;
public:
 C():a(),b(){cout<<"In C's constructor..."<<endl;}
 ~C(){cout<<"In C's destructor..."<<endl;}
};

void main()

{

C c;

cout<<"back in main..."<<endl;
}

1、当主函数运行时,遇到要创建C类的对象,于是调用其构造函数C(),该构造函数启动时,首先分配对象空间(包含一个A对象、一个B对象和一个int型数据),然后根据在类中声明的对象成员的次序依次调用其其构造函数(而不是根据它们在成员初始化列表中的说明次序进行调用)。这里先调用B对象的构造函数(B类中包含A类的对象成员,所以也需要先调用A类的构造函数),再调用A类的构造函数,最后调用C类的构造函数。析构函数的调用次序是:先调用本身类的析构函数,再调用成员对象类的析构函数。如果有多个成员对象,则成员对象析构函数的调用次序与它们的构造函数的调用次序正好相反。
2、与变量定义类似,在用默认构造函数创建对象时,如果创建的对象时全局的或者时静态的,则对象的位模式全为0,否则对象值时随机的。

输出:

   In A's constructor...
   In B's constructor...
   In A's constructor...
   In C's constructor...
   back in main...
   In C's destructor...
   In A's destructor...
   In B's destructor...
   In A's destructor...

原创粉丝点击