⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_47047.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:47047 发表者:城市理想 发表日期:2003-07-16 23:58:18
<br>主题:c++中的一个new和析构函数的问题!!!
<br>内容:有一段程序:<BR><BR>#include &lt;iostream.h&gt;<BR><BR>class B<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;int x,y;<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;B() {x=y=0; cout &lt;&lt;"Constructor1" &lt;&lt;endl;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;B(int i) {x=i; y=0; cout &lt;&lt;"Constructor2" &lt;&lt;endl;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;B(int i, int j) {x=i; y=j; cout &lt;&lt;"Constructor3" &lt;&lt;endl;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;~B() {cout &lt;&lt;"Destructor" &lt;&lt;endl;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;void print()<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt;"x=" &lt;&lt;x &lt;&lt;", y=" &lt;&lt;y &lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>};<BR><BR>void main()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;B *ptr;<BR>&nbsp;&nbsp;&nbsp;&nbsp;ptr=new B[3];&nbsp;&nbsp;&nbsp;&nbsp; // 这四句话什么意思啊<BR>&nbsp;&nbsp;&nbsp;&nbsp;ptr[0]=B();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<BR>&nbsp;&nbsp;&nbsp;&nbsp;ptr[1]=B(5);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<BR>&nbsp;&nbsp;&nbsp;&nbsp;ptr[2]=B(2,3);&nbsp;&nbsp;&nbsp;&nbsp;//<BR>&nbsp;&nbsp;&nbsp;&nbsp;for (int i=0; i&lt;3; i++)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr[i].print();<BR>&nbsp;&nbsp;&nbsp;&nbsp;delete[] ptr;<BR>}<BR><BR><BR>为什么输出的结果是:<BR>Constructor1<BR>Constructor1<BR>Constructor1<BR>Constructor1<BR>Destructor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//为什么会调用析构函数?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>Constructor2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>Destructor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//为什么会调用析构函数?&nbsp;&nbsp; <BR>Constructor3<BR>Destructor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//为什么会调用析构函数?&nbsp;&nbsp; <BR>x=0, y=0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<BR>x=5, y=0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//调用析构函数后对象应该不存在了,怎么还可以调用print函数<BR>x=2, y=3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//来输出x和y的值。<BR>Destructor<BR>Destructor<BR>Destructor<BR>Press any key to continue<BR><BR><BR>析构函数不是要到函数结束时才调用吗,怎么这个程序的析构函数在怎么这么早就被调用了<BR>还有想请教一下各位,用new 在堆开辟一个空间是怎么回事啊,开辟的空间为什么没有一个变量作为他的名字,而是直接用指针去指。<BR><BR>ptr=new B[3]; 是不是等价于&nbsp;&nbsp;B (*ptr)[3];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr[0]=B();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptr[1]=B(5);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptr[2]=B(2,3);&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <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>
回复者:城市理想 回复日期:2003-07-17 00:11:01
<br>内容:最后一个问题我写错了<BR><BR>我想问&nbsp;&nbsp;ptr=new B[3];&nbsp;&nbsp;是不是等价于&nbsp;&nbsp;B (*ptr)[3];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptr[0]=B();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptr[1]=B();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptr[2]=B();&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zaibo 回复日期:2003-07-17 09:42:43
<br>内容:我想问&nbsp;&nbsp;ptr=new B[3];&nbsp;&nbsp;是不是等价于&nbsp;&nbsp;B (*ptr)[3];&nbsp;&nbsp; //定义一个数组指针<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptr[0]=B();&nbsp;&nbsp; //为对象分配堆空间,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptr[1]=B();&nbsp;&nbsp; //并且构造它&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptr[2]=B();&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>是的!<BR>首先:ptr=new B[3]就调用了构造函数,就输出前三行结果!<BR>然后是对象的初始化,调用用相应的构造函数和相应的析构函数!就输出后六行结果!<BR>下面的三行结果是调用对象的方法print()的输出;<BR>然后:执行delete[] ptr 析构ptr 执行析构函数,输出最后的三行结果;<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-07-18 17:42:02
<br>内容:&nbsp;&nbsp;&nbsp;&nbsp;ptr[0]=B();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;ptr[1]=B(5);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;ptr[2]=B(2,3);<BR><BR>B(), B(5), B(2,3) 这三个是不是无名对象啊<BR><BR>另外,析构函数在什么时候被调用的啊,书上说析构函数是在函数结束时或遇到return的<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>
<font color=red>答案被接受</font><br>回复者:zaibo 回复日期:2003-07-18 18:15:59
<br>内容:不是无名对象,是临时对象,因为<BR>ptr=new B[3];&nbsp;&nbsp;&nbsp;&nbsp; <BR>这句话定义了对象并且构造了他们!<BR><BR>ptr[0]=B();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>ptr[1]=B(5);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>ptr[2]=B(2,3);<BR><BR>B()、 B(5)、B(2,3)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>是通过对象调用构造函数的<BR><BR>ptr[0]=B();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//在这句话内就结束了!也就是B()返回时产生的临时对象拷贝给ptr后,临时对象就析构了!<BR><BR><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 + -