构造函数和析构函数调用的顺序

#include<iostream>usingnamespacestd;classTest{private:intx;public:Test(){cout<<"构造函数被... #include <iostream>
using namespace std;
class Test
{
private:
int x;
public:
Test( )
{
cout<<"构造函数被执行"<<endl;
x=0;
}
~Test( )
{
cout<<"析构函数被执行"<<endl;
}
void print( )
{
cout<<"x="<<x<<endl;
}
};
void main()
{
Test obj1,obj2;
obj1.print();
obj2.print();
}
//构造函数被执行
//构造函数被执行
//x=0
//x=0
//析构函数被执行
//析构函数被执行
这个结果的顺序可以解释下吗?
展开
 我来答
动植物世界
高粉答主

2020-01-02 · 原创动物解说创作者(原创、原创、原创) 每天都趴网看各位的评...
动植物世界
采纳数:235 获赞数:371932

向TA提问 私信TA
展开全部

继承关系的构造函数和析构函数的执行顺序为:

1、父类构造函数执行。

2、子类构造函数执行。

3、子类析构函数执行。

4、父类析构函数执行。

组合关系的构造函数和析构函数执行顺序为:

1、执行类成员对象的构造函数。

2、执行类自己的构造函数。

3、执行类自己的析构函数。

4、执行类成员的析构函数。

container有两个成员,one,two,所以在执行这个container构造函数之前执行object类的构造函数两次。

扩展资料:

把类的声明放在main函数之前,它的作用域是全局的。这样做可以使main函数更简练一些。在main函数中定义了两个对象并且给出了初值,然后输出两个学生的数据。

主函数结束时调用析构函数,输出stud has been destructe!。值得注意的是,真正实用的析构函数一般是不含有输出信息的。

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

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

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



以筠
推荐于2017-09-13 · 知道合伙人数码行家
以筠
知道合伙人数码行家
采纳数:137 获赞数:11075
学生

向TA提问 私信TA
展开全部
在使用构造函数和析构函数时,需要特别注意对它们的调用时间和调用顺序。在一般情况下,调用析构函数的次序正好与调用构造函数的次序相反:最先被调用的构造函数,其对应的(同一对象中的)析构函数最后被调用,而最后被调用的构造函数,其对应的析构函数最先被调用。
可以简记为:先构造的后析构,后构造的先析构,它相当于一个栈,先进后出。

下面归纳一下什么时候调用构造函数和析构函数:
1) 在全局范围中定义的对象(即在所有函数之外定义的对象),它的构造函数在文件中的所有函数(包括main函数)执行之前调用。但如果一个程序中有多个文件,而不同的文件中都定义了全局对象,则这些对象的构造函数的执行顺序是不确定的。当main函数执行完毕或调用exit函数时(此时程序终止),调用析构函数。

2) 如果定义的是局部自动对象(例如在函数中定义对象),则在建立对象时调用其构造函数。如果函数被多次调用,则在每次建立对象时都要调用构造函数。在函数调用结束、对象释放时先调用析构函数。

3) 如果在函数中定义静态(static )局部对象,则只在程序第一次调用此函数建立对象时调用构造函数一次,在调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用析构函数。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wanfustudio
推荐于2017-09-14 · TA获得超过1万个赞
知道大有可为答主
回答量:5513
采纳率:100%
帮助的人:3744万
展开全部
Test obj1,obj2;//当你定义两个对象时候,自动调用构造函数,也就是你看到的,有两个构造函数的打印
obj1.print();//不解释了
obj2.print();//不解释了
//当该定义的对象的作用域过去(生命周期)结束,系统自动调用析构函数进行释放
因此obj1,obj2在main结束时候又被释放掉了
追问
那为什么不是
构造函数被执行
x=0

构造函数被执行
x=0
析构函数被执行
析构函数被执行
追答
很好理解啊,因为程序是按顺序执行
先声明了两个对象
Test obj1,obj2;
两个变量创建的时候,构造函数就已经被调用了
还没到打印那个位置

析构函数也是一样,程序都执行结束了,它是函数返回前最后被执行的
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式