運算符重載

運算符重載使自定義類的對象能像內(nèi)置類型的變量一樣使用內(nèi)置的運算符淳衙,擴充運算符的功能幅慌,增強了C++ 語言的可擴充性疮薇。

注意點:

  • 不是所有的運算符都能重載
  • 重載不能改變運算符的優(yōu)先級和結合性
  • 重載不能改變運算符的操作數(shù)個數(shù)
  • 不能創(chuàng)建新的運算符

運算符重載的方法

C++中規(guī)定嚎花,重載函數(shù)名為operator@悼瘾,其中龟再,@為要重載的運算符书闸。如要重載+運算符,該重載函數(shù)名為operator+利凑。

函數(shù)原型

運算符的重載不能改變運算符的運算對象數(shù)浆劲。因此,重載函數(shù)的形式參數(shù)個數(shù)(包括成員函數(shù)的隱式指針this)與運算符的運算對象數(shù)相同 哀澈。
運算符重載可以重載成成員函數(shù)也可以重載成全局函數(shù)實現(xiàn)牌借。重載成全局函數(shù)時,最好把此函數(shù)設為友員函數(shù)割按。
如果作為類的成員函數(shù)膨报,它的形式參數(shù)個數(shù)比運算符的運算對象數(shù)少1。這是因為成員函數(shù)有一個隱含的參數(shù)this适荣。在C++中现柠,把隱含參數(shù)this作為運算符的第一個參數(shù)。
所以當把一個一元運算符重載成成員函數(shù)時弛矛,該函數(shù)沒有形式參數(shù)够吩。把一個二元運算符重載成成員函數(shù)時,該函數(shù)只有一個形式參數(shù)汪诉,就是右操作數(shù)废恋,當前對象是左操作數(shù)。

全局函數(shù) vs成員函數(shù)

大多數(shù)運算符都可以重載成成員函數(shù)或全局函數(shù)扒寄。
賦值=鱼鼓、下標[]、函數(shù)調(diào)用()和成員訪問->必須重載成成員函數(shù)该编。
具有賦值意義的運算符迄本,如復合的賦值運算符以及++和--,不一定非要定義為成員函數(shù)课竣,但最好定義為成員函數(shù)嘉赎。
具有兩個運算對象的運算符最好重載為全局函數(shù)置媳,這樣可以使得應用更加靈活。如果把加運算定義成全局函數(shù)公条,r是有理數(shù)類的對象拇囊,則2+r是一個合法的表達式。

特殊的運算符的重載

賦值運算符

一般情況下靶橱,缺省的賦值運算符重載函數(shù)能滿足用戶的需求寥袭。但是,當類含有類型為指針的數(shù)據(jù)成員時关霸,可能會帶來一些麻煩传黄。

賦值運算符只能重載成成員函數(shù),函數(shù)原型為:

class  &class::operator=(const class &tight)
{...}

一般來講队寇,需要拷貝構造函數(shù)的類也需要重載賦值運算符膘掰。定義對象時給對象賦初值調(diào)用的是拷貝構造函數(shù),程序的語句部分中的賦值語句調(diào)用的是賦值運算符重載函數(shù)佳遣。

下標運算符

下標運算符是二元運算符识埋,第一個運算數(shù)是數(shù)組名,第二個運算數(shù)是下標值苍日,下標運算符必須重載成成員函數(shù)惭聂。
函數(shù)原型為:

class & class::operator[](int index)
{...}

函數(shù)調(diào)用運算符

函數(shù)調(diào)用運算符()是一個二元運算符。它的第一個運算對象是函數(shù)名相恃,第二個參數(shù)是形式參數(shù)表。運算的結果是函數(shù)的返回值笨觅。
一個類重載了函數(shù)調(diào)用運算符拦耐,就可以把這個類的對象當做函數(shù)來使用

函數(shù)調(diào)用運算符必須重載成成員函數(shù),函數(shù)原型為:

函數(shù)的返回值   operator() (形式參數(shù)表)见剩;

++和—運算符的重載

++杀糯、--是一元操作符,這兩個操作符可以是前綴苍苞,也可以是后綴固翰。而且前綴和后綴的含義是有區(qū)別的。所以羹呵,必須有兩個重載函數(shù)骂际。
但兩個重載函數(shù)有相同的原型,區(qū)分方法在于:前綴:一元操作符冈欢。后綴:二元操作符歉铝。

作為成員函數(shù)重載:
++ob重載為:class &class::operator++()
ob-- 重載為:class class::operator--(int)
作為友元函數(shù)重載:
++ob重載為:operator++(class &ob)
ob--重載為:operator--(class &ob,int)
int沒有值的意義,僅僅起到區(qū)分作用凑耻,調(diào)用時太示,參數(shù)int一般傳遞給值0柠贤。

輸入輸出運算符重載

借助于流插入運算符>>和流提取運算符<<輸入和輸出用戶自定義類的對象。

輸入輸出運算符必須被重載成全局函數(shù)

輸入輸出運算符是二元運算符类缤,返回的是第一個對象的引用臼勉。由于第一個參數(shù)是輸入輸出流對象,只能重載為友元函數(shù)餐弱。

輸出運算符的重載
ostream & operator<<(ostream & os, const class &obj)
{
    os<< ....;
    return os;
}
輸入輸出運算符重載
istream & operator>>(istream & is, class &obj)
{
    is >> ....;
    return is;
} 

