构造函数与析构函数问题

构造函数与析构函数问题,第1张

首先:在VC++6.0下对象的析构顺序与创建顺序是相反的;静态成员变量的实质是全局变量。在程序结束时,才会析构静态对象。

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!。值得注意的是,真正实用的析构函数一般是不含有输出信息的。

在本程序中,成员函数是在类中定义的,如果成员函数的数目很多以及函数的长度很长,类的声明就会占很大的篇幅,不利于阅读程序。

而且为了隐藏实现,一般是有必要将类的声明和实现(具体方法代码)分开编写的,这也是一个良好的编程习惯。即可以在类的外面定义成员函数,而在类中只用函数的原型作声明。

参考资料来源:百度百科-析构函数


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8044899.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存