构造函数和析构函数调用的顺序
#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
//析构函数被执行
//析构函数被执行
这个结果的顺序可以解释下吗? 展开
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
//析构函数被执行
//析构函数被执行
这个结果的顺序可以解释下吗? 展开
3个回答
展开全部
继承关系的构造函数和析构函数的执行顺序为:
1、父类构造函数执行。
2、子类构造函数执行。
3、子类析构函数执行。
4、父类析构函数执行。
组合关系的构造函数和析构函数执行顺序为:
1、执行类成员对象的构造函数。
2、执行类自己的构造函数。
3、执行类自己的析构函数。
4、执行类成员的析构函数。
container有两个成员,one,two,所以在执行这个container构造函数之前执行object类的构造函数两次。
扩展资料:
把类的声明放在main函数之前,它的作用域是全局的。这样做可以使main函数更简练一些。在main函数中定义了两个对象并且给出了初值,然后输出两个学生的数据。
当主函数结束时调用析构函数,输出stud has been destructe!。值得注意的是,真正实用的析构函数一般是不含有输出信息的。
在本程序中,成员函数是在类中定义的,如果成员函数的数目很多以及函数的长度很长,类的声明就会占很大的篇幅,不利于阅读程序。
而且为了隐藏实现,一般是有必要将类的声明和实现(具体方法代码)分开编写的,这也是一个良好的编程习惯。即可以在类的外面定义成员函数,而在类中只用函数的原型作声明。
参考资料来源:百度百科-析构函数
展开全部
在使用构造函数和析构函数时,需要特别注意对它们的调用时间和调用顺序。在一般情况下,调用析构函数的次序正好与调用构造函数的次序相反:最先被调用的构造函数,其对应的(同一对象中的)析构函数最后被调用,而最后被调用的构造函数,其对应的析构函数最先被调用。
可以简记为:先构造的后析构,后构造的先析构,它相当于一个栈,先进后出。
下面归纳一下什么时候调用构造函数和析构函数:
1) 在全局范围中定义的对象(即在所有函数之外定义的对象),它的构造函数在文件中的所有函数(包括main函数)执行之前调用。但如果一个程序中有多个文件,而不同的文件中都定义了全局对象,则这些对象的构造函数的执行顺序是不确定的。当main函数执行完毕或调用exit函数时(此时程序终止),调用析构函数。
2) 如果定义的是局部自动对象(例如在函数中定义对象),则在建立对象时调用其构造函数。如果函数被多次调用,则在每次建立对象时都要调用构造函数。在函数调用结束、对象释放时先调用析构函数。
3) 如果在函数中定义静态(static )局部对象,则只在程序第一次调用此函数建立对象时调用构造函数一次,在调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用析构函数。
可以简记为:先构造的后析构,后构造的先析构,它相当于一个栈,先进后出。
下面归纳一下什么时候调用构造函数和析构函数:
1) 在全局范围中定义的对象(即在所有函数之外定义的对象),它的构造函数在文件中的所有函数(包括main函数)执行之前调用。但如果一个程序中有多个文件,而不同的文件中都定义了全局对象,则这些对象的构造函数的执行顺序是不确定的。当main函数执行完毕或调用exit函数时(此时程序终止),调用析构函数。
2) 如果定义的是局部自动对象(例如在函数中定义对象),则在建立对象时调用其构造函数。如果函数被多次调用,则在每次建立对象时都要调用构造函数。在函数调用结束、对象释放时先调用析构函数。
3) 如果在函数中定义静态(static )局部对象,则只在程序第一次调用此函数建立对象时调用构造函数一次,在调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用析构函数。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Test obj1,obj2;//当你定义两个对象时候,自动调用构造函数,也就是你看到的,有两个构造函数的打印
obj1.print();//不解释了
obj2.print();//不解释了
//当该定义的对象的作用域过去(生命周期)结束,系统自动调用析构函数进行释放
因此obj1,obj2在main结束时候又被释放掉了
obj1.print();//不解释了
obj2.print();//不解释了
//当该定义的对象的作用域过去(生命周期)结束,系统自动调用析构函数进行释放
因此obj1,obj2在main结束时候又被释放掉了
追问
那为什么不是
构造函数被执行
x=0
构造函数被执行
x=0
析构函数被执行
析构函数被执行
追答
很好理解啊,因为程序是按顺序执行
先声明了两个对象
Test obj1,obj2;
两个变量创建的时候,构造函数就已经被调用了
还没到打印那个位置
析构函数也是一样,程序都执行结束了,它是函数返回前最后被执行的
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询