成員函數(shù)重載運(yùn)算符和友元函數(shù)重載運(yùn)算符

先上題:下列運(yùn)算符都可以被友元函數(shù)重載的是:
A) =,+,-,
B) [],+,(),new
C) ->,+,,>>
D) <<,>>,+,

正確答案為D

在運(yùn)算符重載示惊,友元函數(shù)運(yùn)算符重載函數(shù)與成員運(yùn)算符重載函數(shù)的區(qū)別是:友元函數(shù)沒有this指針逐虚,而成員函數(shù)有汰瘫,因此迎膜,在兩個(gè)操作數(shù)的重載中友元函數(shù)有兩個(gè)參數(shù)敌呈,而成員函數(shù)只有一個(gè)。

重載運(yùn)算符的基本原則:

  1. 為了防止用戶對(duì)標(biāo)準(zhǔn)類型進(jìn)行運(yùn)算符重載鞋仍,C++規(guī)定重載后的運(yùn)算符的操作對(duì)象必須至少有一個(gè)是用戶定義的類型
    比如說現(xiàn)在有兩個(gè)數(shù):int number1,int number2常摧,
    那么number1+number2 求的是兩個(gè)數(shù)的和,
    但是如果你重載以后讓著兩個(gè)數(shù)相加為他們的乘積威创,這肯定是不合乎邏輯的落午。
    可能重載以后會(huì)有二義性,導(dǎo)致程序不知道該執(zhí)行哪一個(gè)(是自帶的的還是重載后的函數(shù))
  2. 使用運(yùn)算符不能違法運(yùn)算符原來的句法規(guī)則。如不能將% 重載為一個(gè)操作數(shù)
  3. 不能修改運(yùn)算符原先的優(yōu)先級(jí)
  4. 不能創(chuàng)建一個(gè)新的運(yùn)算符肚豺,例如不能定義operator** (···)來表示求冪
  5. 不能進(jìn)行重載的運(yùn)算符
    .:成員訪問運(yùn)算符
    ., ->:成員指針訪問運(yùn)算符
    :::域運(yùn)算符
    sizeof:長度運(yùn)算符
    ?::條件運(yùn)算符
    #: 預(yù)處理符號(hào)

下面比較成員函數(shù)和非成員函數(shù)(友元函數(shù))重載運(yùn)算符

  1. 對(duì)雙目運(yùn)算符而言板甘,成員函數(shù)重載運(yùn)算符的函數(shù)參數(shù)表中只有一個(gè)參數(shù),而用友元函數(shù)重載運(yùn)算符函數(shù)參數(shù)表中含有兩個(gè)參數(shù)详炬。
    對(duì)單目運(yùn)算符來說,成員函數(shù)重載運(yùn)算符的函數(shù)參數(shù)表中沒有參數(shù)寞奸,而用友元函數(shù)重載運(yùn)算符函數(shù)參數(shù)表中含有一個(gè)函數(shù)呛谜。這個(gè)問題要搞清楚,有一個(gè)this指針的問題
  2. 雙目運(yùn)算符一般可以用友元函數(shù)重載和成員函數(shù)重載枪萄,但有一種情況只可以用友元函數(shù)重載隐岛。
    即:雙目運(yùn)算符左邊的變量是一個(gè)常量,而不是對(duì)象4煞>郯肌!這點(diǎn)很重要的額齐帚。比如說string妒牙,左邊是一個(gè)const char*
    string str = "test";
    string ok = "testtest" + str;
    //這樣的運(yùn)算符必須是友元,因?yàn)樗牡谝粋€(gè)參數(shù)是char* 類型对妄,相當(dāng)于調(diào)用 operator (char , string str)
    string oook = str + "testset"; //這個(gè)就必須是成員函數(shù)湘今,因?yàn)榈谝粋€(gè)str+ 表示調(diào)用str的成員函數(shù)operator+(char
    )

所以說,單目運(yùn)算符建議選擇成員函數(shù)剪菱。

下面是重點(diǎn)

只能作為成員函數(shù)重載的四個(gè)操作符

