多个类中包含子对象时(构造函数,析构函数,初始化列表顺序)
来源:互联网 发布:黑客书籍 知乎 编辑:程序博客网 时间:2024/06/05 10:16
/*
此程序定义了 A,B,Sample 三个类.
主函数main()定义一个类的对象s.因为Sample类中包含了类A和类B的子对象a与b,所以构造函数的调用顺序是先调用子对象的构造函数.
( 按照它们在类定义时出现的顺序,而不是按照构造列表中出现的顺序. ) 所以先调用a的构造函数,在调用b的构造函数.
于是打印出:
A Constructor
B Constructor
紧接着打印出,Sample类的构造函数.
Sample Constructor
调用了Sample类的构造函数后,程序接着往下走,走完了,于是再调用析构函数.所以打印出.
Sample Destructor
(这里可能我有些不懂,为什么先输出了(前面后调用的类B构造函数),先打印出B的析构函数)
(我想可能是不是因为 内存中存储在 "栈" 中的 " 先进后出","后进先出" 的原则呢).
如果是按这个原理的话:
最先初始化调用存储的A,和最后初始化存储调用的B.
后进先出,于是 先打印出 B 的析构函数.
B Destructor
然后调用A的析构函数,
A Destructor
最后程序结束.
( 程序大致走向:
首先构造Sample 对象s --------- 因为类中包含子类对象(先调用子对象构造函数) (按照类定义子类对象的顺序) -----------(先调用 A构造 然后B构造)
-------------- 回到Sample对象s 的构造 ---------------- Sample s对象构造完后,因为程序走完,析构,,----------------- 可能是存贮在 "栈" (先进后出,后进先出原则)
------------ 所以a是最先构造---------b后构造-----------s构造-----------s析构---------b析构--------a析构. (程序运行结束).
)
请注意:程序中内存运行的走向原则,完全个人理解,因为是初学有很多不懂,只是把自己的"认为"写出来,如果有不对的地方,还望请多多指正!!
完整打印结果:
A Constructor
B Constructor
Sample Constructor
Sample Destructor
B Destructor
A Destructor
*/
#include <iostream.h>
class A
{
public:
/* A()
{
cout<<"A default"<<endl;
}*/
A(int i)
{
cout<<"A Constructor"<<endl;
}
~A()
{
cout<<"A Destructor"<<endl;
}
};
class B
{
public:
/* B()
{
cout<<"B default"<<endl;
}*/
B(int i)
{
cout<<"B Constructor"<<endl;
}
~B()
{
cout<<"B Destructor"<<endl;
}
};
class Sample
{
public:
Sample():b(11),a(11) //这里是初始化列表
{
cout<<"Sample Constructor"<<endl;
}
~Sample()
{
cout<<"Sample Destructore"<<endl;
}
private: //这里是定义的子类对象
A a;
B b;
};
void main()
{
Sample s;
}
- 多个类中包含子对象时(构造函数,析构函数,初始化列表顺序)
- 构造函数初始化列表顺序
- 构造函数、初始化列表的调用顺序
- C++类构造函数初始化列表顺序
- 构造函数初始化列表执行顺序
- c++ 构造函数初始化列表,构造函数的调用顺序
- 构造函数的对象初始化列表
- c++对象、构造函数和初始化列表
- 九、构造函数和析构函数(三) 初始化列表、对象成员初始化、const,引用成员初始化
- 构造函数的初始化顺序 与 初始化列表。
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- C#如何在Form中嵌入并且操作Excel表格
- Linq To DataSet
- poj-3615——floyd
- Visual C#.Net-Socket篇
- Visual C#.Net-TCP篇
- 多个类中包含子对象时(构造函数,析构函数,初始化列表顺序)
- explicit解释
- 旗语(SEM)同步
- Visual C#TCP协议编程
- CSS基础
- 如何快速创建一个AJAX的"加载"的图片效果
- HTML基础
- Visual Studio 调试小技巧(2)-从查看窗口得到更多信息
- 网页 视频 播放器