重載函數(shù)的原型設計考慮

參數(shù)設計

對于任何函數(shù)的參數(shù)坚俗,如果僅需要從參數(shù)中讀,而不改變它岸裙,一般用const引用來傳遞猖败。
只有會修改左值參數(shù)的運算符,如賦值運算符降允,左值參數(shù)不是常量恩闻,所以用地址傳遞。

返回值的類型設計

運算符的結果產(chǎn)生一個新值剧董,就需要產(chǎn)生一個作為返回值的新對象幢尚。
對于邏輯運算符,人們希望至少得到一個int或bool的返回值翅楼。
所有的賦值運算符(如尉剩,=,+=等)均改變左值毅臊,應該能夠返回一個剛剛改變了的左值的非常量引用理茎。

自定義類型轉換運算符

內(nèi)置類型到類類型的轉換

利用構造函數(shù)進行轉換。例如管嬉,對于Rational類的對象r皂林,可以執(zhí)行r=2。 此時蚯撩,編譯器隱式地調(diào)用Rational的構造函數(shù)础倍,傳給它一個參數(shù)2。構造函數(shù)將構造出一個num=2胎挎,den= 1的Rational類的對象沟启,并將它賦給r。

explicit構造函數(shù)

任何單參數(shù)的構造函數(shù)都可以被編譯器用來執(zhí)行隱式轉換犹菇,即把內(nèi)置類型轉換成對應的類類型德迹。
在某些情況下,隱式轉換是不受歡迎的项栏。
將單參數(shù)的構造函數(shù)定義為explicit浦辨,將告訴編譯器不允許執(zhí)行隱式轉換。
如將Ratioanal類的構造函數(shù)定義成

 explicit Rational(int n1 = 0, int n2 = 1)

則對于Rational類的對象r1和r2,執(zhí)行r1 = 2 + r2流酬;編譯器就會報錯币厕。

類類型到其它類型的轉換

可以通過類型轉換函數(shù)實現(xiàn),類型轉換函數(shù)必須重載成成員函數(shù)芽腾。
類型轉換函數(shù)的格式:

operator type() const 
{
    return (結果為目標類型的表達式);
}

類型轉換函數(shù)的特點:無參數(shù)旦装,無返回值,是const函數(shù)摊滔。

有了這個函數(shù)阴绢,我們可以將一個Rational類的對象r賦給一個type類型的變量x。如r的值為(1艰躺,3)呻袭,經(jīng)過賦值double x = r后,x的值為0.333333腺兴。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末左电,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子页响,更是在濱河造成了極大的恐慌篓足,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闰蚕,死亡現(xiàn)場離奇詭異栈拖,居然都是意外死亡,警方通過查閱死者的電腦和手機没陡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門涩哟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诗鸭,你說我怎么就攤上這事染簇。” “怎么了强岸?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長砾赔。 經(jīng)常有香客問我蝌箍,道長,這世上最難降的妖魔是什么暴心? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任妓盲,我火速辦了婚禮,結果婚禮上专普,老公的妹妹穿的比我還像新娘悯衬。我一直安慰自己,他們只是感情好檀夹,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布筋粗。 她就那樣靜靜地躺著策橘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪娜亿。 梳的紋絲不亂的頭發(fā)上丽已,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機與錄音买决,去河邊找鬼沛婴。 笑死,一個胖子當著我的面吹牛督赤,可吹牛的內(nèi)容都是我干的嘁灯。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼躲舌,長吁一口氣:“原來是場噩夢啊……” “哼丑婿!你這毒婦竟也來了?” 一聲冷哼從身側響起孽糖,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤枯冈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后办悟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尘奏,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年病蛉,在試婚紗的時候發(fā)現(xiàn)自己被綠了炫加。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡铺然,死狀恐怖俗孝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情魄健,我是刑警寧澤赋铝,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站沽瘦,受9級特大地震影響革骨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜析恋,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一良哲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧助隧,春花似錦筑凫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滓技。三九已至,卻和暖如春蔫浆,著一層夾襖步出監(jiān)牢的瞬間殖属,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工瓦盛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留洗显,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓原环,卻偏偏與公主長得像挠唆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嘱吗,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

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

  • C++語言的一個很有意思的特性就是除了支持函數(shù)重載外還支持運算符重載玄组,原因就是在C++看來運算符也算是一種函數(shù)。比...
    歐陽大哥2013閱讀 2,710評論 0 8
  • C++運算符重載-上篇 本章內(nèi)容:1. 運算符重載的概述2. 重載算術運算符3. 重載按位運算符和二元邏輯運算符4...
    Haley_2013閱讀 2,305評論 0 51
  • 寫在開頭:本人打算開始寫一個Kotlin系列的教程谒麦,一是使自己記憶和理解的更加深刻俄讹,二是可以分享給同樣想學習Kot...
    胡奚冰閱讀 842評論 1 1
  • C++運算符重載-下篇 本章內(nèi)容:1. 運算符重載的概述2. 重載算術運算符3. 重載按位運算符和二元邏輯運算符4...
    Haley_2013閱讀 1,445評論 0 49
  • 注意:本文中代碼均使用 Qt 開發(fā)編譯環(huán)境 面向對象的多態(tài)性可以分為四類:重載多態(tài)、強制多態(tài)绕德、包含多態(tài)和參數(shù)多態(tài)患膛,...
    趙者也閱讀 1,145評論 0 3