📄 subject_28022.htm
字号:
<p>
序号:28022 发表者:loverain 发表日期:2003-01-17 10:39:15
<br>主题:一个很大的困惑!!请帮忙解答!!
<br>内容:请问:在一个函数体内定义了一个对象,然后该函数的返回值为此对象,这样的函数可行吗??<BR>因为我觉得该对象只是一个局部对象,在其离开函数范围时就应该调用自身的析构函数,即其已经不存在了,如何返回??例:<BR>class any<BR>{<BR> int *p;<BR> any(){p = new int(5);};<BR> ~any(){delete p;};<BR>}<BR>any function()<BR>{<BR> any in;<BR> return in;<BR>}
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:guanmj 回复日期:2003-01-17 10:52:11
<br>内容:class any<BR>{<BR> int *p;<BR> any(){p = new int(5);};<BR> ~any(){delete p;};<BR>}<BR>void function(any *pany)<BR>{<BR> pany=new any; <BR> return;<BR>} <BR>void main(void)<BR>{<BR> any *pany;<BR> funtion(pany);<BR> delete pany;<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-17 11:03:19
<br>内容:any object = function(); 编译器将在全局数据区建立一个临时的any对象temp,然后把function()的栈中对象in简单赋值给temp,完成后function()函数即可返回,最后any object = temp;整行语句执行完后,编译器负责temp的删除。<BR>当然在某些编译器中,function()的返回对象在完成对object的赋值后函数才能返回。两种方式的实现不同源于编译器的规定。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:loverain 回复日期:2003-01-17 11:24:18
<br>内容:guanmi:你好!!<BR>class any<BR>{<BR>public:<BR> int *p;<BR> any(){p = new int(5);};<BR> ~any(){delete p;};<BR>}<BR>void function(any *pany)<BR>{<BR> pany=new any; <BR> return;<BR>} <BR>void main(void)<BR>{<BR> any *pany;<BR> funtion(pany);<BR> delete pany;<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>回复者:在水一方 回复日期:2003-01-17 11:33:33
<br>内容:如下VC6.0通过:<BR>#include <iostream.h><BR><BR>class CAny<BR>{<BR> public:<BR> int *m_p;<BR><BR> CAny()<BR> {<BR> m_p = new int(5);<BR> }<BR><BR> ~CAny()<BR> {<BR> delete m_p;<BR> }<BR>};<BR><BR>CAny *CreateCAny()<BR>{<BR> return (new CAny);<BR>} <BR><BR>int main(int argc, char* argv[])<BR>{<BR> CAny *pAny = CreateCAny();<BR> if (pAny != NULL)<BR> {<BR> *(pAny->m_p) = 200;<BR> cout<<*(pAny->m_p)<<endl;<BR> delete pAny;<BR> }<BR> else<BR> cout<<"Out of heap"<<endl;<BR> return 0;<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>
回复者:guanmj 回复日期:2003-01-17 11:34:19
<br>内容:class any<BR>{<BR>public:<BR> int *p;<BR> any(){p = new int(5);};<BR> ~any(){delete p;};<BR>};<BR>void function(any *pany)<BR>{<BR> pany=new any; <BR> return;<BR>} <BR>void main(void)<BR>{<BR> any *pany;<BR> function(pany);<BR> delete pany;<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-17 11:34:55
<br>内容:看我的文章的"返回局部变量错误"部分的<BR>你这个是典型的问题.<BR>http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=578<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>
回复者:guanmj 回复日期:2003-01-17 11:38:40
<br>内容:class any<BR>{<BR>public:<BR> int *p;<BR> any(){p = new int;};<BR> ~any(){delete p;};<BR>};<BR>void function(any **pany)<BR>{<BR> *pany=new any; <BR> return;<BR>} <BR>void main(void)<BR>{<BR> any *pany;<BR> function(&pany);<BR> delete pany;<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-17 12:54:26
<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>
回复者:loverain 回复日期:2003-01-17 15:47:02
<br>内容:guanmi:<BR>虽然你的程序可以通过,但有以下问题:无法使用pany中的任何变量,原因可能是函数参数在离开函数体时就已经不存在了,可以用返回对象的指针的方法取得对象,因为指针是在堆中进行分配的,所以除非你显式的删除它是一直存在的。非常感谢各位!!
<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 16:02:51
<br>内容:<BR>但有以下问题:无法使用pany中的任何变量,原因可能是函数参数在离开函数体时就已经不存在了?<BR><BR>谁说的?<BR><BR>guanmi最后一次的方法无误。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:loverain 回复日期:2003-01-17 16:26:54
<br>内容:是这样的<BR>如果你在 guanmi 的程序中加入如下语句:cout<<*(pAny->in)<<endl;<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>
回复者:loverain 回复日期:2003-01-17 16:32:22
<br>内容:请问guanmi :<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-17 17:35:57
<br>内容:To:loverain<BR><BR> 1><BR> void function1(any **ppAny)<BR> {<BR> *ppAny=new any; <BR> }<BR><BR> 2><BR> void function2(any *pAny)<BR> {<BR> pAny= new any; <BR> }<BR><BR> void main()<BR> {<BR> any *pAny1, *pAny2;<BR> function1(&pAny1);<BR> function2(pAny2);<BR> }<BR> <BR> 如上,fuction2是值(指针pAny2的值)传递,而fuction1是地址传递(指针pAny1的地址),<BR>所以这样处理以后,pAny1能将赋给自己的值(即new any)从函数中function1带回,<BR>而pAny2不能能将赋给自己的值(即new any)带回。<BR> <BR> 这样转化后更易理解:<BR> typedef any *PANY;<BR> 1><BR> void function1(PANY *ppAny) //地址传递PANY类型的"指针"<BR> {<BR> *ppAny=new any; <BR> }<BR><BR> 2><BR> void function2(PANY pAny) //值传递PANY类型的"指针"<BR> {<BR> pAny= new any; <BR> }<BR><BR> 就像大家知道的<BR> void swap1(int *a, int *b)<BR> {<BR> int temp<BR> temp = *a;<BR> *a = *b;<BR> *b = temp;<BR> }<BR><BR> void swap2(int a, int b)<BR> {<BR> int temp<BR> temp = a;<BR> a = b;<BR> b = temp;<BR> }<BR>swap1能交换两个变量的值,而swap2则不能一样<BR><BR><BR>2003-1-17 17:36:55
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -