2012-04-25 70 views
1

可能重複:
Operator overloading
Operator overloading : member function vs. non-member function?爲什麼重載operator <作爲成員函數是不好的做法?

經過多年的明顯濫用這種構造有人向我指出,這是不好的做法:

class SomeClass 
{ 
    ... 
    bool operator<(const SomeClass& other) const; 
}; 

而這是很好的做法:

class SomeClass 
{ 
    ... 
}; 
bool operator<(const SomeClass& a, const SomeClass& b); 

但我不能爲我的生活弄清楚爲什麼,找不到任何文檔上的差異。任何人都可以將我指向正確的方向嗎?

+1

請參閱http://stackoverflow.com/questions/4622330/operator-overloading-member-function-vs-non -member-function – dirkgently 2012-04-25 03:29:18

+0

謝謝,我猜測我是專門搜索比較運算符並錯過它。 – smocking 2012-04-25 03:31:29

+1

[會員與非會員之間的決定](http://stackoverflow.com/questions/4421706/operator-overloading/4421729#4421729)。 – 2012-04-25 03:36:14

回答

3

首先,將操作符實現爲成員函數沒有優勢,並且可以將其作爲自由函數來實現。特別是,一個成員函數關於兩個操作數的類型是不對稱的,左邊的(lhs)必須是它被調用的類的確切類型,而右邊的方(rhs)可以使用隱式轉換。在自由函數運算符的情況下,可以將相同的轉換應用於lhs和rhs。

struct SomeClass { 
    SomeClass(int value); 
    bool operator<(SomeClass const &) const; 
}; 
bool operator>(SomeClass const &, SomeClass const &); 
int main() { 
    SomeClass x(10); 
    x < 100;    // Fine, lhs is SomeClass 
    // 100 < x;   // Error, no operator< can take int as lhs and SomeClass 
    x > 100;    // Fine 
    100 > x;    // Also fine, lhs can take the same implicit conversions 
} 

注意的是,這裏的主要區別是隱式轉換,並且有差別只是如果你的類型可以從其他類型的隱式轉換。如果在你的類型中沒有隱式轉換,那麼這一點是沒有意義的,但考慮到使用自由函數沒有缺點,並且在某些情況下有優勢,我會盡可能使用自由函數。

我前一段時間寫過關於運營商超載here,您可能會在那裏找到一些建議。

+0

在某些情況下,我會將隱式轉換算作一個缺點(但是之後我會嘗試通過顯式構造函數來防止它首先出現)。如果您的類型是另一種數字類型,那麼隱式轉換可能是可以的,但其他類型則需要根據具體情況進行考慮。 – 2012-04-25 14:32:22

+0

@LokiAstari:同意應該避免隱式轉換,但是如果存在轉換,那麼在操作的左側和右側行爲是沒有意義的,也就是說,隱式轉換的問題在兩種情況下都存在,但其中一個是一致的。正如我試圖說的那樣,擁有一個自由函數永遠不會受到傷害,並且在某些情況下(在需要隱式轉換的情況下)可能會有所幫助。 – 2012-04-25 14:50:36

+0

我能找到的一些東西是關於對稱性和類封裝,但我認爲隱式轉換是一個實際的實際優勢。只聽說過非會員運營商最近對SO進行了重載,並且對於會員運營商<被解僱爲「不良行爲」以及您「不應該這樣做」的事情感到相當驚訝,特別是因爲這是我知道的唯一方式,在我的代碼中使用它幾年。很高興知道這不像我擔心的那樣糟糕。 – smocking 2012-04-25 16:31:49

相關問題