C++ -- operator定義為friend function
在一個(gè)類(lèi)中,將operator定義為friend function有如下考量:friend function是對(duì)外公開(kāi)的,相比于class member調(diào)用更加方便;對(duì)于雙目運(yùn)算符的操作更加方便,如operator >>
在多數(shù)情況下,將運(yùn)算符重載成類(lèi)的成員函數(shù)和友元函數(shù)這兩種選擇都是可以的。但這兩者有各自的一些特點(diǎn):
1. 一般情況下,單目運(yùn)算符最好重載為類(lèi)的成員函數(shù);雙目運(yùn)算符最好重載成類(lèi)的友元函數(shù);
2. 以下雙目運(yùn)算符不能重載為類(lèi)的友元函數(shù):
??? =、()、[]、->
3. 類(lèi)型轉(zhuǎn)換函數(shù)只能定義為一個(gè)類(lèi)的成員函數(shù),而不能定義為類(lèi)的友元函數(shù);
4. 若一個(gè)運(yùn)算符的操作需要修改對(duì)象的狀態(tài),選擇重載為成員函數(shù)較好;
5. 若運(yùn)算符所需的操作數(shù)(尤其是第一個(gè)操作數(shù))希望有隱式類(lèi)型轉(zhuǎn)換,則只能選擇友元函數(shù);
6. 當(dāng)運(yùn)算符函數(shù)是一個(gè)成員函數(shù)時(shí),最左邊的操作數(shù)(或者只有最左邊的操作數(shù))必須是運(yùn)算符的一個(gè)類(lèi)對(duì)象(或者是對(duì)該對(duì)象的引用);
??? 如果左邊的操作數(shù)必須是一個(gè)不同類(lèi)的對(duì)象或者一個(gè)內(nèi)部類(lèi)型的對(duì)象,該運(yùn)算符函數(shù)必須作為一個(gè)友元函數(shù)來(lái)實(shí)現(xiàn);
7. 當(dāng)需要重載運(yùn)算符具有可交換性時(shí),選擇重載為友元函數(shù);
另外friend的二次運(yùn)算符的重載,可以限定第一個(gè)參數(shù)為const的類(lèi)型,這是成員函數(shù)無(wú)法做到的。