2013-03-17 27 views
2

我最近去在操作符重载的文章,其中提到它非成员运算符重载意思。如果有人能够用一个例子解释非成员操作符重载意味着什么,我将不胜感激。我知道成员运算符重载是什么(在重载(binary..etc)我看过这个post来到SO操作型这让我相信,非成员运算符重载的目的是处理操作符重载类的方法其中,第一个参数是不是一个类,简直就是一个天然的类型解释非成员运算符重载是肯定会理解的任何链接或例子什么是由非成员运算符重载

+0

您给出的链接显示非会员操作员重载的示例,如您所说的用于在原语上执行添加操作 – 2013-03-17 21:57:02

+0

[This](http://stackoverflow.com/q/4421706/1410711)可能会有所帮助。 。 – Recker 2013-03-17 21:57:26

回答

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<仍然是技术上 -member。

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

+0

它对于* symetrical *类型转换也很有用,允许所有相关操作数的隐式类型转换。 – 2013-03-17 21:59:54

+0

@DrewDormann好点。添加 – sehe 2013-03-17 22:05:56

0

最常见的方式是重载操作< <将在std::cout被称为:

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

这就是所谓的std :: ostream的部件上,这样你就不是你的类中定义它。然而有时候这个功能不能通过公共接口来实现(因为你的操作员需要访问数据表示)。

相关问题