=摩瞎,(),[]孝常,->
原因很簡(jiǎn)單旗们,會(huì)和編譯器默認(rèn)分配的運(yùn)算符重載成員函數(shù)沖突,引發(fā)歧義构灸。
我們知道友元函數(shù)不是類的成員函數(shù)上渴,它只是類的“朋友“,具有訪問把它聲明為“朋友”的類的數(shù)據(jù)成員的權(quán)限而已。
那么當(dāng)把賦值運(yùn)算符重載為類的友員函數(shù)驰贷,在程序中執(zhí)行類對(duì)象的賦值語句時(shí)盛嘿,程序就會(huì)出現(xiàn)兩種矛盾的選擇。

  1. 因?yàn)樗J(rèn)為類中并沒有重載賦值運(yùn)算符的成員函數(shù)括袒,所以它根據(jù)C++的規(guī)則次兆,會(huì)去調(diào)用相應(yīng)的構(gòu)造函數(shù)。
  2. 但是在全局里锹锰,我們已經(jīng)重載了參數(shù)類型為此類類型的賦值運(yùn)算符函數(shù)芥炭,而這賦值語句剛好和這函數(shù)匹配上了,根據(jù)C++的規(guī)則恃慧,也會(huì)去調(diào)用這函數(shù)园蝠。

程序是不允許有矛盾不確定選擇的,所以當(dāng)賦值運(yùn)算符重載為類的友元函數(shù)時(shí)痢士,編譯器就會(huì)提示錯(cuò)誤彪薛。
對(duì)于剩下的3個(gè)運(yùn)算符 ->, [], () 為什么不能重載為友元函數(shù),也是跟上面一樣的道理怠蹂。即編譯器發(fā)現(xiàn)當(dāng)類中沒有定義這3個(gè)運(yùn)算符的重載成員函數(shù)時(shí)善延,就會(huì)自己加入默認(rèn)的運(yùn)算符重載成員函數(shù)。

那么下面這個(gè)題的答案也就很明顯了:
將x+y*z中的“+”用成員函數(shù)重載城侧,“*”用友元函數(shù)重載應(yīng)該寫為:易遣?
答案為:x.operator+(operator*(y,z))

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嫌佑,隨后出現(xiàn)的幾起案子豆茫,更是在濱河造成了極大的恐慌,老刑警劉巖屋摇,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揩魂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡炮温,警方通過查閱死者的電腦和手機(jī)肤京,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茅特,“玉大人忘分,你說我怎么就攤上這事“仔蓿” “怎么了妒峦?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長兵睛。 經(jīng)常有香客問我肯骇,道長窥浪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任笛丙,我火速辦了婚禮漾脂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胚鸯。我一直安慰自己骨稿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布姜钳。 她就那樣靜靜地躺著坦冠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哥桥。 梳的紋絲不亂的頭發(fā)上辙浑,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音拟糕,去河邊找鬼判呕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛送滞,可吹牛的內(nèi)容都是我干的佛玄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼累澡,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了般贼?” 一聲冷哼從身側(cè)響起愧哟,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哼蛆,沒想到半個(gè)月后蕊梧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腮介,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年肥矢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叠洗。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甘改,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出灭抑,到底是詐尸還是另有隱情十艾,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布腾节,位于F島的核電站忘嫉,受9級(jí)特大地震影響荤牍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜庆冕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一康吵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧访递,春花似錦晦嵌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至跌前,卻和暖如春棕兼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抵乓。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工伴挚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人灾炭。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓茎芋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蜈出。 傳聞我的和親對(duì)象是個(gè)殘疾皇子田弥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • C++運(yùn)算符重載-下篇 本章內(nèi)容:1. 運(yùn)算符重載的概述2. 重載算術(shù)運(yùn)算符3. 重載按位運(yùn)算符和二元邏輯運(yùn)算符4...
    Haley_2013閱讀 1,440評(píng)論 0 49
  • C++運(yùn)算符重載-上篇 本章內(nèi)容:1. 運(yùn)算符重載的概述2. 重載算術(shù)運(yùn)算符3. 重載按位運(yùn)算符和二元邏輯運(yùn)算符4...
    Haley_2013閱讀 2,296評(píng)論 0 51
  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,148評(píng)論 0 13
  • 小時(shí)候 孤獨(dú)是迷藏游戲 你找不到我我找不到你 長大后 孤獨(dú)如下象棋 半天一步大家早已離去 現(xiàn)在呀 孤獨(dú)塞進(jìn)了手機(jī) ...
    yangxian_阿泱閱讀 253評(píng)論 11 9
  • 開篇: 謝謝大家一日既往的對(duì)我的支持---→via@小思設(shè)計(jì) 記錄: 從2012年的雙十二開始只泼,截止到2017年6...
    小思設(shè)計(jì)閱讀 713評(píng)論 0 1