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

📄 subject_56587.htm

📁 vc
💻 HTM
字号:
<p>
序号:56587 发表者:黄本 发表日期:2003-10-18 22:23:19
<br>主题:子类型 对象指针 的一些概念问题!
<br>内容:一段简单的程序:<BR>#include&lt;iostream.h&gt;<BR>class A<BR>{<BR>private:<BR>&nbsp;&nbsp;&nbsp;&nbsp;int a;<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;A(){ a=0;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;A(int i){a=i;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;int geta()<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return a;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;void print()<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;a&lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>};<BR><BR><BR>class B:public A<BR>{<BR>private:<BR>&nbsp;&nbsp;&nbsp;&nbsp;int b;<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;B(){ b=0;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;B(int i,int j);<BR>&nbsp;&nbsp;&nbsp;&nbsp;void print()<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A::print();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;b&lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>};<BR><BR>B::B(int i,int j):A(i),b(j)<BR>{}<BR><BR>void fun(A &amp;r)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;r.geta()*10&lt;&lt;endl;<BR>}<BR> void&nbsp;&nbsp;main()<BR> {<BR>&nbsp;&nbsp;&nbsp;&nbsp; B bb(9,5);<BR>&nbsp;&nbsp;&nbsp;&nbsp; A aa(5);<BR>&nbsp;&nbsp;&nbsp;&nbsp; aa=bb;<BR>&nbsp;&nbsp;&nbsp;&nbsp; aa.print();<BR>&nbsp;&nbsp;&nbsp;&nbsp; B *ptb=new B(1,2);<BR>&nbsp;&nbsp;&nbsp;&nbsp; A *pta=new A(8);<BR>&nbsp;&nbsp;&nbsp;&nbsp; pta=ptb;<BR>&nbsp;&nbsp;&nbsp;&nbsp; pta-&gt;print();<BR>&nbsp;&nbsp;&nbsp;&nbsp; fun(bb);<BR> }<BR><BR>输出结果:<BR>9 <BR>1 <BR>90<BR><BR>疑问:<BR>1.&nbsp;&nbsp;当“B *ptb=new B(1,2)”时,指针ptb指向匿名对象后,匿名对象会立刻析构吗??我觉得不会,因<BR><BR>为PTB的一级内容为地址,必须有所指向那个匿名对象(匿名对象由new B(1,2)生成)。只有<BR>B p=new B(1,2)或B p; p=B(1,2),生成的匿名对象才会析构,不知事实是否是这样!<BR><BR>2.&nbsp;&nbsp;pta=ptb;pta-&gt;print();为什么输出结果为1,将PTB的一级内容赋予PTA,不是将PTA指向PTB所指的匿<BR><BR>名对象吗? 而PTB所指的匿名对象 有两个私有,为什么只输出一个呢????这也许是对象指针的特殊<BR><BR>性,由于先前定义的 A *pta=new A(8)时 PTA只被分配了A类型对象的空间,所以在操作子类型B时,只输<BR><BR>出原先A类的那个私有成员a。不知事实是否是这样!<BR><BR>3.void fun(A &amp;r) r为bb的引用,传值时不在调用构造函数,是这样吗?<BR> 改为void fun(A r)时 又是怎样建立形参副本的呢?假设bb也为A的对象,如果有拷贝构造函数,建立副<BR><BR>本时调用,如果A类中没有拷贝构造函数,那么又是如何传值 建立副本的呢?是否就是简单赋值,即可理<BR><BR>解为r=bb???<BR><BR>C++读了一个多月以来,遇上这么些概念问题,恳请高手大虾费心 帮帮忙!在下 多谢了!<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>
<font color=red>答案被接受</font><br>回复者:xiongli 回复日期:2003-10-18 23:46:21
<br>内容:1.&nbsp;&nbsp;当“B *ptb=new B(1,2)”时,指针ptb指向匿名对象后,匿名对象会立刻析构吗??我觉得不会,因<BR><BR><BR>为PTB的一级内容为地址,必须有所指向那个匿名对象(匿名对象由new B(1,2)生成)。只有<BR>B p=new B(1,2)或B p; p=B(1,2),生成的匿名对象才会析构,不知事实是否是这样!<BR><BR>//对的,B *ptb=new B(1,2)这里根本没有什么匿名对象.B p; p=B(1,2)这里的确生成了匿名对象,然后调用编译器提供的operator=<BR><BR>2.&nbsp;&nbsp;pta=ptb;pta-&gt;print();为什么输出结果为1,将PTB的一级内容赋予PTA,不是将PTA指向PTB所指的匿<BR><BR>名对象吗? 而PTB所指的匿名对象 有两个私有,为什么只输出一个呢????这也许是对象指针的特殊<BR><BR>性,由于先前定义的 A *pta=new A(8)时 PTA只被分配了A类型对象的空间,所以在操作子类型B时,只输<BR><BR>出原先A类的那个私有成员a。不知事实是否是这样!<BR>/*<BR>B *ptb=new B(1,2);<BR>&nbsp;&nbsp;&nbsp;&nbsp; A *pta=new A(8);<BR>&nbsp;&nbsp;&nbsp;&nbsp; pta=ptb;<BR>&nbsp;&nbsp;&nbsp;&nbsp; pta-&gt;print();<BR>就相当于A *pta=new B(1,2);pta-&gt;print();因为print不是虚函数,调用的是A::print,打印出来的是A::a,那当然是1了<BR>*/<BR><BR><BR>3.void fun(A &amp;r) r为bb的引用,传值时不在调用构造函数,是这样吗?<BR>改为void fun(A r)时 又是怎样建立形参副本的呢?假设bb也为A的对象,如果有拷贝构造函数,建立副<BR><BR>本时调用,如果A类中没有拷贝构造函数,那么又是如何传值 建立副本的呢?是否就是简单赋值,即可理<BR><BR>解为r=bb???<BR>/*<BR>引用调用的确不再调用构造函数.<BR>void fun(A r);<BR>A m;<BR>fun(m);<BR>这种调用,就相当于是在调用fun()的时候,通过r=m,来传递.<BR>这种传递不是通过拷贝构造函数,而是通过operator=来实现的.如果你自己没有实现operator=,那么编译器会给你生成一个位拷贝的operator=.你理解为r=bb,是正确的<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 + -