版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第第6章章 運算符重載運算符重載第第1章章 基本數(shù)據(jù)與表達(dá)式基本數(shù)據(jù)與表達(dá)式 6.1 運算符重載的實質(zhì) 6.2 用友元函數(shù)和成員函數(shù)重載運算符的異同 6.3 +和- - 運算符的重載本章主要內(nèi)容運算符重載的概念、規(guī)則以及兩種重要的重載形式。幾種特殊的運算符重載方法與應(yīng)用實例。 問題的引入 C+編程中,程序員可以使用內(nèi)置類型,也可以定義新類型。內(nèi)置類型可以和C+的豐富運算符集合一起使用。運算符為程序員提供了表達(dá)內(nèi)置類型對象操作的準(zhǔn)確概念。對于表達(dá)式5+7來說,編譯器在處理它時,并不需要知道符號“+”表示什么意思,它可以將這個表達(dá)式解釋成函數(shù)調(diào)用的形式: operator+(5,7)在C+中,op
2、erator是關(guān)鍵字,它經(jīng)常和C+中的一個運算符聯(lián)用,表示一個運算符函數(shù)名,也稱重載運算符函數(shù)。重載運算符函數(shù)可以完成和運算符同樣的功能,但功能更強。可見,運算符重載是通過重載函數(shù)來完成的。運算符重載的目的在于可以使用現(xiàn)有的運算符去作用于更為復(fù)雜的運算對象。例如,對于兩個浮點數(shù)的加法可以用普通運算符完成: float x=2.0,y=3.0,z;z=x+y;下面的程序用于說明重載函數(shù)下面的程序用于說明重載函數(shù)operator+(),以使它可以按對復(fù)數(shù)進行加操,以使它可以按對復(fù)數(shù)進行加操作的語義執(zhí)行兩個復(fù)數(shù)的加操作作的語義執(zhí)行兩個復(fù)數(shù)的加操作。例例 6.1 兩個復(fù)數(shù)相加的運算符重載實現(xiàn)兩個復(fù)數(shù)相
3、加的運算符重載實現(xiàn)/例6-1.cpp#includeclass complexfloat real;float imag; public:complex(float r=0,float i=0) real=r; imag=i; void show() coutreal+ imag”j”operator#()或obj.operator#()。在一個類中,重載二元運算符的一般形式為: 類型 類名:operator#(參數(shù)) /相對于該類而定義的操作 由于類中的成員函數(shù)帶有一個this參數(shù),所以在類中重載二元運算符時,只能指定一個參數(shù)。若有某類的兩個對象obj1和obj2,則表達(dá)式obj1#obj2
4、被編譯器解釋成obj.operator#(obj2)或this-operator#(obj2)。例例 6.2 對例對例6.1的擴展的擴展/例6-2.cpp#includeclass complexfloat real;float imag;public:complex(float r=0,float i=0) real=r; imag=i; complex operator+(complex &c) float r=real+c.real; float i=imag+c.imag; return complex(r,i);complex operator-(complex &c) float
5、r=real-c.real; float i=imag-c.imag; return complex(r,i);complex operator-() return complex(-real,-imag); void show() cout(real,imag)endl; ;void main() complex c1(2.5,3.7),c2(4.2,6.5); complex c; c=c1-c2; c.show(); c=c1+c2; c.show(); c=-c1; c.show();6.1.3 規(guī)則限制規(guī)則限制 C+對運算符重載也有一些限制。首先,不能更改任何運算符的優(yōu)先級;其次,不
6、可改變此運算符所需要的操作數(shù)的數(shù)目。最后,除了“=”以外,重載運算符都可以為任何派生類所繼承。多數(shù)C+運算符都可以重載。這些運算符如圖6.1所示。圖6.2列出了不能重載的運算符。表 6.1 可以重載的運算符可以重載的運算可以重載的運算符符+ */%&|!=+= =*=/=%=&=|=!=&|+ *()newdeletenewdelete不能重載的運算符.*:?:sizeof表 6.2 不能重載的運算符6.2 6.2 用友元函數(shù)和成員函數(shù)重載運算符的異同用友元函數(shù)和成員函數(shù)重載運算符的異同 當(dāng)運算符重載為類的成員函數(shù)時,函數(shù)的參數(shù)個數(shù)比原來的操作數(shù)要少一個(后置單目運算符除外),這是因為成員函數(shù)
7、用this指針隱式地訪問了類的一個對象,它充當(dāng)了運算符函數(shù)最左邊的操作數(shù)。因此:1. 雙目運算符重載為類的成員函數(shù)時,函數(shù)只顯式說明一個參數(shù),該形參是運算符的右操作數(shù)。如a + b = a.Add(b)2. 前置單目運算符重載為類的成員函數(shù)時,不需要顯式說明參數(shù),即函數(shù)沒有形參。如+i= i.prePlus()3. 后置單目運算符重載為類的成員函數(shù)時,函數(shù)要帶有一個整型形參。如 i+=i.sufPlus(int )調(diào)用成員函數(shù)運算符的格式如下:.operator () 它等價于 一個運算符函數(shù)可能是一類的友元而不是成員。友元函數(shù)沒有隱含的this指針,因此,當(dāng)一友元被用來重載一運算符時,如果該
8、運算符是雙目的,則兩個操作數(shù)都被明確地傳遞給運算符;如果該操作符是單目的,那么就傳遞單個操作數(shù)。僅有的不能使用友元函數(shù)來進行運算符重載的運算符是“=”、“()”、“”、“-”,其余的運算符可以使用成員或友元函數(shù)來實現(xiàn)運算符的重載。運算符重載為類的友元函數(shù)的一般格式為:friend operator ()當(dāng)運算符重載為類的友元函數(shù)時,由于沒有隱含的this指針,因此操作數(shù)的個數(shù)沒有變化,所有的操作數(shù)都必須通過函數(shù)的形參進行傳遞,函數(shù)的參數(shù)與操作數(shù)自左至右一一對應(yīng)。調(diào)用友元函數(shù)運算符的格式如下:operator (,) 它等價于 例如:a+b等價于operator +(a,b)。例例 6.3 復(fù)數(shù)
9、運算的友元函數(shù)重載形式復(fù)數(shù)運算的友元函數(shù)重載形式/例6-3.cpp#includeclass complexfloat real,imag; public:complex(float r=0,float i=0) real=r; imag=i; void show() cout(real,imag) 3. 類型轉(zhuǎn)換函數(shù)只能定義為一個類的成員函數(shù)而不能定義為類的友元函數(shù)。 4. 若一個運算符的操作需要修改對象的狀態(tài),選擇重載為成員函數(shù)較好。 5. 若運算符所需的操作數(shù)(尤其是第一個操作數(shù))希望有隱式類型轉(zhuǎn)換,則只能選用友元函數(shù)。 6. 當(dāng)運算符函數(shù)是一個成員函數(shù)時,最左邊的操作數(shù)(或者只有最左邊
10、的操作數(shù))必須是運算符類的一個類對象(或者是對該類對象的引用)。如果左邊的操作數(shù)必須是一個不同類的對象,或者是一個內(nèi)部類型的對象,該運算符函數(shù)必須作為一個友元函數(shù)來實現(xiàn)。 7. 當(dāng)需要重載運算符具有可交換性時,選擇重載為友元函數(shù)。 增量和減量運算符(算前增量、算后增量、算前減量和算后減量)都可以重載。 例如,假設(shè)我們希望在用戶定義Date對象d1的天數(shù)中加1。當(dāng)編譯程序看見算前增量表達(dá)式 +d1 時,編譯程序產(chǎn)生成員函數(shù)調(diào)用:d1.operator+() 它的原型是:Date &operator+(); 如果算前增量作為非成員函數(shù)實現(xiàn),則當(dāng)編譯程序看見表達(dá)式 +d1 時,編譯程序產(chǎn)生函數(shù)調(diào)用:
11、operator+( d1 )其原型可以在Date類中聲明如下:friend Date &operator+( Date & );當(dāng)編譯程序看見算后增量運算符表達(dá)式d1+ ,便產(chǎn)生成員函數(shù)調(diào)用:d1.operator+( 0 )它的原型是:Date operator+( int )其中,0是嚴(yán)格的“啞元值”,使用于算后增量的operator+的參數(shù)列表可以和用于算前增量的operator+參數(shù)列表相區(qū)別。如果算后增量作為非成員函數(shù)實現(xiàn),則當(dāng)編譯程序看見表達(dá)式 d1+ 時,編譯程序?qū)a(chǎn)生函數(shù)調(diào)用:operator+( d1, 0 )它的原型將是:friend Date operator+( Da
12、te &, int );再次重申,編譯程序使用0這個參數(shù),這樣,用于算后增量的operator+的參數(shù)列表可以和算前增量的參數(shù)列表區(qū)分。例例 6.4 +運算符重載的例子運算符重載的例子/例6-4.cpp#include class Date int mo, da, yr; static int dys;public: Date(int m=0, int d=0, int y=0) mo = m; da = d; yr = y; void display() const cout n mo / da / dysdt.mo-1) n -= dysdt.mo-1; if (+dt.mo = 13) dt.mo = 1; dt.yr+; dt.da = n; return dt;關(guān)于+和-運算符的重載的一點說明如下:對于“+” 和“-”這兩個一元運算符,存在前置和后置的問題,在定義時必須有所區(qū)分。(1)用成員函數(shù)的形式來進行重載如果+為前增量運算符時,重載函數(shù)的一般格式為: ClassName : operator + ( )/如果+為后增量運算符時,重載函數(shù)的一般格式為: ClassName : operator + ( int )/(2)非成員函數(shù)形式
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二四年體育賽事贊助合同詳細(xì)條款與權(quán)益分配3篇
- 2025年度跨國公司美金貸款合同
- 二零二五年度水稻種植基地建設(shè)合同
- 2025版離婚協(xié)議書范本:房產(chǎn)買賣合同分割及處理細(xì)則4篇
- 2025年度脫硫石膏復(fù)合材料銷售協(xié)議3篇
- 2025年冰箱洗衣機節(jié)能補貼項目合作協(xié)議3篇
- 2025年度離婚協(xié)議書:陳飛與劉婷離婚財產(chǎn)分割及子女撫養(yǎng)費協(xié)議4篇
- 二零二五年度老舊小區(qū)消防隱患排查與整改承包合同2篇
- 二零二四云存儲服務(wù)與云原生應(yīng)用部署合同3篇
- 貨物運輸協(xié)議
- ICU常見藥物課件
- CNAS實驗室評審不符合項整改報告
- 農(nóng)民工考勤表(模板)
- 承臺混凝土施工技術(shù)交底
- 臥床患者更換床單-軸線翻身
- 計量基礎(chǔ)知識培訓(xùn)教材201309
- 中考英語 短文填詞、選詞填空練習(xí)
- 一汽集團及各合資公司組織架構(gòu)
- 阿特拉斯基本擰緊技術(shù)ppt課件
- 初一至初三數(shù)學(xué)全部知識點
- 新課程理念下的班主任工作藝術(shù)
評論
0/150
提交評論