2012-10-06 49 views
2

我不知道爲什麼()操作符重載不能是「朋友」(所以它需要一個「這個」附加參數),而+運營商需要爲朋友就像下面這個例子:操作員覆蓋 - 何時使用朋友?

class fnobj 
{ 
    int operator()(int i); 
    friend int operator+(fnobj& e); 
}; 

int fnobj::operator()(int i) 
{ 

} 

int operator+(fnobj& e) 
{ 

} 

我知道+運營商需要成爲朋友,以避免「額外」這個參數,但爲什麼運營商()不需要它?

回答

4

您已經超載了一元加運算符。你可能不想這樣做。它不添加兩個對象,它描述了當+出現在其之前時如何解釋單個對象,與解釋int x = +10相同。 (它被解釋爲與int x = 10相同)

對於添加運算符,「+運營商需要成爲好友」是不正確的。

這裏有兩種方法可以添加兩個fnobj對象:

int operator+(fnobj& e); 
friend int operator+(fnobj& left, fnobj& right); 

在第一種形式,this被假定爲對象到+的左側。所以兩種形式都有效地採用兩個參數

因此,要回答你的問題,而不是認爲「操作符()不需要friend」,認爲這是「運算符()要求this」或者更好的,「治療對象作爲函數需要目的」。

+0

謝謝,並且()運算符在單個對象上調用,因此必須是成員函數,是否正確? –

+0

@JohnnyPauling正確。我編輯了我的答案來說明這一點。 –

+0

完美,謝謝! –

2

你沒有正確理解這一點(並沒有正確使用它)。

這在C++兩種方法來定義一類二元運算符,無論是作爲一個成員函數

class A 
{ 
public: 
    int operator+ (A const& other); 
}; 

或作爲自由功能

class A {}; 

int operator+ (A const& lhs, A const& rhs); 

您當前混合什麼事是你可以在類範圍中聲明和定義這個自由函數,如friend,這將允許函數使用該類的私有成員(通常不允許自由函數)。

+0

謝謝你的幫助! –