c++ - 运算符重载 : member function vs. 非成员函数?

标签 c++ operator-overloading member-functions friend-function non-member-functions

我读到声明为成员函数的重载运算符是不对称,因为它只能有一个参数,而自动传递的另一个参数是 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/

相关文章:

c++ - 复合赋值中关于 `const` 的困惑

c++ - 为什么 "no match for ' operator <'"当我声明的时候?

c++ - 从 c++ 到 objective-c 的回调

c++ - 为什么我们可以在包含 boost::none 的 boost::optional<T> 上使用间接/取消引用 (*) 运算符?

c++ - 类名可以用作命名空间吗?

c++ - 默认模板参数

c++ - C++ 中不同数据类型的二元运算符重载

c++ - 如何在外部类中调用内部类的函数?

c++ - 定义一个类的成员函数?

c++ - 如何从数组中向后读取十六进制字符并转换为 int