第6章運算符重載.ppt_第1頁
第6章運算符重載.ppt_第2頁
第6章運算符重載.ppt_第3頁
第6章運算符重載.ppt_第4頁
第6章運算符重載.ppt_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第六章 運算符重載,引言,運算符和函數(shù),4=1 + 3,4.0=1.0 + 3.0,函數(shù)名,參數(shù)int,返回值int,函數(shù)名,參數(shù)double,返回值double,int + (int, int );,double + (double, double );,可以將+代表的操作看成一個函數(shù):+為函數(shù)的名字,+操作的兩個操作數(shù)的類型即為函數(shù)形參的類型,+操作的結果的類型即為函數(shù)的返回值類型。,引言,運算符重載的提出,C/C+中,每種基本數(shù)據(jù)類型的變量都可通過幾種運算符來做相關計算,如int型變量,它們可以同“+”,“-”,“*”,“/”等運算符來做加法,減法,乘法,除法等。如:,int a, b;

2、 a+b; a-b; a*b; a/b;,class Vector int * data; int num; public: ,我們能否將自定義的類的對象也通過“+”,“-”,“*”,“/”等運算符來進行兩個對象的加,減,乘,除呢?如:,Vector vec1,vec2; vec1+vec2; vec1-vec2; vec1*vec2; vec1/vec2;,定義一個向量類,兩個向量類對象的加減乘除,C+提供了運算符重載機制來幫助我們實現(xiàn)上述目的。,主要內容,6.1 基本語法 6.2 常用運算符的重載 6.3 賦值運算符的重載 6.4 輸入輸出運算符的重載 6.5 運算符的重載 6.6 用戶自

3、定義類型轉換,6.1 基本語法,在C+ 中,為一個類類型定義運算符函數(shù)和定義普通函數(shù)的形式很相似,只是函數(shù)的名字是關鍵字operator后緊跟要重載的運算符。例如,重載的”+” 運算符函數(shù)名字為operator+。定義了運算符函數(shù)之后,就可以對類類型的操作數(shù)使用該運算符。運算符函數(shù)聲明的語法規(guī)則如下:,friend 類型名 operator運算符(形參列表);,friend 關鍵字可選,有friend關鍵字時表示運算符函數(shù)是類的友元函數(shù),沒有friend關鍵字時表示運輸符函數(shù)是類的成員函數(shù)或普通函數(shù)。,6.1 基本語法,運算符函數(shù)聲明的語法規(guī)則如下:,friend 類型名 operator運算

4、符(形參列表);,形式列表中參數(shù)的個數(shù)取決于兩個因素:,運算符是一元運算符還是二元運算符 運算符函數(shù)是成員函數(shù)還是友元函數(shù),6.1 基本語法,C+中內被重載的運算符有:,C+中不能被重載的運算符有:,6.1 基本語法,注意事項,雖然運算符重載提供了語法上的方便,但也有一些使用限制。 只有C+預定義運算符集合中的運算符才可以重載 C+中有些運算符不能被重載::(作用域解析符)、.(成員選擇符)、.*(成員指針間接引用符)及?:(條件運算符)。 不能定義C+中沒有的運算符,如operator*會產(chǎn)生編譯錯誤。,6.1 基本語法,注意事項,內置類型的運算符的預定義意義不能改變,也不能為內置數(shù)據(jù)類型定

5、義其他運算符。例如,不能定義內置數(shù)組的operator+。 重載運算符不能改變運算符的優(yōu)先級和結合性。 重載運算符不能改變操作數(shù)的個數(shù)。 運算符重載不能濫用,只有當用戶自定義類型上的操作與內置運算符之間存在邏輯對應關系時,重載的運算符才能使程序顯得更自然、更直觀。,6.2 常用運算符的重載,一元運算符的重載,本節(jié)給出一些常規(guī)運算符以成員函數(shù)和友元函數(shù)兩種方式重載的例子。在下面的代碼中,我們分別以兩個類Byte和Integer來舉例說明如何使用成員函數(shù)和友元函數(shù)重載常用的運算符。,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 常用運算符的重載,一元運算符的重載(成員函數(shù)形式),class Byte unsigned char b; public: Byte(unsigned char bb = 0) : b(bb) / 無副作用的運算符定義為 const成員函數(shù) const Byte,一元運算符函數(shù)是成員函數(shù)時,形式參數(shù)列表里沒有參數(shù)。,6.2 常用運算符的重載,一元運算符重載(成員函數(shù)形式),/ 有副作用的運算符定義為非const成員函數(shù) const By

7、te,自增和自減運算符有前綴和后綴兩種形式,都會改變對象,所以不能對常量對象操作。,前綴形式返回改變后的對象,返回*this。,后綴形式返回改變之前的值,所以必須創(chuàng)建一個代表這個值的獨立對象并返回它,是通過傳值方式返回的。,6.2 常用運算符的重載,一元運算符重載(成員函數(shù)形式),/ 重載運算符的使用示例 int main() Byte b; +b; /b.operator+(); -b; /b.operator-(); b; /b.operator(); Byte* bp = /end of main(),運算符函數(shù)的調用有兩種形式隱式調用和顯式調用。,隱式調用,程序在執(zhí)行時實際調用 Byt

