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