2

我最近正在阅读一篇关于运算符重载的文章,其中提到了非成员运算符重载。如果有人能用一个例子解释非成员运算符重载的含义,我将不胜感激。我知道什么是成员运算符重载(类中重载运算符类型(二进制..等)的方法。我在 SO 上看到这篇文章,这让我相信非成员运算符重载的目的是处理运算符重载其中第一个参数不是一个类,只是一个本机类型。任何解释非成员运算符重载的链接或示例肯定会受到赞赏。

4

2 回答 2

4

这意味着您可以在课堂外重载:

struct X { int data; };

bool operator<(X const& a, X const& b) 
{
       return a.data < b.data;
}

这对于不对称重载很有用,其中左操作数不需要是您自己的类型:

bool operator<(int a, X const& b) 
{
       return a < b.data;
}

这里的一个常见习惯用法是将它与类内定义和朋友声明结合起来:

struct X 
{ 
    int data; 
    friend bool operator<(X const& a, X const& b) { return a.data<b.data; }
    friend bool operator<(int a, X const& b) { return a<b.data; }
};

在这里,operator<在技术上仍然是非会员。

正如下面的 DrewDormann 所指出的,另一个有用的副作用是(X const&, X const&)将适用于任何可隐式转换为 的操作数X const&,而不仅仅是该确切类型的表达式。

于 2013-03-17T21:55:48.443 回答
0

最常见的方法是重载将被调用的 operator<< std::cout

namespace X { 
      class MyClass { 
       ...
       };  
}
std::ostream& operator<< (std::ostream&, const X::MyClass&);

这在 std::ostream 成员上调用,因此您无需在类中定义它。但是有时无法通过公共接口实现功能(因为您的操作员需要访问数据表示)。

于 2013-03-17T22:05:00.530 回答