关于全局函数及静态析构函数和静态析构函数的问题
class CDemo{
public:
CDemo(){m_nVal=0;}
CDemo(int nVal){m_nVal=nVal;}
~CDemo(){cout<<"Destructor:"<<m_nVal<<endl;}
private:
int m_nVal;
};
CDemo d0;
CDemo d1(1);
void main()
{
CDemo d2(2);
static CDemo d3(3);
static CDemo d4(4);
CDemo d5(5);
}
大侠们可否对编译结果给个解答。
问题点数:30、回复次数:5Top
1 楼mccxj(老鼠不逛街)回复于 2005-06-01 10:25:25 得分 0
忘记加了#include<iostream.h>了。。
Destructor:5
Destructor:2
Destructor:4
Destructor:3
Destructor:1
Destructor:0
Press any key to continue
这是结果。。先等等。。待会给你说。。Top
2 楼mccxj(老鼠不逛街)回复于 2005-06-01 10:33:03 得分 20
首先,构造函数的调用顺序和析构函数的调用顺序刚刚好相反。
CDemo d0;
CDemo d1(1);//这两个是全局的。。因此最先调用构造函数
void main()
{
CDemo d2(2);
static CDemo d3(3);
static CDemo d4(4);//静态成员在进入主函数main的时候就分配了内存。。因此也调用了。
CDemo d5(5);//d2和d5不是全局的也不是静态的。。所以就最后了。。
}
因此构造函数调用的是0,1,3,4,2,5
析构函数就是5,2,4,3,1,0。。
Top
3 楼tans75(品味人生)回复于 2005-06-01 10:35:59 得分 0
#include<iostream>
using namespace std;
class CDemo{
public:
CDemo(){m_nVal=0;}
CDemo(int nVal){m_nVal=nVal;}
~CDemo(){cout<<"Destructor:"<<m_nVal<<endl;}
private:
int m_nVal;
};
CDemo d0;
CDemo d1(1);
void main()
{
CDemo d2(2);
static CDemo d3(3);
static CDemo d4(4);
CDemo d5(5);
}
如果是
#include<iostream>
using namespace std;
结果为什么是:
Destructor:5
Destructor:2
Destructor:Press any key to continue
而且
Press any key to continue应该是顶头呀。
不明白。
Top
4 楼whyglinux(山青水秀)回复于 2005-06-01 10:58:48 得分 10
通过楼主给出的这个程序,可以清楚地了解全局对象、静态局部对象和局部对象的生存期。如果再在构造函数中加上适当的输出信息,还可以更进一步了解对象在什么时候生成的。
d0、d1是全局对象,依次在main()函数执行之前被构建,相应地也最晚被释放。
其它对象按照它们在main()函数中出现的顺序构建。至于析构,由于d2、d5是局部对象,在 main() 函数结束之前按照构建的相反顺序进行析构。d3、d4是静态局部对象,从被创建之后在程序的运行期间将一直存在。由于d3、d4的创建时候晚于d0、d1,所以在 main() 函数结束后d4、d3先后被析构,最后才是d1、d0。Top
5 楼mccxj(老鼠不逛街)回复于 2005-06-01 11:04:09 得分 0
构造函数:全局对象(无论是不是静态,都是按顺序调用)=》静态局部对象=》局部对象Top




