📄 subject_66049.htm
字号:
<p>
序号:66049 发表者:everfly 发表日期:2003-12-22 10:40:30
<br>主题:关于友元函数
<br>内容:如C++ PRIME PLUS第11章 <BR>class Time{<BR>private:<BR> int hours;<BR> int minutes;<BR><BR>public:<BR> Time ();<BR> Time (int h,int m = 0 );<BR> void AddMin (int m );<BR> void AddHr (int h );<BR> void Reset (int h = 0,int m = 0 );<BR> // + operator overloading<BR> Time operator+ (const Time & t) const;<BR> Time operator- (const Time & t) const;<BR> Time operator* (double n) const;<BR> void Show () const;<BR> friend Time operator* (double m, const Time & t )<BR> {return t * m;} // inline definition<BR> friend void operator<< (ostream & os, const Time & t);<BR>};<BR>我把<BR> friend Time operator* (double m, const Time & t )<BR> {return t * m;} // inline definition<BR>改为<BR> Time operator* (double m, const Time & t )<BR> {return t * m;} // inline definition<BR>或者改为<BR> Time operator* (double m, const Time & t ) const<BR> {return t * m;} // inline definition<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>
回复者:ljl 回复日期:2003-12-22 11:19:47
<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>
回复者:everfly 回复日期:2003-12-22 11:29:44
<br>内容:这里有源程序<BR>http://www.vchelp.net/cndevforum/subject_view.asp?subject_id=65789&forum_id=
<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>回复者:Cxt_ann 回复日期:2003-12-22 17:32:43
<br>内容:如果不定义成friend就不能访问类的成员<BR>如果是成员函数重载操作符,第一个参数是调用对象,隐式的调用,所以参数表中只能有一个参数,这个参数是被调用的对象。<BR>比如:A和B和C是类的对象,C = A * B,等价于C = A.operator* (B);<BR>如果两个参数,其中一个不是类的对象,就必须声明为friend
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:everfly 回复日期:2003-12-23 12:17:16
<br>内容:谢谢toann老朋友,还有朋友给我这么说的::)和你的意思一样,都是高手。<BR><BR>*是一个二元运算符。用友元的话,参数列表里需要 <BR>2个参数。比如这样用 <BR>代码: <BR><BR>time a,b,c; <BR>c = a*b; <BR> <BR><BR>如果是友元函数,其实就是c = operator*(a,b); <BR>而如果用成员函数,参数列表里一个参数就够了, <BR>另一个参数就是调用这个成员函数的对象。 <BR>上面的代码就是 c = a.operator *(b); <BR>但这样的代码可以正确,c = a.operator*(3); <BR>而c = 3.operator*(b);不可以。因为左操作数不是一个对象, <BR>也就没办法调用operator*成员函数。 <BR>而这个问题对友元函数不存在。无论是c = 3*b; <BR>还是c = b*3;或转化为*operator(3,b);或*operator(b,3); <BR>所以一般对二元运算符,要把它定义为友元运算符,这样更灵活, <BR>满足交换律。 <BR>2003-12-23 13:57:01
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -