我读到声明为成员函数的重载运算符是不对称,因为它只能有一个参数,而自动传递的另一个参数是 this
指针。所以没有标准来比较它们。另一方面,声明为 friend
的重载运算符是 symmetric,因为我们传递了两个相同类型的参数,因此可以比较它们。
我的问题是,当我仍然可以将指针的左值与引用进行比较时,为什么首选 friend ? (使用非对称版本的结果与对称版本相同) 为什么 STL 算法只使用对称版本?
最佳答案
如果您将运算符重载函数定义为成员函数,则编译器会将 s1 + s2
等表达式转换为 s1.operator+(s2)
。 这意味着,运算符重载的成员函数在第一个操作数上被调用。这就是成员函数的工作原理!
但是如果第一个操作数不是一个类怎么办? 如果我们要重载一个第一个操作数不是类类型的运算符,而是说 double
,就会出现一个主要问题。 所以你不能这样写 10.0 + s2
。但是,您可以为 s1 + 10.0
等表达式编写运算符重载成员函数。
为了解决这个排序问题,我们将运算符重载函数定义为friend
,如果它需要访问private
成员。 仅在需要访问私有(private)成员时才将其设为好友
。否则只需将其设为非好友非成员功能即可改进 封装!
class Sample
{
public:
Sample operator + (const Sample& op2); //works with s1 + s2
Sample operator + (double op2); //works with s1 + 10.0
//Make it `friend` only when it needs to access private members.
//Otherwise simply make it **non-friend non-member** function.
friend Sample operator + (double op1, const Sample& op2); //works with 10.0 + s2
}
阅读这些:
A slight problem of ordering in operands
How Non-Member Functions Improve Encapsulation
关于c++ - 运算符重载 : member function vs. 非成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4622330/