非成员运算符重载是什么意思

时间:2013-03-17 21:52:42

标签: c++ operator-overloading

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

2 个答案:

答案 0 :(得分: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;
}

这里常见的习语是将它与 in-class 定义和朋友声明结合起来:

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&的操作数,而不仅仅是那种确切类型的表达式。

答案 1 :(得分:0)

最常见的方法是重载运算符&lt;&lt;这将在std::cout上调用:

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

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