📄 subject_56587.htm
字号:
<p>
序号:56587 发表者:黄本 发表日期:2003-10-18 22:23:19
<br>主题:子类型 对象指针 的一些概念问题!
<br>内容:一段简单的程序:<BR>#include<iostream.h><BR>class A<BR>{<BR>private:<BR> int a;<BR>public:<BR> A(){ a=0;}<BR> A(int i){a=i;}<BR> int geta()<BR> {<BR> return a;<BR> }<BR> void print()<BR> {<BR> cout<<a<<endl;<BR> }<BR>};<BR><BR><BR>class B:public A<BR>{<BR>private:<BR> int b;<BR>public:<BR> B(){ b=0;}<BR> B(int i,int j);<BR> void print()<BR> {<BR> A::print();<BR> cout<<b<<endl;<BR> }<BR>};<BR><BR>B::B(int i,int j):A(i),b(j)<BR>{}<BR><BR>void fun(A &r)<BR>{<BR> cout<<r.geta()*10<<endl;<BR>}<BR> void main()<BR> {<BR> B bb(9,5);<BR> A aa(5);<BR> aa=bb;<BR> aa.print();<BR> B *ptb=new B(1,2);<BR> A *pta=new A(8);<BR> pta=ptb;<BR> pta->print();<BR> fun(bb);<BR> }<BR><BR>输出结果:<BR>9 <BR>1 <BR>90<BR><BR>疑问:<BR>1. 当“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. pta=ptb;pta->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 &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. 当“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. pta=ptb;pta->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> A *pta=new A(8);<BR> pta=ptb;<BR> pta->print();<BR>就相当于A *pta=new B(1,2);pta->print();因为print不是虚函数,调用的是A::print,打印出来的是A::a,那当然是1了<BR>*/<BR><BR><BR>3.void fun(A &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 + -