我最近查阅了一篇关于运算符重载的文章,其中提到了非成员运算符重载。如果有人可以通过示例解释非成员运营商重载的含义,我将不胜感激。我知道成员运算符重载是什么(类中一个重载运算符类型的方法(binary..etc)。我在SO上看到了post这让我相信非成员运算符重载的目的是处理运算符重载,其中第一个参数不是一个类,只是一个本机类型。任何解释非成员运算符重载的链接或示例肯定会受到赞赏。
答案 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成员上调用的,所以你不要在你的类中定义它。 但有时无法通过公共接口实现功能(因为您的运营商需要访问数据表示)。