多个类中包含子对象时(构造函数,析构函数,初始化列表顺序)
2011-11-06 13:45
246 查看
/*
此程序定义了 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;
}
此程序定义了 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++之构造函数与析构函数(二):初始化列表(const和引用成员)、拷贝构造函数
- 成员变量的初始化顺序与变量在类型中的申明顺序相同,而与它们在构造函数的初始化列表中的顺序无关
- C++多个类中构造函数与析构函数的调用顺序
- C++类构造函数初始化列表执行顺序
- C++类构造函数初始化列表顺序
- C++中类的构造函数与析构函数(成员初始化列表)
- 构造函数初始化列表执行顺序
- 构造函数初始化列表中成员列出顺序要和它们在类中声明顺序相同
- C++的6大成员函数,构造函数(初始化列表),析构函数,拷贝构造函数,运算符重载,const成员函数
- 构造函数调用顺序及初始化列表
- 类的成员变量 声明顺序 决定 初始化顺序(构造函数初始化列表不影响)
- C++类的构造函数列表成员初始化的顺序问题
- 构造函数、初始化列表的调用顺序
- C++成员变量的初始化顺序如果不使用初始化列表初始化,在构造函数内初始化时,此时与成员变量在构造函数中的位置有关。
- (总结)C++的构造函数(初始化列表,缺省/复制和带默认参数的构造函数)和析构函数详解
- C++类构造函数初始化列表和初始化顺序
- 子对象构造函数和析构函数的调用顺序
- 从零开始学C++之构造函数与析构函数(二):初始化列表(const和引用成员)、拷贝构造函数