赞
踩
- #include <iostream>
- #include <cstdlib>
- using namespace std;
- class A{
- public:
- A(){
- cout<<"A - 构造"<<endl;
- }
- ~A(){
- cout<<"A - 析构"<<endl;
- }
- };
- class B:public A{
- public:
- B(){
- cout<<"B - 构造"<<endl;
- }
- ~B(){
- cout<<"B - 析构"<<endl;
- }
- };
- class C{
- public:
- C(){
- cout<<"C - 构造"<<endl;
- }
- ~C(){
- cout<<"c - 析构"<<endl;
- }
- };
- class E{
- public:
- E(){
- cout<<"e - 构造"<<endl;
- }
- ~E(){
- cout<<"E - 析构"<<endl;
- }
- };
- class D:public E{
- public:
- D(){
- cout<< "D - 构造"<<endl;
- }
- ~D(){
- cout<< "D - 析构"<<endl;
- }
- private:
- C c;
- static B b;
- };
- B D::b;
- int main()
- {
- D d;
- cout << "Hello world!" << endl;
- return 0;
- }

运行结果如下:
分析:在一个类中,如果存在其他类的成员,先进行构造,若这个类对象是static的,静态对象是在所有其他对象之前进行构造,若这个静态对象要是继承某个父类,应先构造父类,在构造派生类,所以 A - 构造;B - 构造;e - 构造(构造自己的父类);c - 构造 ;最后才是 D - 构造;
析构的顺序与其相反 进行,静态函数最后 析构。
测试代码:不带static对象:
- #include <iostream>
- #include <cstdlib>
- using namespace std;
- class A{
- public:
- A(){
- cout<<"A - 构造"<<endl;
- }
- ~A(){
- cout<<"A - 析构"<<endl;
- }
- };
- class B:public A{
- public:
- B(){
- cout<<"B - 构造"<<endl;
- }
- ~B(){
- cout<<"B - 析构"<<endl;
- }
- };
- class C{
- public:
- C(){
- cout<<"C - 构造"<<endl;
- }
- ~C(){
- cout<<"c - 析构"<<endl;
- }
- };
- class E{
- public:
- E(){
- cout<<"e - 构造"<<endl;
- }
- ~E(){
- cout<<"E - 析构"<<endl;
- }
- };
- class D:public E{
- public:
- D(){
- cout<< "D - 构造"<<endl;
- }
- ~D(){
- cout<< "D - 析构"<<endl;
- }
- private:
- C c;
- B b;
- };
- //B D::b;
- int main()
- {
- D d;
- cout << "Hello world!" << endl;
- return 0;
- }

不带有static对象,先构造自己的父类(若存在),然后构造里面的成员,c - 构造;B - 构造(A 是父类先构造),最后是自己的构造函数 D - 构造;析构函数与其相反;
总结:析构顺序:
1 先执行函数体的析构
2 然后按照声明顺续相反的执行所有非静态对象的析构
3 执行自己的父析构
4 若有静态成员对象,则最后析构
构造顺序:
1.先构造自己的父类,若是有静态成员对象,最先构造静态成员对象的父类,然后是静态成员对象,在其次是自己父类构造
2.其他非静态成员对象的构造
3.自己的构造函数
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。