📄 subject_27975.htm
字号:
<p>
序号:27975 发表者:leochendp 发表日期:2003-01-16 19:58:30
<br>主题:关于全局对象的构造及析构问题!
<br>内容:请问全局对象什么时候执行析构?<BR>程序如下:<BR>#include <iostream><BR>using namespace std;<BR><BR>class A<BR>{<BR> A() { cout << "A Constructor!" << endl;} ;<BR> ~A() { cout << "A Destructor!" << endl;} ;<BR>};<BR><BR>A testA;<BR><BR>int main()<BR>{<BR> return;<BR>}<BR><BR>执行结果为:A Constructor!<BR><BR>请问全局变量什么时候执行析构呢?<BR><BR>在深入出MFC 2ED中第三章的:<BR>frame1中我自己写一个与其一样的程序但是包括声明与实现全部写在同一个文件中,执行结果也是只有构造的输出没有析构的输出,但是如果与候捷先生一样的分成多个文件就有析构的输出了,请问这是怎么回事。<BR><BR>谢了!<BR><BR>另:<BR><BR> Static变量在对象存在多个[实例]时只有一份存在,那么这其中的只有一份是指在一个[程序]实例执行中只有一份还是在多个[程序]实例中只有一份呢?<BR><BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:tjhe 回复日期:2003-01-16 20:06:13
<br>内容:全局对象应该是程序结束时析构。<BR><BR>Static成员变量是指在一个程序中只有所有该类实例共享一份(该类没有实例时就已经存在)
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:leochendp 回复日期:2003-01-16 20:13:31
<br>内容:tjhe <BR>你可以试试上面的程序或自己写一个一样简单的,但是它就是不执行析构!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:tjhe 回复日期:2003-01-16 20:20:03
<br>内容:不是不执行析构,而是执行析构是程序已经退出了,即已经出了main()的范围<BR><BR>void main()<BR>{<BR><BR>}//出此范围,全局对象析构,看不见其输出了(分成多个文件也与编译很有关系)<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:leochendp 回复日期:2003-01-16 20:25:24
<br>内容:(分成多个文件也与编译很有关系)<BR>可以说明一下吗?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:tjhe 回复日期:2003-01-16 20:28:07
<br>内容:#include <iostream><BR>#include <fstream><BR>using namespace std;<BR><BR>class A<BR>{<BR>public:<BR> A() { cout << "A Constructor!" << endl;} ;<BR> ~A();// { cout << "A Destructor!" << endl;} ;<BR>};<BR>A::~A()<BR>{ <BR> ofstream oo("abc.txt");<BR> oo << "A Destructor!" << endl;<BR> oo.close();<BR>}<BR><BR>A testA;<BR><BR>int main()<BR>{<BR> return 0;<BR>}<BR><BR>运行后看看输出的文件abc.txt就知道了。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:雍菲 回复日期:2003-01-16 20:28:28
<br>内容:#include <iostream><BR>using namespace std;<BR><BR>class A<BR>{<BR>public:<BR> A() { cout << "A Constructor!" << endl;} ;<BR> ~A() { cout << "A Destructor!" << endl;} ;<BR>};<BR><BR>//A testA;<BR><BR>int main()<BR>{<BR> A testA;<BR> return 1;<BR>}<BR><BR>这样是可以出来的
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:tjhe 回复日期:2003-01-16 20:29:45
<br>内容:雍菲的是局部对象
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:leochendp 回复日期:2003-01-16 20:36:20
<br>内容:谢谢tjhe <BR><BR>我的最后一个问题是:<BR><BR>为什么分成几个文件进行编译时是在<BR><BR>void main()<BR>{<BR> //全局此处进行析构的呢?<BR>}<BR><BR>而在一个文件内却是您说的那种呢!<BR><BR>void main()<BR>{<BR> //全局变量此处进行析构的呢?<BR>}
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:雍菲 回复日期:2003-01-16 20:52:28
<br>内容:我觉得tjhe 的意思<BR>也不是你所说的<BR>void main()<BR>{<BR> //全局变量此处进行析构的呢?<BR>} <BR>而是:<BR>void main()<BR>{<BR> <BR>} <BR>//全局变量此处进行析构的呢?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:雍菲 回复日期:2003-01-16 21:04:22
<br>内容:T哥呢?不给我们解惑了!!!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:tjhe 回复日期:2003-01-16 21:29:47
<br>内容:这问题确实让人迷惑,我也说不准,看样子同样是全局对象,也与其所在文件有关(构造的顺序难以确定,主函数结束前其他文件中的全局对象析构,不知候捷先生有没有说明),
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:雍菲 回复日期:2003-01-16 21:42:27
<br>内容:#include <iostream><BR>#include <fstream><BR>using namespace std;<BR><BR>class A<BR>{<BR>public:<BR> A() { cout << "A Constructor!" << endl;} ;<BR> ~A() {/* cout << "A Destructor!" << endl;*/<BR> ofstream oo("abc.txt");<BR> oo << "A Destructor!" << endl;<BR> oo.close();<BR> } ;<BR>};<BR>/*<BR>A::~A()<BR>{ <BR> ofstream oo("abc.txt");<BR> oo << "A Destructor!" << endl;<BR> oo.close();<BR>}<BR>*/<BR>A testA;<BR><BR>int main()<BR>{<BR> return 0;<BR>}<BR><BR><BR>这样也是可以的!!!<BR><BR><BR>不知道T哥"分成多个文件也与编译很有关系"是什么意思!!!<BR>可以不可以给讲一讲!!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:tjhe 回复日期:2003-01-16 23:09:36
<br>内容:结果好像与C++的说法不太一致(希望高手指点):<BR><BR>全局对象的构造顺序:以包含全局对象的源文件加入工程的顺序为准,先加入的源文件中的全局对象先构造。<BR><BR>全局对象的析构顺序:除包含主函数的源文件中的全局对象是在出了主函数体时析构外,其他的是在即将出主函数体时析构,析构顺序与构造顺序相反(包含主函数的源文件中的全局对象即使最后构造,也要到主函数体外析构,不符合总的来说后构造先析构的一般规则)。<BR><BR>分成多个文件也与编译很有关系,我是指与全局对象构造顺序的关系(这里引起误会了)。<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:IceAge 回复日期:2003-01-17 00:24:20
<br>内容:tjhe 是对的。 全局对象,静态变量在 main 之前的初始化里被构造, 在 main 之后的销毁里被析构。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:啊志 回复日期:2003-01-17 02:38:09
<br>内容:近几天看钱能书<BR><BR>全局对象,是在main外定义的,在main 里面定义的变量不是全局变量(在别的地方不能访问)
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:leochendp 回复日期:2003-01-17 21:45:57
<br>内容:我发现一个问题,析构内容的输出(只敢确认是输出,不知道执行是时间是否也是如此)与使用的头文件、输出函数有关,把<BR>#include <iostream><BR>using namespace std;<BR>改成:<BR>#include <iostream.h><BR>或把<BR>~A() { cout << "A Destructor!" << endl;} ;<BR>改成<BR>~A() { printf("%s\n","A Destructor!");} ;<BR><BR>结果是:<BR>A Constructor!<BR>A Destructor!<BR>而不是:<BR>A Constructor!<BR><BR>请高手点!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dr0 回复日期:2003-01-17 21:49:47
<br>内容:global c++ objec、在main之外构造和析够,遵循lifo order。<BR>不能假设任意两个对象之间的顺序,这和编译器有关。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -