首頁考試吧論壇Exam8視線考試商城網(wǎng)絡(luò)課程模擬考試考友錄實用文檔求職招聘論文下載
2013中考
法律碩士
2013高考
MBA考試
2013考研
MPA考試
在職研
中科院
考研培訓(xùn) 自學考試 成人高考
四 六 級
GRE考試
攻碩英語
零起點日語
職稱英語
口譯筆譯
申碩英語
零起點韓語
商務(wù)英語
日語等級
GMAT考試
公共英語
職稱日語
新概念英語
專四專八
博思考試
零起點英語
托?荚
托業(yè)考試
零起點法語
雅思考試
成人英語三級
零起點德語
等級考試
華為認證
水平考試
Java認證
職稱計算機 微軟認證 思科認證 Oracle認證 Linux認證
公 務(wù) 員
導(dǎo)游考試
物 流 師
出版資格
單 證 員
報 關(guān) 員
外 銷 員
價格鑒證
網(wǎng)絡(luò)編輯
駕 駛 員
報檢員
法律顧問
管理咨詢
企業(yè)培訓(xùn)
社會工作者
銀行從業(yè)
教師資格
營養(yǎng)師
保險從業(yè)
普 通 話
證券從業(yè)
跟 單 員
秘書資格
電子商務(wù)
期貨考試
國際商務(wù)
心理咨詢
營 銷 師
司法考試
國際貨運代理人
人力資源管理師
廣告師職業(yè)水平
衛(wèi)生資格 執(zhí)業(yè)醫(yī)師 執(zhí)業(yè)藥師 執(zhí)業(yè)護士
會計從業(yè)資格
基金從業(yè)資格
統(tǒng)計從業(yè)資格
經(jīng)濟師
精算師
統(tǒng)計師
會計職稱
法律顧問
ACCA考試
注冊會計師
資產(chǎn)評估師
審計師考試
高級會計師
注冊稅務(wù)師
國際內(nèi)審師
理財規(guī)劃師
美國注冊會計師
一級建造師
安全工程師
設(shè)備監(jiān)理師
公路監(jiān)理師
公路造價師
二級建造師
招標師考試
物業(yè)管理師
電氣工程師
建筑師考試
造價工程師
注冊測繪師
質(zhì)量工程師
巖土工程師
造價員考試
注冊計量師
環(huán)保工程師
化工工程師
咨詢工程師
結(jié)構(gòu)工程師
城市規(guī)劃師
材料員考試
監(jiān)理工程師
房地產(chǎn)估價
土地估價師
安全評價師
房地產(chǎn)經(jīng)紀人
投資項目管理師
環(huán)境影響評價師
土地登記代理人
繽紛校園 實用文檔 英語學習 作文大全 求職招聘 論文下載 訪談|游戲
計算機等級考試
您現(xiàn)在的位置: 考試吧 > 計算機等級考試 > 計算機二級 > C加加 > 復(fù)習資料 > 正文

