📄 subject_47047.htm
字号:
<p>
序号:47047 发表者:城市理想 发表日期:2003-07-16 23:58:18
<br>主题:c++中的一个new和析构函数的问题!!!
<br>内容:有一段程序:<BR><BR>#include <iostream.h><BR><BR>class B<BR>{<BR> int x,y;<BR>public:<BR> B() {x=y=0; cout <<"Constructor1" <<endl;}<BR> B(int i) {x=i; y=0; cout <<"Constructor2" <<endl;}<BR> B(int i, int j) {x=i; y=j; cout <<"Constructor3" <<endl;}<BR> ~B() {cout <<"Destructor" <<endl;}<BR> void print()<BR> {<BR> cout <<"x=" <<x <<", y=" <<y <<endl;<BR> }<BR>};<BR><BR>void main()<BR>{<BR> B *ptr;<BR> ptr=new B[3]; // 这四句话什么意思啊<BR> ptr[0]=B(); //<BR> ptr[1]=B(5); //<BR> ptr[2]=B(2,3); //<BR> for (int i=0; i<3; i++)<BR> ptr[i].print();<BR> delete[] ptr;<BR>}<BR><BR><BR>为什么输出的结果是:<BR>Constructor1<BR>Constructor1<BR>Constructor1<BR>Constructor1<BR>Destructor //为什么会调用析构函数? <BR>Constructor2 <BR>Destructor //为什么会调用析构函数? <BR>Constructor3<BR>Destructor //为什么会调用析构函数? <BR>x=0, y=0 //<BR>x=5, y=0 //调用析构函数后对象应该不存在了,怎么还可以调用print函数<BR>x=2, y=3 //来输出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]; 是不是等价于 B (*ptr)[3];<BR> ptr[0]=B(); <BR> ptr[1]=B(5); <BR> ptr[2]=B(2,3); <BR> <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>我想问 ptr=new B[3]; 是不是等价于 B (*ptr)[3];<BR> ptr[0]=B(); <BR> ptr[1]=B(); <BR> ptr[2]=B(); <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>
回复者:zaibo 回复日期:2003-07-17 09:42:43
<br>内容:我想问 ptr=new B[3]; 是不是等价于 B (*ptr)[3]; //定义一个数组指针<BR> ptr[0]=B(); //为对象分配堆空间,<BR> ptr[1]=B(); //并且构造它 <BR> ptr[2]=B(); <BR> <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>内容: ptr[0]=B(); <BR> ptr[1]=B(5); <BR> 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]; <BR>这句话定义了对象并且构造了他们!<BR><BR>ptr[0]=B(); <BR>ptr[1]=B(5); <BR>ptr[2]=B(2,3);<BR><BR>B()、 B(5)、B(2,3) <BR>是通过对象调用构造函数的<BR><BR>ptr[0]=B(); //在这句话内就结束了!也就是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 + -