版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第六章 運(yùn)算符重載,引言,運(yùn)算符和函數(shù),4=1 + 3,4.0=1.0 + 3.0,函數(shù)名,參數(shù)int,返回值int,函數(shù)名,參數(shù)double,返回值double,int + (int, int );,double + (double, double );,可以將+代表的操作看成一個(gè)函數(shù):+為函數(shù)的名字,+操作的兩個(gè)操作數(shù)的類型即為函數(shù)形參的類型,+操作的結(jié)果的類型即為函數(shù)的返回值類型。,引言,運(yùn)算符重載的提出,C/C+中,每種基本數(shù)據(jù)類型的變量都可通過(guò)幾種運(yùn)算符來(lái)做相關(guān)計(jì)算,如int型變量,它們可以同“+”,“-”,“*”,“/”等運(yùn)算符來(lái)做加法,減法,乘法,除法等。如:,int a, b;
2、 a+b; a-b; a*b; a/b;,class Vector int * data; int num; public: ,我們能否將自定義的類的對(duì)象也通過(guò)“+”,“-”,“*”,“/”等運(yùn)算符來(lái)進(jìn)行兩個(gè)對(duì)象的加,減,乘,除呢?如:,Vector vec1,vec2; vec1+vec2; vec1-vec2; vec1*vec2; vec1/vec2;,定義一個(gè)向量類,兩個(gè)向量類對(duì)象的加減乘除,C+提供了運(yùn)算符重載機(jī)制來(lái)幫助我們實(shí)現(xiàn)上述目的。,主要內(nèi)容,6.1 基本語(yǔ)法 6.2 常用運(yùn)算符的重載 6.3 賦值運(yùn)算符的重載 6.4 輸入輸出運(yùn)算符的重載 6.5 運(yùn)算符的重載 6.6 用戶自
3、定義類型轉(zhuǎn)換,6.1 基本語(yǔ)法,在C+ 中,為一個(gè)類類型定義運(yùn)算符函數(shù)和定義普通函數(shù)的形式很相似,只是函數(shù)的名字是關(guān)鍵字operator后緊跟要重載的運(yùn)算符。例如,重載的”+” 運(yùn)算符函數(shù)名字為operator+。定義了運(yùn)算符函數(shù)之后,就可以對(duì)類類型的操作數(shù)使用該運(yùn)算符。運(yùn)算符函數(shù)聲明的語(yǔ)法規(guī)則如下:,friend 類型名 operator運(yùn)算符(形參列表);,friend 關(guān)鍵字可選,有friend關(guān)鍵字時(shí)表示運(yùn)算符函數(shù)是類的友元函數(shù),沒(méi)有friend關(guān)鍵字時(shí)表示運(yùn)輸符函數(shù)是類的成員函數(shù)或普通函數(shù)。,6.1 基本語(yǔ)法,運(yùn)算符函數(shù)聲明的語(yǔ)法規(guī)則如下:,friend 類型名 operator運(yùn)算
4、符(形參列表);,形式列表中參數(shù)的個(gè)數(shù)取決于兩個(gè)因素:,運(yùn)算符是一元運(yùn)算符還是二元運(yùn)算符 運(yùn)算符函數(shù)是成員函數(shù)還是友元函數(shù),6.1 基本語(yǔ)法,C+中內(nèi)被重載的運(yùn)算符有:,C+中不能被重載的運(yùn)算符有:,6.1 基本語(yǔ)法,注意事項(xiàng),雖然運(yùn)算符重載提供了語(yǔ)法上的方便,但也有一些使用限制。 只有C+預(yù)定義運(yùn)算符集合中的運(yùn)算符才可以重載 C+中有些運(yùn)算符不能被重載::(作用域解析符)、.(成員選擇符)、.*(成員指針間接引用符)及?:(條件運(yùn)算符)。 不能定義C+中沒(méi)有的運(yùn)算符,如operator*會(huì)產(chǎn)生編譯錯(cuò)誤。,6.1 基本語(yǔ)法,注意事項(xiàng),內(nèi)置類型的運(yùn)算符的預(yù)定義意義不能改變,也不能為內(nèi)置數(shù)據(jù)類型定
5、義其他運(yùn)算符。例如,不能定義內(nèi)置數(shù)組的operator+。 重載運(yùn)算符不能改變運(yùn)算符的優(yōu)先級(jí)和結(jié)合性。 重載運(yùn)算符不能改變操作數(shù)的個(gè)數(shù)。 運(yùn)算符重載不能濫用,只有當(dāng)用戶自定義類型上的操作與內(nèi)置運(yùn)算符之間存在邏輯對(duì)應(yīng)關(guān)系時(shí),重載的運(yùn)算符才能使程序顯得更自然、更直觀。,6.2 常用運(yùn)算符的重載,一元運(yùn)算符的重載,本節(jié)給出一些常規(guī)運(yùn)算符以成員函數(shù)和友元函數(shù)兩種方式重載的例子。在下面的代碼中,我們分別以兩個(gè)類Byte和Integer來(lái)舉例說(shuō)明如何使用成員函數(shù)和友元函數(shù)重載常用的運(yùn)算符。,class Byte unsigned char b; public: Byte(unsigned char bb
6、= 0) : b(bb) ;,class Integer long i; public: Integer(long ll = 0) : i(ll) ;,6.2 常用運(yùn)算符的重載,一元運(yùn)算符的重載(成員函數(shù)形式),class Byte unsigned char b; public: Byte(unsigned char bb = 0) : b(bb) / 無(wú)副作用的運(yùn)算符定義為 const成員函數(shù) const Byte,一元運(yùn)算符函數(shù)是成員函數(shù)時(shí),形式參數(shù)列表里沒(méi)有參數(shù)。,6.2 常用運(yùn)算符的重載,一元運(yùn)算符重載(成員函數(shù)形式),/ 有副作用的運(yùn)算符定義為非const成員函數(shù) const By
7、te,自增和自減運(yùn)算符有前綴和后綴兩種形式,都會(huì)改變對(duì)象,所以不能對(duì)常量對(duì)象操作。,前綴形式返回改變后的對(duì)象,返回*this。,后綴形式返回改變之前的值,所以必須創(chuàng)建一個(gè)代表這個(gè)值的獨(dú)立對(duì)象并返回它,是通過(guò)傳值方式返回的。,6.2 常用運(yùn)算符的重載,一元運(yùn)算符重載(成員函數(shù)形式),/ 重載運(yùn)算符的使用示例 int main() Byte b; +b; /b.operator+(); -b; /b.operator-(); b; /b.operator(); Byte* bp = /end of main(),運(yùn)算符函數(shù)的調(diào)用有兩種形式隱式調(diào)用和顯式調(diào)用。,隱式調(diào)用,程序在執(zhí)行時(shí)實(shí)際調(diào)用 Byt
8、e:operator( 為左側(cè)main函數(shù)中的一元運(yùn)算符。,一元運(yùn)算符重載(friend函數(shù)形式),/ 全局函數(shù)重載一元運(yùn)算符,要帶一個(gè)參數(shù)作為操作數(shù) /全局運(yùn)算符函數(shù)一般要聲明為類的友元 class Integer long i; public: Integer(long ll = 0) : i(ll) / 無(wú)副作用的運(yùn)算符參數(shù)為 const /end of class Integer,一元運(yùn)算符函數(shù)是友員函數(shù)或普通函數(shù)時(shí),形式參數(shù)列表里有一個(gè)參數(shù)。,一元運(yùn)算符重載(friend函數(shù)形式,/ 全局運(yùn)算符函數(shù)的定義 const Integer ,一元運(yùn)算符重載(friend函數(shù)形式,/ 前綴,
9、返回增加后的對(duì)象 const Integer ,自增和自減運(yùn)算符有前綴和后綴兩種形式,都會(huì)改變對(duì)象,所以不能對(duì)常量對(duì)象操作。,前綴形式返回改變后的對(duì)象,返回*this。,后綴形式返回改變之前的值,所以必須創(chuàng)建一個(gè)代表這個(gè)值的獨(dú)立對(duì)象并返回它,是通過(guò)傳值方式返回的。,一元運(yùn)算符重載(friend函數(shù)形式,/ 重載運(yùn)算符的使用 int main() Integer a; +a; -a; a; Integer* ip = /end of main,程序在執(zhí)行時(shí)調(diào)用 operator(a); 為左側(cè)main函數(shù)中的一元運(yùn)算符。,6.2 常用運(yùn)算符重載,二元運(yùn)算符重載(成員函數(shù)方式),class Byt
10、e unsigned char b; public: Byte(unsigned char bb = 0) : b(bb) const Byte operator+(const Byte,二元運(yùn)算符函數(shù)是成員函數(shù)時(shí),形式參數(shù)列表里只有一個(gè)參數(shù),此參數(shù)為運(yùn)算符的右操作數(shù)。二元運(yùn)算符的左操作數(shù)是調(diào)用操作符函數(shù)的對(duì)象。,隱含參數(shù)this指針,+,-,*,/,%運(yùn)算不改變操作數(shù)的值。它們的計(jì)算結(jié)果產(chǎn)生一個(gè)新的值,為此將這幾個(gè)函數(shù)的返回值設(shè)置為Byte。,6.2 常用運(yùn)算符重載,二元運(yùn)算符重載(成員函數(shù)方式),const Byte operator(const Byte ,二元運(yùn)算符函數(shù)是成員函數(shù)時(shí),形
11、式參數(shù)列表里只有一個(gè)參數(shù),此參數(shù)為運(yùn)算符的右操作數(shù)。二元運(yùn)算符的左操作數(shù)是調(diào)用運(yùn)算符函數(shù)的對(duì)象,也即this指針指向的對(duì)象。,隱含參數(shù)this指針,, public: Integer(long ll = 0) : i(ll) /算術(shù)運(yùn)算,按位與和移位運(yùn)算符 friend const Integer operator+(const Integer ,友元函數(shù)方式的運(yùn)算符重載需要,在相關(guān)類的內(nèi)部將運(yùn)算符函數(shù)聲明為它的友元。,友元二元運(yùn)算符函數(shù)的形參個(gè)數(shù)為兩個(gè),即:左操作數(shù)和右操作數(shù)。,上述運(yùn)算不改變操作數(shù)的值。它們的計(jì)算結(jié)果產(chǎn)生一個(gè)新的值,為此將這幾個(gè)函數(shù)的返回值設(shè)置為Integer。,6.2 常
12、用運(yùn)算符重載,二元運(yùn)算符(友元函數(shù)形式),class Integer long i; public: Integer(long ll = 0) : i(ll) /復(fù)合賦值,關(guān)系運(yùn)算符 friend Integer ,復(fù)合賦值運(yùn)算符改變左操作數(shù)的值,并返回左操作數(shù)。這類運(yùn)算符函數(shù)的返回值設(shè)置為Integer類類型的引用。,關(guān)系運(yùn)算符不改變操作數(shù)的值,它們返回bool類型的值。,6.2 常用運(yùn)算符重載,二元運(yùn)算符(友元函數(shù)形式),/友元函數(shù)的定義 /算術(shù)運(yùn)算符 const Integer operator+(const Integer ,操作兩個(gè)Integer對(duì)象的成員進(jìn)行相關(guān)操作,并返回一個(gè)新的
13、Integer對(duì)象。,6.2 常用運(yùn)算符重載,二元運(yùn)算符(友元函數(shù)形式),/ 復(fù)合賦值運(yùn)算符 Integer ,改變左操作數(shù)對(duì)象的成員的值,并把返回左操作數(shù)的引用。,6.2 常用運(yùn)算符重載,二元運(yùn)算符(友元函數(shù)形式),/ 關(guān)系運(yùn)算符和邏輯運(yùn)算符, bool operator=(const Integer ,比較兩個(gè)操作數(shù)的相關(guān)成員,并返回比較的真值。,6.2 常用運(yùn)算符重載,運(yùn)算符函數(shù)的形參和返回值類型的選擇,對(duì)于任何參數(shù)類型,如果僅僅只是讀參數(shù)的值,而不改變參數(shù),應(yīng)該作為const引用來(lái)傳遞。,普通算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符都不會(huì)改變參數(shù),所以以const引用作為主要的參數(shù)傳遞方式。
14、當(dāng)運(yùn)算符函數(shù)是類的成員函數(shù)時(shí),就將其定義為const成員函數(shù)。,6.2 常用運(yùn)算符重載,運(yùn)算符函數(shù)的形參和返回值類型的選擇,返回值的類型取決于運(yùn)算符的具體含義。如果使用運(yùn)算符的結(jié)果是產(chǎn)生一個(gè)新值,就需要產(chǎn)生一個(gè)作為返回值的新對(duì)象,這個(gè)對(duì)象作為一個(gè)常量通過(guò)傳值方式返回。如果函數(shù)返回的是原有對(duì)象(操作數(shù)),則通常以引用方式返回,根據(jù)是否希望對(duì)返回的值進(jìn)行運(yùn)算來(lái)決定是否返回const引用。,所有賦值運(yùn)算符均改變左值。為了使賦值結(jié)果能用于鏈?zhǔn)奖磉_(dá)式,如a=b=c,應(yīng)該返回一個(gè)改變了的左值的引用。一般賦值運(yùn)算符的返回值是非const引用,以便能夠?qū)倓傎x值的對(duì)象進(jìn)行運(yùn)算。,邏輯運(yùn)算符和關(guān)系運(yùn)算符最好返回
15、bool值,也可返回int值或者由typedef定義的等價(jià)類型。,選擇成員函數(shù)還是非成員函數(shù),大部分運(yùn)算符都可以使用成員函數(shù)和非成員函數(shù)兩種方式重載,這兩種方式如何選擇呢?,1.總的說(shuō)來(lái),如果沒(méi)有什么差異應(yīng)選擇成員函數(shù),這強(qiáng)調(diào)了運(yùn)算符和類的密切關(guān)系。,2.成員運(yùn)算符函數(shù)要求左操作數(shù)必須是當(dāng)前類的對(duì)象,左操作數(shù)不能進(jìn)行自動(dòng)類型轉(zhuǎn)換。,3.非成員運(yùn)算符函數(shù)為兩個(gè)操作數(shù)提供了轉(zhuǎn)換的可能。如果左操作數(shù)是其它類的對(duì)象,或是希望運(yùn)算符的兩個(gè)操作數(shù)都可以進(jìn)行類型轉(zhuǎn)換,則使用非成員函數(shù)。,選擇成員函數(shù)還是非成員函數(shù),運(yùn)算符重載的指導(dǎo)原則,#include using namespace std; class
16、Number int i; public: Number(int ii=0): i(ii) const Number operator+(const Number ,+運(yùn)算符成員函數(shù)不能轉(zhuǎn)換左操作數(shù)的類型。,帶有一個(gè)參數(shù)的構(gòu)造函數(shù)也是類型轉(zhuǎn)換函數(shù)。,6.3 輸入輸出運(yùn)算符的重載,輸入輸出運(yùn)算符函數(shù)必須以友元或普通函數(shù)形式重載(原因:它的左操作數(shù)必須是io對(duì)象)。,輸入輸出運(yùn)算符函數(shù)的聲明:,istream,ostream,istream 和 ostream 是 C+ 的預(yù)定義流類。,cin 是 istream 的對(duì)象,cout 是 ostream 的對(duì)象。,運(yùn)算符 由 istream 重載為提
17、取操作,用于輸入基本類型數(shù)據(jù),6.3 輸入輸出運(yùn)算符的重載,class Vector public: Vector(int num=1); Vector(Vector,6.3 輸入輸出運(yùn)算符的重載,舉例,ostream ,6.4 賦值運(yùn)算符的重載,與其它運(yùn)算符相比,賦值運(yùn)算符(=)的特別之處是:程序員沒(méi)有定義賦值運(yùn)算符函數(shù),編譯器會(huì)為生成一個(gè)默認(rèn)的賦值運(yùn)算符函數(shù)。,默認(rèn)賦值運(yùn)算符函數(shù)的函數(shù)體的內(nèi)容即:把=右邊對(duì)象的各成員的值賦給=左邊對(duì)象的各成員。,賦值運(yùn)算符函數(shù)operator=必須是成員函數(shù),6.4 賦值運(yùn)算符的重載,需要程序員自己定義賦值運(yùn)算符函數(shù)的原因,Vector ,編譯器生成的默認(rèn)
18、賦值函數(shù)(以Vector類為例):,上述代碼會(huì)產(chǎn)生與默認(rèn)拷貝構(gòu)造函數(shù)相同的問(wèn)題。,6.4 賦值運(yùn)算符的重載,Vector A(5);,Vector B=A;,A:,B:,B.num=,B.data=,2000H,2040H,int main() Vector A(5); Vector B=A; A.set(4,9); B=A; return 0; ,5,2040H,Vector:Vector(int num) this-num=num; data=new int num; for (int i=0;inum;i+) datai=0; ,5,2000H,0,0,0,0,0,Vector:Vect
19、or(Vector ,0,0,0,0,0,9,Vector A(5);,Vector B=A;,A:,B:,B.num=,B.data=,2000H,2040H,2040H,5,2000H,0,0,0,0,0,0,0,0,0,0,9,int main() Vector A(5); Vector B=A; A.set(4,9); B=A; return 0; ,5,Vector ,5,2000H,調(diào)用B.operator=(A),6.4 賦值運(yùn)算符的重載,自定義賦值運(yùn)算符函數(shù),class Vector public: Vector(int num=1); Vector(Vector,聲明賦值運(yùn)算
20、符函數(shù),6.4 賦值運(yùn)算符的重載,自定義賦值運(yùn)算符函數(shù),Vector ,避免自復(fù)制,確保賦值的兩個(gè)向量長(zhǎng)度一致。,Vector A(5);,Vector B=A;,A:,B:,B.num=,B.data=,2000H,2040H,5,2040H,5,2000H,0,0,0,0,0,0,0,0,0,9,int main() Vector A(5); Vector B=A; A.set(4,9); B=A; return 0; ,Vector ,0,0,0,0,9,調(diào)用B.operator=(A),6.5 運(yùn)算符的重載,重載運(yùn)算符,有些類的對(duì)象和數(shù)組非常類似,可以為這樣的類提供下標(biāo)運(yùn)算符。,下標(biāo)運(yùn)
21、算符operator必須是成員函數(shù),它只接收一個(gè)參數(shù),通常是整值類型。,下標(biāo)運(yùn)算符作用的對(duì)象應(yīng)該能像數(shù)組一樣操作,所以經(jīng)常用該運(yùn)算符返回一個(gè)元素的引用,以便用作左值。,6.5 運(yùn)算符的重載,運(yùn)算符函數(shù)的聲明,class Vector public: Vector(int num=1); Vector(Vector,運(yùn)算符函數(shù)的聲明,6.5 運(yùn)算符的重載,運(yùn)算符函數(shù)的定義,int ,返回向量對(duì)象指定位置上的元素,6.6 用戶自定義類型轉(zhuǎn)換,數(shù)據(jù)類型轉(zhuǎn)換在程序編譯時(shí)或在程序運(yùn)行實(shí)現(xiàn),基本類型 基本類型 基本類型 類類型 類類型 類類型,類對(duì)象的類型轉(zhuǎn)換可由兩種方式說(shuō)明: 構(gòu)造函數(shù)轉(zhuǎn)換函數(shù) 稱為用戶
22、定義的類型轉(zhuǎn)換或類類型轉(zhuǎn)換,有隱式調(diào)用和顯式調(diào)用方式,6.6 用戶自定義類型轉(zhuǎn)換,構(gòu)造函數(shù)做類型轉(zhuǎn)換,帶單個(gè)參數(shù)的構(gòu)造函數(shù)提供了參數(shù)類型的對(duì)象到本類型對(duì)象的轉(zhuǎn)換。,ClassX : ClassX ( arg ,arg1 = E1 ,, argn = En ) ;,說(shuō)明了一種從參數(shù) arg 的類型到X類型的轉(zhuǎn)換,6.6 用戶自定義類型轉(zhuǎn)換,#include using namespace std; class Complex private: double re,im; public: Complex(int re):re(re),im(0) Complex(int re,int im):re(re),im(im) Complex operator+(Complex num2) double t1=re+num2.re; double t2=im+num2.im; return Complex(t1,t2); friend ostream ,int main() Complex c(2,3),d(4,5); c=d+5;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度遺產(chǎn)繼承財(cái)產(chǎn)分配與公司并購(gòu)及股權(quán)激勵(lì)合同
- 二零二五年度股東借款轉(zhuǎn)為2025年實(shí)收資本的專項(xiàng)合同
- 2025年度版股東與歷史文化保護(hù)區(qū)土地租賃合同(年限及文化傳承)
- 清翔電子課程設(shè)計(jì)仿真
- 追光系統(tǒng)課程設(shè)計(jì)
- 轉(zhuǎn)角杠夾具課程設(shè)計(jì)
- 課程設(shè)計(jì)自然模式三要素
- 公司股權(quán)整體轉(zhuǎn)讓合同
- 公司整體收購(gòu)意向合同協(xié)議范本(房產(chǎn)公司)
- 智能環(huán)保設(shè)備制造合同
- 2024-2025年中國(guó)ETC行業(yè)發(fā)展趨勢(shì)預(yù)測(cè)及投資戰(zhàn)略咨詢報(bào)告
- 年度得到 · 沈祖蕓全球教育報(bào)告(2024-2025)
- 飛行員心理素質(zhì)訓(xùn)練考核試卷
- 2025河北機(jī)場(chǎng)管理集團(tuán)限公司招聘39人高頻重點(diǎn)提升(共500題)附帶答案詳解
- GB/T 17145-2024廢礦物油回收與再生利用導(dǎo)則
- 運(yùn)輸公司安全隱患大排查整治行動(dòng)方案
- 道具設(shè)計(jì)安裝合同模板
- 建筑設(shè)計(jì)公司員工薪酬方案
- 2024至2030年中國(guó)白內(nèi)障手術(shù)耗材行業(yè)投資前景及策略咨詢研究報(bào)告
- 體育單杠課件教學(xué)課件
- 附著式升降腳手架(爬架)安全技術(shù)交底
評(píng)論
0/150
提交評(píng)論