8、e:operator( 為左側main函數(shù)中的一元運算符。,一元運算符重載(friend函數(shù)形式),/ 全局函數(shù)重載一元運算符,要帶一個參數(shù)作為操作數(shù) /全局運算符函數(shù)一般要聲明為類的友元 class Integer long i; public: Integer(long ll = 0) : i(ll) / 無副作用的運算符參數(shù)為 const /end of class Integer,一元運算符函數(shù)是友員函數(shù)或普通函數(shù)時,形式參數(shù)列表里有一個參數(shù)。,一元運算符重載(friend函數(shù)形式,/ 全局運算符函數(shù)的定義 const Integer ,一元運算符重載(friend函數(shù)形式,/ 前綴,

9、返回增加后的對象 const Integer ,自增和自減運算符有前綴和后綴兩種形式,都會改變對象,所以不能對常量對象操作。,前綴形式返回改變后的對象,返回*this。,后綴形式返回改變之前的值,所以必須創(chuàng)建一個代表這個值的獨立對象并返回它,是通過傳值方式返回的。,一元運算符重載(friend函數(shù)形式,/ 重載運算符的使用 int main() Integer a; +a; -a; a; Integer* ip = /end of main,程序在執(zhí)行時調用 operator(a); 為左側main函數(shù)中的一元運算符。,6.2 常用運算符重載,二元運算符重載(成員函數(shù)方式),class Byt

10、e unsigned char b; public: Byte(unsigned char bb = 0) : b(bb) const Byte operator+(const Byte,二元運算符函數(shù)是成員函數(shù)時,形式參數(shù)列表里只有一個參數(shù),此參數(shù)為運算符的右操作數(shù)。二元運算符的左操作數(shù)是調用操作符函數(shù)的對象。,隱含參數(shù)this指針,+,-,*,/,%運算不改變操作數(shù)的值。它們的計算結果產(chǎn)生一個新的值,為此將這幾個函數(shù)的返回值設置為Byte。,6.2 常用運算符重載,二元運算符重載(成員函數(shù)方式),const Byte operator(const Byte ,二元運算符函數(shù)是成員函數(shù)時,形

11、式參數(shù)列表里只有一個參數(shù),此參數(shù)為運算符的右操作數(shù)。二元運算符的左操作數(shù)是調用運算符函數(shù)的對象,也即this指針指向的對象。,隱含參數(shù)this指針,, public: Integer(long ll = 0) : i(ll) /算術運算,按位與和移位運算符 friend const Integer operator+(const Integer ,友元函數(shù)方式的運算符重載需要,在相關類的內部將運算符函數(shù)聲明為它的友元。,友元二元運算符函數(shù)的形參個數(shù)為兩個,即:左操作數(shù)和右操作數(shù)。,上述運算不改變操作數(shù)的值。它們的計算結果產(chǎn)生一個新的值,為此將這幾個函數(shù)的返回值設置為Integer。,6.2 常

12、用運算符重載,二元運算符(友元函數(shù)形式),class Integer long i; public: Integer(long ll = 0) : i(ll) /復合賦值,關系運算符 friend Integer ,復合賦值運算符改變左操作數(shù)的值,并返回左操作數(shù)。這類運算符函數(shù)的返回值設置為Integer類類型的引用。,關系運算符不改變操作數(shù)的值,它們返回bool類型的值。,6.2 常用運算符重載,二元運算符(友元函數(shù)形式),/友元函數(shù)的定義 /算術運算符 const Integer operator+(const Integer ,操作兩個Integer對象的成員進行相關操作,并返回一個新的

13、Integer對象。,6.2 常用運算符重載,二元運算符(友元函數(shù)形式),/ 復合賦值運算符 Integer ,改變左操作數(shù)對象的成員的值,并把返回左操作數(shù)的引用。,6.2 常用運算符重載,二元運算符(友元函數(shù)形式),/ 關系運算符和邏輯運算符, bool operator=(const Integer ,比較兩個操作數(shù)的相關成員,并返回比較的真值。,6.2 常用運算符重載,運算符函數(shù)的形參和返回值類型的選擇,對于任何參數(shù)類型,如果僅僅只是讀參數(shù)的值,而不改變參數(shù),應該作為const引用來傳遞。,普通算術運算符、關系運算符、邏輯運算符都不會改變參數(shù),所以以const引用作為主要的參數(shù)傳遞方式。

14、當運算符函數(shù)是類的成員函數(shù)時,就將其定義為const成員函數(shù)。,6.2 常用運算符重載,運算符函數(shù)的形參和返回值類型的選擇,返回值的類型取決于運算符的具體含義。如果使用運算符的結果是產(chǎn)生一個新值,就需要產(chǎn)生一個作為返回值的新對象,這個對象作為一個常量通過傳值方式返回。如果函數(shù)返回的是原有對象(操作數(shù)),則通常以引用方式返回,根據(jù)是否希望對返回的值進行運算來決定是否返回const引用。,所有賦值運算符均改變左值。為了使賦值結果能用于鏈式表達式,如a=b=c,應該返回一個改變了的左值的引用。一般賦值運算符的返回值是非const引用,以便能夠對剛剛賦值的對象進行運算。,邏輯運算符和關系運算符最好返回

15、bool值,也可返回int值或者由typedef定義的等價類型。,選擇成員函數(shù)還是非成員函數(shù),大部分運算符都可以使用成員函數(shù)和非成員函數(shù)兩種方式重載,這兩種方式如何選擇呢?,1.總的說來,如果沒有什么差異應選擇成員函數(shù),這強調了運算符和類的密切關系。,2.成員運算符函數(shù)要求左操作數(shù)必須是當前類的對象,左操作數(shù)不能進行自動類型轉換。,3.非成員運算符函數(shù)為兩個操作數(shù)提供了轉換的可能。如果左操作數(shù)是其它類的對象,或是希望運算符的兩個操作數(shù)都可以進行類型轉換,則使用非成員函數(shù)。,選擇成員函數(shù)還是非成員函數(shù),運算符重載的指導原則,#include using namespace std; class

16、Number int i; public: Number(int ii=0): i(ii) const Number operator+(const Number ,+運算符成員函數(shù)不能轉換左操作數(shù)的類型。,帶有一個參數(shù)的構造函數(shù)也是類型轉換函數(shù)。,6.3 輸入輸出運算符的重載,輸入輸出運算符函數(shù)必須以友元或普通函數(shù)形式重載(原因:它的左操作數(shù)必須是io對象)。,輸入輸出運算符函數(shù)的聲明:,istream,ostream,istream 和 ostream 是 C+ 的預定義流類。,cin 是 istream 的對象,cout 是 ostream 的對象。,運算符 由 istream 重載為提

17、取操作,用于輸入基本類型數(shù)據(jù),6.3 輸入輸出運算符的重載,class Vector public: Vector(int num=1); Vector(Vector,6.3 輸入輸出運算符的重載,舉例,ostream ,6.4 賦值運算符的重載,與其它運算符相比,賦值運算符(=)的特別之處是:程序員沒有定義賦值運算符函數(shù),編譯器會為生成一個默認的賦值運算符函數(shù)。,默認賦值運算符函數(shù)的函數(shù)體的內容即:把=右邊對象的各成員的值賦給=左邊對象的各成員。,賦值運算符函數(shù)operator=必須是成員函數(shù),6.4 賦值運算符的重載,需要程序員自己定義賦值運算符函數(shù)的原因,Vector ,編譯器生成的默認

18、賦值函數(shù)(以Vector類為例):,上述代碼會產(chǎn)生與默認拷貝構造函數(shù)相同的問題。,6.4 賦值運算符的重載,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,調用B.operator=(A),6.4 賦值運算符的重載,自定義賦值運算符函數(shù),class Vector public: Vector(int num=1); Vector(Vector,聲明賦值運算

20、符函數(shù),6.4 賦值運算符的重載,自定義賦值運算符函數(shù),Vector ,避免自復制,確保賦值的兩個向量長度一致。,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,調用B.operator=(A),6.5 運算符的重載,重載運算符,有些類的對象和數(shù)組非常類似,可以為這樣的類提供下標運算符。,下標運

21、算符operator必須是成員函數(shù),它只接收一個參數(shù),通常是整值類型。,下標運算符作用的對象應該能像數(shù)組一樣操作,所以經(jīng)常用該運算符返回一個元素的引用,以便用作左值。,6.5 運算符的重載,運算符函數(shù)的聲明,class Vector public: Vector(int num=1); Vector(Vector,運算符函數(shù)的聲明,6.5 運算符的重載,運算符函數(shù)的定義,int ,返回向量對象指定位置上的元素,6.6 用戶自定義類型轉換,數(shù)據(jù)類型轉換在程序編譯時或在程序運行實現(xiàn),基本類型 基本類型 基本類型 類類型 類類型 類類型,類對象的類型轉換可由兩種方式說明: 構造函數(shù)轉換函數(shù) 稱為用戶

22、定義的類型轉換或類類型轉換,有隱式調用和顯式調用方式,6.6 用戶自定義類型轉換,構造函數(shù)做類型轉換,帶單個參數(shù)的構造函數(shù)提供了參數(shù)類型的對象到本類型對象的轉換。,ClassX : ClassX ( arg ,arg1 = E1 ,, argn = En ) ;,說明了一種從參數(shù) arg 的類型到X類型的轉換,6.6 用戶自定義類型轉換,#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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論