2010-12-06 83 views
7

當您將班級的成員功能變成朋友時,會發生什麼?!將會員功能設爲朋友

下面的代碼編譯並運行。如果沒有朋友聲明,會產生「運算符的參數過多」(並且正確)。我意識到這樣做沒有任何意義,但任何人都可以告訴我這裏發生了什麼?朋友是否強制編譯器以某種方式忽略默認的這個參數?

class Test 
{ 
public: 
    friend bool operator<(Test& lhs, Test& rhs) 
    { 
    return true; 
    } 
}; 

int main(int c, char** argv) 
{ 
    Test test1; 
    Test test2; 

    return test1 < test2; 
} 
+1

要回答你的問題:朋友不能成爲C++ 03中的友誼類的成員,但這是允許在C++ 0x。 – 2010-12-06 05:07:44

回答

9

不同的是,一個朋友是不是即使整個定義出現在類中的成員;相反,該函數放置在周圍的命名空間中。所以,沒有this指針。雖然成員operator<this和顯式右側參數上隱式操作,但friend需要顯式提供左側和右側參數作爲函數參數 - 因此是額外參數。你的friend版本相當於把這個功能放在課後,除了它有權訪問privateprotected成員和基地,並且隱含地是inline(儘管這並不意味着編譯器必須內聯它 - 這只是一個提示,但關於一個定義規則很重要,因爲您的許多翻譯單元可以包含您的功能,並且鏈接沒有問題)。

1

當你犯了一個類的成員函數本身的一個朋友發生了什麼!

這沒有任何意義。一個類的成員函數怎樣才能成爲同類的朋友

您已經將operator <作爲好友函數(而不是成員函數)重載。在課堂內提供朋友功能的定義(正文)是合法的。然而,它是非法使用this其定義中

friend bool operator<(Test& lhs, Test& rhs) 
{ 
    *this ; //error 
    return true; 
}