1.首先,构造全局对象:
A a3("GlobalObject")
static A a4("ExternStaticObject")
输出:Constructor called.GlobalObject
Constructor called.ExternStaticObject
2.进入main函数,构造对象:A a5("MainObject")
输出:Constructor called.MainObject
3.cout<<"In main(),before calling fun().\n"
4.进入fun()函数,构造对象:
A a1("FunObject")
static A a2("StaticObject")
输出:Constructor called.FunObject
Constructor called.StaticObject
5.cout<<"In fun().\n"
6.fun()函数生命结束,调用析构函数 析构a1:
输出:Destructor called.FunObject
7.cout<<"In main(),after calling fun().\n"
8.main函数生命结束,调用析构函数 析构a5
输出:Destructor called.MainObject
9.整个程序结束,析构全部全局对象,析构顺序为构造的逆顺序:
输出:Destructor called.StaticObject
Destructor called.ExternStaticObject
Destructor called.GlobalObject
运行结果如下:构造A
构造B
构造A
析构B
析构A
解释:
1、构造A
2、构造B
3、构造A
4、析构B
5、析构A
1、构造派生类对象B中内嵌的继承来的对象A(派生类先构造基类再构造自己成员)
2、构造派生类对象B中自己的成员
这两步是B obj的结果
3、构造A ,这是A *p = new A的结果
4、析构B
5、析构A
这2步是析构obj对象退出main函数时的析构结果,先析构自己,再析构内嵌的A
那个p指向的A对象没有释放,实际上叫做内存泄漏
继承关系的构造函数和析构函数的执行顺序为:
1、父类构造函数执行。
2、子类构造函数执行。
3、子类析构函数执行。
4、父类析构函数执行。
组合关系的构造函数和析构函数执行顺序为:
1、执行类成员对象的构造函数。
2、执行类自己的构造函数。
3、执行类自己的析构函数。
4、执行类成员的析构函数。
container有两个成员,one,two,所以在执行这个container构造函数之前执行object类的构造函数两次。
扩展资料:
把类的声明放在main函数之前,它的作用域是全局的。这样做可以使main函数更简练一些。在main函数中定义了两个对象并且给出了初值,然后输出两个学生的数据。
当主函数结束时调用析构函数,输出stud has been destructe!。值得注意的是,真正实用的析构函数一般是不含有输出信息的。
在本程序中,成员函数是在类中定义的,如果成员函数的数目很多以及函数的长度很长,类的声明就会占很大的篇幅,不利于阅读程序。
而且为了隐藏实现,一般是有必要将类的声明和实现(具体方法代码)分开编写的,这也是一个良好的编程习惯。即可以在类的外面定义成员函数,而在类中只用函数的原型作声明。
参考资料来源:百度百科-析构函数
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)