2013年計算機等考二級C++考點歸納:運算符重載

  第8章 運算符重載

  8.1 運算符函數(shù)據(jù)與運算符重載

  運算符重載是計算機語言固有多態(tài)性的體現(xiàn),是構(gòu)成計算機語言的基礎(chǔ)之一。

  C++把重載的運算符視為特殊的函數(shù),稱為運算符函數(shù)。運算符重載就是函數(shù)重載的一種特殊情況。像對待一般重載函數(shù)一樣,編譯系統(tǒng)能夠依據(jù)使用運算符的不同環(huán)境,即參數(shù)(操作數(shù))的數(shù)量或類型的差異,區(qū)分同一運算符的不同含義。

  “運算符重載”是針對C++中原有運算符進行的,不可能通過重載創(chuàng)造出新的運算符。除了。、。*、->*、::、?:這五個運算符外,其他運算符都可以重載。由于很多符號是一元運算符和二元運算符公用的,為了避免含混,不得為重載的運算符函數(shù)設(shè)置默認值,調(diào)用時也就不得省略實參。

  除了new和delete這兩個較為特殊運算符以外,任何運算符如果作為成員函數(shù)重載時不得重載為靜態(tài)函數(shù)。=、[ ]、()、->以及所有的類型轉(zhuǎn)換運算符只能作為成員函數(shù)重載,而且不能是針對枚舉類型操作數(shù)的重載。

  運算符函數(shù)的函數(shù)名是由運算符前加關(guān)鍵字operator構(gòu)成的,在聲明運算符或調(diào)用運算符時都可以用這個名稱。

  8.2 典范運算符的重載

  1.關(guān)于分數(shù)類fraction

  fraction的聲明和定義包含在頭文件fraction.h和程序文件fraction.cpp中。

  一個標準的用fraction表示的分數(shù)須滿足以下復(fù)印件:

 、俜帜赣肋h為正,分數(shù)和符號用分子表示;

 、诜肿臃帜富ベ|(zhì),即總表示為最簡分數(shù)。

  fraction通過兩個私有數(shù)據(jù)成員num和den分別保存分子和分母,并在必要時調(diào)用standardize函數(shù)進行標準化處理,以使num和den的值滿足標準分數(shù)的條件。gcd是求兩個整數(shù)的最大公約數(shù)的函數(shù),standardize在化簡分數(shù)時要調(diào)用它。

  2.重載取負運算符“-”

  因為fraction用分子的符號代表整個分數(shù)的符號,因此所謂“取負”只需對分子num取負就可以了。由于取負運算符“-”是一元運算符,當作為成員函數(shù)重載時參數(shù)表中沒有參數(shù),那個唯一的操作數(shù)以this指針的形式隱藏在參數(shù)表中。為此,只需要在fraction.h的類聲明中增加:

  fraction poerator -()const { return fraction(-num,den);}

  就可以了。由于在類聲明中直接給出了完整定義,因此是一個inline函數(shù)。

  “-”是一個典型的一元運算符,除++、--外的其他一元運算符的重載都可以參考這里描述的方法。

  3.重載加法運算符“+”

  “ +”是一個二元運算符,因此作為成員函數(shù)重載時參數(shù)表中只有一個參數(shù),對應(yīng)于第二操作數(shù),而第一操作數(shù)就是對象本身,僅以this指針的形式隱藏在參靈敏表中。

  “+”是一個典型的二元運算符,除賦值類運算符外的其他二元運算符的重載都可以參考這里描述的方法。

  4.重載增1運算符“+ +”

  + +既可以是前綴運算符(前增1),又可以是后綴運算符(后增1)。為了區(qū)分這兩種情況,重載這兩個運算符時必須在格式上有所區(qū)別:重載后綴+ +時必須多一個虛擬參數(shù):int,因此從形式上看像是一個二元運算符重載。

  5.重載類型轉(zhuǎn)換符“l(fā)ong”

  類型轉(zhuǎn)換符必須作為成員函數(shù)重載。在重載類型轉(zhuǎn)換符時,由于運算符本身已經(jīng)表示出返回值類型,因此不需要返回值類型的聲明。一個分數(shù)可以看成是由一個整數(shù)部分和一個純分數(shù)部分組成的,為了取得一個分數(shù)的整數(shù)部分,可為fraction重載類型轉(zhuǎn)換符long.為此可在fraction.h的類聲明中增加:

  opertator long()const { return num/den;}

  6.重載賦值運算符“=”

  賦值運算符只能作為成員函數(shù)重載。

  常見的真正需要重載賦值運算符的情況是:類中包含指向動態(tài)空間的指針

  賦值運算符=的重載應(yīng)注意以下幾點:

 、俜祷刂德暶鳛橐,而函數(shù)體中總是用語句return *this;返回;

 、谌绻麉(shù)被聲明為指向同類對象的引用或指針,應(yīng)判別所指向?qū)ο蟮氖欠衽c被賦值對象為同一對象,如果是,立即返回,不做任何賦值處理;

 、廴绻毁x值對象占用了動態(tài)空間或其他資源,應(yīng)首先釋放這些資源,以便接收新的資源;

 、苋绻麉(shù)被聲明為指針或引用,通常應(yīng)加上const修飾;

  ⑤如果參數(shù)被聲明為指針,應(yīng)判別是否為空,以便做出特殊處理;

 、抟粋類如果需要重載運算符=,通常也就需要定義自己特有的拷貝構(gòu)造函數(shù),反之亦然。

  7.重載復(fù)合賦值運算符“+=”

  重載復(fù)合賦值類運算符,如+=、-=等,也應(yīng)遵循上述重載賦值運算符的注意事項。

  與賦值運算符不同的是,復(fù)合賦值類運算符既可作為成員函數(shù)重載也可作為非成員函數(shù)重載。在后一種情況下,兩個操作數(shù)都必須出現(xiàn)在參數(shù)表中;為了保持運算符原有的特性,第一參數(shù)應(yīng)當聲明為引用(否則就無法改變它的值),返回值也應(yīng)當像重載“=”那樣聲明為引用,并在最后將獲得新值的第一參數(shù)返回。

  8.重載關(guān)系操作符“>”

  重載的關(guān)系操作符函數(shù)應(yīng)返回邏輯值。對于 fraction的兩個對象,可以通過比較通分后的兩個分子來確定它們的大小。為此,可在fraction.h的類聲明中增加如下的成員函數(shù)聲明:

  bool operator>(fraction f){ return num*f.den>f.num*den;}

  其他關(guān)系運算符可以參照重載。

  9重載下標訪問運算符“[ ]”

  運算符[ ]只能作為成員函數(shù)重載。

  10重載C+ +流運算符“”和“”

  C+ +流的輸入運算符和輸出運算符只能作為非類成員函數(shù)重載。在一個類中,如有必要,可將或聲明為友元函數(shù)。

  8.3 運算符重載應(yīng)注意的幾個問題

  1.重載的運算符應(yīng)保持其原有的基本語義

  重載的運算符應(yīng)該體現(xiàn)為原運算符的功能在新的數(shù)據(jù)類型上的延伸,它的使用應(yīng)當使程序中算法的表達顯得更流暢、自然,使閱讀程序的人在不借助于其他說明資料的情況下就能夠正確理解。不要讓重載的運算符去勉強承擔那些更適于一般函數(shù)承擔的功能。

  2.生載的運算符應(yīng)盡可能保持基原有的特性

  運算符的操作數(shù)個數(shù)、優(yōu)先級和結(jié)合性是三個最基本的特性,而且是重載時自然得以保持的特性,因此無須采取專門的措施。需要注意的是下面這些特性。

 、偈欠褚蟮谝徊僮鲾(shù)為有左值操作數(shù)。

 、谑欠裥薷牡谝徊僮鲾(shù)。

 、鄄僮鞯慕Y(jié)果是否為有左值數(shù)據(jù)。

  ④應(yīng)保證第二操作數(shù)不被改變。

  3.運算符的重載應(yīng)當配套

  某些運算符之間關(guān)系密切,存在著某種邏輯上的聯(lián)系,因此若需要重載其中的某一個,往往就意味著同組的其他運算符也需要重載。

  4.使用引用參數(shù)還是非引用參數(shù)?

  非引用參數(shù)的優(yōu)點是:以傳值方式傳遞參數(shù),形參變量只是實參的副本,對形參變量的修改不會影響實參;在相關(guān)對象存在只需一個實參的構(gòu)造函數(shù)的情況下,可以充分利用表達式處理過程中的自動轉(zhuǎn)換機制,使表達式顯得更自然。但當對象很大或需要深層復(fù)制時,非引用參數(shù)占用的計算機資源較多,影響參數(shù)傳遞的效率。

  引用參數(shù)的優(yōu)點是:當對象很大或需要深層復(fù)制時,可大大減少對資源的占用,提高參數(shù)傳遞的效率。但無法利用系統(tǒng)的自動轉(zhuǎn)換機制。

  5.作為成員函數(shù)重載還是作為非成員函數(shù)重載?

  =、[ ]、()、->以及所有的類型轉(zhuǎn)換運算符只能作為成員函數(shù)重載。如果允許第一操作數(shù)不是同類對象,而是其他數(shù)據(jù)類型,則只能作為非成員函數(shù)重開車(如輸入輸出流運算符和就是這樣的情況)。若希望系統(tǒng)在必要時能夠利用只需一個實參的構(gòu)造函數(shù)自動對第一操作數(shù)進行轉(zhuǎn)換,也應(yīng)將該運算符作為非成員函數(shù)重載;此種情況下,運算符函數(shù)的參數(shù)應(yīng)該是非引用參數(shù),否則不能達到所希望的效果。其他情況下一般應(yīng)作為成員函數(shù)重載。

1 2  下一頁
文章搜索
計算機等級考試欄目導(dǎo)航
版權(quán)聲明:如果計算機等級考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請與我們聯(lián)系800@exam8.com,我們將會及時處理。如轉(zhuǎn)載本計算機等級考試網(wǎng)內(nèi)容,請注明出處。