技術(shù)交流QQ群:1027579432鸭限,歡迎你的加入!
1.C++操作符重載形式---成員函數(shù)or友元函數(shù)
- 1.對(duì)運(yùn)算符重載两踏,需要堅(jiān)持四項(xiàng)基本原則:
- 不可臆造運(yùn)算符败京;
- 運(yùn)算符原有操作數(shù)的個(gè)數(shù)、優(yōu)先級(jí)和結(jié)合性不能改變缆瓣;
- 操作數(shù)中至少一個(gè)是自定義類型喧枷;
- 保持重載運(yùn)算符的自然含義虹统。
- 一般來說弓坞,C++運(yùn)算符重載可采用成員函數(shù)和友元函數(shù)隧甚,二者都可以訪問類的私有成員,那么該采用哪一種呢渡冻?首先看一下二者的區(qū)別戚扳。
- 當(dāng)重載為成員函數(shù)時(shí),會(huì)隱含一個(gè)this指針族吻;當(dāng)重載為友元函數(shù)時(shí)帽借,不存在隱含的this指針,需要在參數(shù)列表中顯示地添加操作數(shù)
- 當(dāng)重載為成員函數(shù)時(shí)超歌,只允許右參數(shù)的隱式轉(zhuǎn)換砍艾;當(dāng)重載為友元函數(shù)時(shí),能夠接受左參數(shù)和右參數(shù)的隱式轉(zhuǎn)換
- 如下代碼:
class String{ public: String(char *str); private: char *ptr; };
- 因?yàn)镾tring的構(gòu)造函數(shù)參數(shù)為一個(gè)char*巍举,所以如果采用友元形式的friend String operator+(const String &A, const String &B)脆荷,那么char+String和String+char都能正常工作;而如果采用成員函數(shù)形式String::operator+(const String &A)懊悯,則只能接受String+char蜓谋,如果執(zhí)行char+String則會(huì)編譯出錯(cuò)。我們往往習(xí)慣String+char和char+String都應(yīng)該被接受炭分。需要注意的是桃焕,隱式轉(zhuǎn)換由于臨時(shí)變量的增加往往效率不高。如果應(yīng)用程序?qū)π室筝^高捧毛,針對(duì)以上類观堂,建議選擇定義多個(gè)運(yùn)算符的友元重載版本:
String & operator+(const String &A, const String &B); String & operator+(const char *str, const String &B); String & operator+(const String &A, const char *str);
-
一般而言,對(duì)于雙目運(yùn)算符岖妄,最好將其重載為友元函數(shù)型将;而對(duì)于單目運(yùn)算符,則最好重載為成員函數(shù)荐虐。但是也存在例外情況七兜。有些雙目運(yùn)算符是不能重載為友元函數(shù)的,比如賦值運(yùn)算符=福扬、函數(shù)調(diào)用運(yùn)算符()腕铸、下標(biāo)運(yùn)算符[]、指針運(yùn)算符->等铛碑,因?yàn)檫@些運(yùn)算符在語義上與this都有太多的關(guān)聯(lián)狠裹。比如=表示“將自身賦值為…”,[]表示“自己的第幾個(gè)元素”汽烦,如果將其重載為友元函數(shù)涛菠,則會(huì)出現(xiàn)語義上的不一致。還有一個(gè)需要特別說明的就是輸出運(yùn)算符<<。因?yàn)?lt;<的第一個(gè)操作數(shù)一定是ostream類型俗冻,所以<<只能重載為友元函數(shù)礁叔,如下:
friend ostream & operator <<(ostream &os, const Complex &c); ostream& operator <<(ostream &os, const Complex &c) { os << c.m_Real << “+” << c.m_Imag << “i” << endl; return os; }