2013-03-17 81 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的部件上,這樣你就不是你的類中定義它。然而有時候這個功能不能通過公共接口來實現(因爲你的操作員需要訪問數據表示)。