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

📄 subject_28022.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:28022 发表者:loverain 发表日期:2003-01-17 10:39:15
<br>主题:一个很大的困惑!!请帮忙解答!!
<br>内容:请问:在一个函数体内定义了一个对象,然后该函数的返回值为此对象,这样的函数可行吗??<BR>因为我觉得该对象只是一个局部对象,在其离开函数范围时就应该调用自身的析构函数,即其已经不存在了,如何返回??例:<BR>class any<BR>{<BR>&nbsp;&nbsp;int *p;<BR>&nbsp;&nbsp;any(){p = new int(5);};<BR>&nbsp;&nbsp;~any(){delete p;};<BR>}<BR>any function()<BR>{<BR> any in;<BR>&nbsp;&nbsp;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>&nbsp;&nbsp;int *p;<BR>&nbsp;&nbsp;any(){p = new int(5);};<BR>&nbsp;&nbsp;~any(){delete p;};<BR>}<BR>void function(any *pany)<BR>{<BR>&nbsp;&nbsp;pany=new any;&nbsp;&nbsp;<BR>&nbsp;&nbsp;return;<BR>} <BR>void main(void)<BR>{<BR>&nbsp;&nbsp;any *pany;<BR>&nbsp;&nbsp;funtion(pany);<BR>&nbsp;&nbsp;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>&nbsp;&nbsp;int *p;<BR>&nbsp;&nbsp;any(){p = new int(5);};<BR>&nbsp;&nbsp;~any(){delete p;};<BR>}<BR>void function(any *pany)<BR>{<BR>&nbsp;&nbsp;pany=new any;&nbsp;&nbsp;<BR>&nbsp;&nbsp;return;<BR>} <BR>void main(void)<BR>{<BR>&nbsp;&nbsp;any *pany;<BR>&nbsp;&nbsp;funtion(pany);<BR>&nbsp;&nbsp;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 &lt;iostream.h&gt;<BR><BR>class CAny<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *m_p;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAny()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_p = new int(5);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~CAny()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete m_p;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>};<BR><BR>CAny *CreateCAny()<BR>{<BR>&nbsp;&nbsp;return (new CAny);<BR>} <BR><BR>int main(int argc, char* argv[])<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;CAny *pAny = CreateCAny();<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (pAny != NULL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*(pAny-&gt;m_p) = 200;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;*(pAny-&gt;m_p)&lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete pAny;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"Out of heap"&lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;int *p;<BR>&nbsp;&nbsp;any(){p = new int(5);};<BR>&nbsp;&nbsp;~any(){delete p;};<BR>};<BR>void function(any *pany)<BR>{<BR>&nbsp;&nbsp;pany=new any;&nbsp;&nbsp;<BR>&nbsp;&nbsp;return;<BR>} <BR>void main(void)<BR>{<BR>&nbsp;&nbsp;any *pany;<BR>&nbsp;&nbsp;function(pany);<BR>&nbsp;&nbsp;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>&nbsp;&nbsp;int *p;<BR>&nbsp;&nbsp;any(){p = new int;};<BR>&nbsp;&nbsp;~any(){delete p;};<BR>};<BR>void function(any **pany)<BR>{<BR>&nbsp;&nbsp;*pany=new any;&nbsp;&nbsp;<BR>&nbsp;&nbsp;return;<BR>} <BR>void main(void)<BR>{<BR>&nbsp;&nbsp;any *pany;<BR>&nbsp;&nbsp;function(&amp;pany);<BR>&nbsp;&nbsp;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&lt;&lt;*(pAny-&gt;in)&lt;&lt;endl;<BR>就无法运行!!<BR>&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>
回复者: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>&nbsp;&nbsp;1&gt;<BR>&nbsp;&nbsp;void function1(any **ppAny)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;*ppAny=new any;&nbsp;&nbsp;<BR>&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;2&gt;<BR>&nbsp;&nbsp;void function2(any *pAny)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;pAny= new any;&nbsp;&nbsp;<BR>&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;void main()<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp; any *pAny1, *pAny2;<BR>&nbsp;&nbsp;&nbsp;&nbsp; function1(&amp;pAny1);<BR>&nbsp;&nbsp;&nbsp;&nbsp; function2(pAny2);<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;如上,fuction2是值(指针pAny2的值)传递,而fuction1是地址传递(指针pAny1的地址),<BR>所以这样处理以后,pAny1能将赋给自己的值(即new any)从函数中function1带回,<BR>而pAny2不能能将赋给自己的值(即new any)带回。<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;这样转化后更易理解:<BR>&nbsp;&nbsp;typedef any *PANY;<BR>&nbsp;&nbsp;1&gt;<BR>&nbsp;&nbsp;void function1(PANY *ppAny) //地址传递PANY类型的"指针"<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;*ppAny=new any;&nbsp;&nbsp;<BR>&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;2&gt;<BR>&nbsp;&nbsp;void function2(PANY pAny)&nbsp;&nbsp;//值传递PANY类型的"指针"<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;pAny= new any;&nbsp;&nbsp;<BR>&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;就像大家知道的<BR>&nbsp;&nbsp;void swap1(int *a, int *b)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp; int temp<BR>&nbsp;&nbsp;&nbsp;&nbsp; temp = *a;<BR>&nbsp;&nbsp;&nbsp;&nbsp; *a&nbsp;&nbsp; = *b;<BR>&nbsp;&nbsp;&nbsp;&nbsp; *b&nbsp;&nbsp; = temp;<BR>&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;void swap2(int a, int b)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp; int temp<BR>&nbsp;&nbsp;&nbsp;&nbsp; temp = a;<BR>&nbsp;&nbsp;&nbsp;&nbsp; a&nbsp;&nbsp; = b;<BR>&nbsp;&nbsp;&nbsp;&nbsp; b&nbsp;&nbsp; = temp;<BR>&nbsp;&nbsp;}<BR>swap1能交换两个变量的值,而swap2则不能一样<BR><BR><BR>2003-1-17 17:36:55

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -