从一个二级题来看成员函数重载运算符和友元函数重载运算符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从一个二级题来看成员函数重载运算符和友元函数重载运算符相关的知识,希望对你有一定的参考价值。

先上题:下列运算符都可以被友元函数重载的是:

A)=,+,-,\

B)[],+,(),new

C)->,+,*,>>

D)<<,>>,+,*

正确答案为D

我们知道,在运算符重载,友元函数运算符重载函数与成员运算符重载函数的区别是:友元函数没有this指针,而成员函数有,因此,在两个操作数的重载中友元函数有两个参数,而成员函数只有一个。

因此,我们可以总结如下:

1.对双目运算符而言,成员函数重载运算符的函数参数表中只有一个参数,而用友元函数重载运算符函数参数表中含有两个参数。
  对单木运算符来说,成员函数重载运算符的函数参数表中没有参数,而用友元函数重载运算符函数参数表中含有一个函数。这个问题要搞清楚,有一个this指针的问题。。。
2.双目运算符一般可以用友元函数重载和成员函数重载,但有一种情况只可以用友元函数重载。
  即:双目运算符左边的变量是一个常量,而不是对象!!!这点很重要的额。

而关于运算符的重载,有以下经验可以记着:

   1.对于单目运算符,建议选择成员函数;
   2.对于运算符“=,(),[],->”只能作为成员函数;
   3.对于运算符“+ =,-=,/=,*=,&=,!=,~=,%=,<<=,>>=”建议重载为成员函数;
   4.对于其他运算符,建议重载为友元函数。

 

那么下面这个题的答案也就很明显了:

将x+y*z中的“+”用成员函数重载,“*”用友元函数重载应该写为:?

答案为:x.operator+(operator*(y,z))

以上是关于从一个二级题来看成员函数重载运算符和友元函数重载运算符的主要内容,如果未能解决你的问题,请参考以下文章

类和对象——补充(运算符重载,static和explicit关键字和友元,内部类)

对运算符重载和友元函数的例子

运算符重载和友元

运算符重载和友元函数

C++运算符重载中 重载为类的成员函数和重载为类的友元函数 的区别是啥?

什么运算符一定要重载友元函数,什么时候一定要重载为成员函数?