C++語言程序設(shè)計教程:第4章 運算符重載_第1頁
C++語言程序設(shè)計教程:第4章 運算符重載_第2頁
C++語言程序設(shè)計教程:第4章 運算符重載_第3頁
C++語言程序設(shè)計教程:第4章 運算符重載_第4頁
C++語言程序設(shè)計教程:第4章 運算符重載_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第第4章章 運算符重載運算符重載 C+語言程序設(shè)計教程語言程序設(shè)計教程大連理工大學軟件學院大連理工大學軟件學院第第4章章 運算符重載運算符重載 大連理工大學軟件學院大連理工大學軟件學院4.5 字符串類實例字符串類實例4.4 常用運算符重載常用運算符重載4.3 運算符重載方法運算符重載方法4.2 運算符重載規(guī)則運算符重載規(guī)則4.1 理解運算符重載理解運算符重載v 使用運算符對各種數(shù)據(jù)進行操作,高效快捷且清晰易懂。使用運算符對各種數(shù)據(jù)進行操作,高效快捷且清晰易懂。 如果運算符也能作用于各種類對象,會使代碼簡潔而優(yōu)雅。如果運算符也能作用于各種類對象,會使代碼簡潔而優(yōu)雅。v1 = v1+ v2 ; /

2、向量加法向量加法M1 = M1+ M2 ; /矩陣相加矩陣相加v1 = M1*v2 ; / 向量與矩陣相乘向量與矩陣相乘m1 = v1*v2 ; / 向量相乘向量相乘int day = d1- d2 ; / 計算日期差計算日期差double d = p1 p2 ;/ 計算兩點距離計算兩點距離4.1 4.1 理解運算符重載理解運算符重載第第4章章 運算符重載運算符重載 class Complex public:Complex(double r=0, double i=0) dReal=r; dImag=i; Complex complexAdd(Complex &c2) ; private:do

3、uble dReal, dImag; ;Complex Complex : complexAdd(Complex &c2) Complex c; c.dReal = dReal+c2.dReal;c.dImag = dImag+c2.dImag;return c; c = c1. c = c1. complexAdd( ( c2 ); c2 ); 第第4章章 運算符重載運算符重載 class Complex public:Complex(double r, double i) dReal=r; dImag=i; Complex operator + (Complex &c2); private

4、:double dReal, dImag; ;Complex Complex:operator + (Complex &c2)Complex c; c.dReal = dReal+c2.dReal;c.dImag = dImag+c2.dImag;return c;/ return Complex ( dReal+c2.dReal, dImag+c2.dImag); c = c1 + c2; / c1.operator+(c2) c = c1 + c2; / c1.operator+(c2)第第4章章 運算符重載運算符重載 重載運算符函數(shù)可以對運算符作出新的解釋,重載運算符函數(shù)可以對運算符作出

5、新的解釋, 原有基本語義不變:原有基本語義不變:不能創(chuàng)建新的運算符不能創(chuàng)建新的運算符不能改變運算符的優(yōu)先級和結(jié)合性不能改變運算符的優(yōu)先級和結(jié)合性不能改變運算符所需要的操作數(shù)不能改變運算符所需要的操作數(shù)不能改變該運算符用于基本類型變量時的含義不能改變該運算符用于基本類型變量時的含義第第4章章 運算符重載運算符重載 4.2 4.2 運算符重載規(guī)則運算符重載規(guī)則可以重載大部分已有的運算符可以重載大部分已有的運算符 特殊的運算符不允許被重載特殊的運算符不允許被重載 .: .*( .-.-)? :sizeof #第第4章章 運算符重載運算符重載 4.2 4.2 運算符重載規(guī)則運算符重載規(guī)則&大連理工大學

6、軟件學院大連理工大學軟件學院第第4章章 運算符重載運算符重載 3 普通函數(shù)普通函數(shù)1成員函數(shù)2友元函數(shù)友元函數(shù)重載方法 成員函數(shù)的語法形式成員函數(shù)的語法形式 類型類型 類名類名 : operator op ( 參數(shù)表參數(shù)表 ) / 相對于該類定義的操作相對于該類定義的操作函數(shù)返回類型函數(shù)返回類型由由op構(gòu)成的表達構(gòu)成的表達式的類型決定式的類型決定 重載該運算符的類重載該運算符的類 函數(shù)名函數(shù)名關(guān)鍵字關(guān)鍵字被重載的運算符被重載的運算符 4.3 4.3 運算符重載方法運算符重載方法第第4章章 運算符重載運算符重載 成員函數(shù)重載算符成員函數(shù)重載算符第第4章章 運算符重載運算符重載 class Com

7、plex double dReal, dImag; public:Complex(double r=0, double i=0);Complex operator + (Complex &c2);Complex operator + (double d); ; Complex z ( 2.0 , 3 ) , k ( 3 , 4.5 ) ; z = z k; k = z + 27 ; k = 27 + z ; z . operator + ( k )z . operator + ( 27 )?Complex operator + ( int a ,Complex &c2) Complex c;

8、c.dReal = a+c2.dReal;c.dImag = 0+c2.dImag;return c; k=operator + (27, z )k = 27 + z ;k = 27 + z ;第第4章章 運算符重載運算符重載 友元函數(shù)重載算符友元函數(shù)重載算符何時用成員函數(shù)重載算符?何時用成員函數(shù)重載算符? 當一元運算符的操作數(shù),或者二元運算符的左操作數(shù)當一元運算符的操作數(shù),或者二元運算符的左操作數(shù) 是該類的一個對象時,重載運算符函數(shù)為成員函數(shù)是該類的一個對象時,重載運算符函數(shù)為成員函數(shù) class Complex double dReal, dImag; public:Complex(dou

9、ble r, double i);Complex operator + (Complex &c2);Complex operator - ( );Complex operator * (double d); ; 第第4章章 運算符重載運算符重載 第第4章章 運算符重載運算符重載 class Complex double dReal, dImag; public:Complex(double r, double i);Complex operator + (Complex &c2);Complex operator + (double d);; ; Complex z ( 2.0 , 3 ) ,

10、 k ( 3 , 4.5 ) ; k = z + 27 ; k = 27 + z ; 成員函數(shù)重載的成員函數(shù)重載的“ + ”算算符符不支持交換律不支持交換律何時成員函數(shù)不能重載算符?何時成員函數(shù)不能重載算符?第第4章章 運算符重載運算符重載 友元函數(shù)重載運算符常用于運算符的左右操作數(shù)類型友元函數(shù)重載運算符常用于運算符的左右操作數(shù)類型不同的情況。不同的情況。 友元函數(shù)重載運算符友元函數(shù)重載運算符普通普通函數(shù)函數(shù)友元友元函數(shù)函數(shù)重載重載運算符運算符 Complex operator+(double d1, const Complex &c2);friend Complex operator+( d

11、ouble d1, const Complex &c2); 練習與思考練習與思考u代碼練習代碼練習定義定義ComplexComplex類類1.1.重載重載operator-operator-進行兩個復(fù)數(shù)間的減法操作進行兩個復(fù)數(shù)間的減法操作2.2.重載重載operator-operator-進行復(fù)數(shù)和實數(shù)的減法操作進行復(fù)數(shù)和實數(shù)的減法操作3.3.重載重載operator-operator-進行復(fù)數(shù)取反操作(單目)進行復(fù)數(shù)取反操作(單目)參見例參見例ch4.2 思考思考 實現(xiàn)運算符重載時實現(xiàn)運算符重載時 友員函數(shù)友員函數(shù) vs.vs.成員函數(shù)成員函數(shù) 1優(yōu)先選擇成員函數(shù)實現(xiàn)運算符重載優(yōu)先選擇成員函

12、數(shù)實現(xiàn)運算符重載 一般情況下單目運算符重載為類的成員函數(shù),尤其運算符的操作需要修改對象的狀態(tài)時。雙目運算符可以重載為類的成員或者友元函數(shù)。不能用類的友元函數(shù)重載實現(xiàn)的運算符 成員函數(shù)與友元函數(shù)的比較成員函數(shù)與友元函數(shù)的比較第第4章章 運算符重載運算符重載 =()() -2不能重載為成員函數(shù)的運算符不能重載為成員函數(shù)的運算符當有兩個不同類型的對象進行混合運算時,若雙目運算符的左當有兩個不同類型的對象進行混合運算時,若雙目運算符的左操作數(shù)不是操作數(shù)不是A類對象,而右操作數(shù)為類對象,而右操作數(shù)為A類對象,則該運算符函類對象,則該運算符函數(shù)不能重載為數(shù)不能重載為A類成員函數(shù)。類成員函數(shù)。當運算符函數(shù)重

13、載為某類的成員函數(shù)時,雙目運算符的左操作當運算符函數(shù)重載為某類的成員函數(shù)時,雙目運算符的左操作數(shù),或者單目運算符的唯一操作數(shù),必須是該類的對象或者對數(shù),或者單目運算符的唯一操作數(shù),必須是該類的對象或者對象的引用。象的引用。 成員函數(shù)與友元函數(shù)的比較成員函數(shù)與友元函數(shù)的比較第第4章章 運算符重載運算符重載 關(guān)系運算符關(guān)系運算符 、 = 、= 自增自減運算符自增自減運算符 +、- 賦值運算符賦值運算符 = 下標運算符下標運算符 流操作運算符流操作運算符 第第4章章 運算符重載運算符重載 class Box /盒子類盒子類public: Box(double l=1.0, double w=1.0,

14、 double h=1.0) ; double volume( ) const; /計算盒子體積計算盒子體積 private: double length; double width; double height;第第4章章 運算符重載運算符重載 4.4.1重載關(guān)系運算符重載關(guān)系運算符課堂練習課堂練習對對Box類進行運算符重載:類進行運算符重載:v成員函數(shù)重載成員函數(shù)重載 bool operator(Box &)v成員函數(shù)重載成員函數(shù)重載= bool operator=(Box &)v友元函數(shù)重載友元函數(shù)重載 比較實數(shù)比較實數(shù)d與盒子與盒子Box b的體積大小的體積大小 參見例參見例ch4.3

15、4.4.2 重載自增運算符重載自增運算符 +; +;第第4章章 運算符重載運算符重載 1如 何 使 編譯器能區(qū)分前置自增和后置自增運算符;2如何設(shè)計重載函數(shù)的類型,即返回什么對象重載重載+ 難點難點4.4.2 重載自增運算符重載自增運算符v 重載自增運算符的語法格式:重載自增運算符的語法格式:前綴運算前綴運算 operator +();(); 后綴運算后綴運算 operator+(int);); 第第4章章 運算符重載運算符重載 偽參數(shù)偽參數(shù) class Increase int value;public : Increase (int v=0 ) value= v; void operato

16、r + ( ); /重載前置重載前置+ void operator + ( int ); /重載后置重載后置+; 例例 重載自增運算符重載自增運算符Increase I1(1), I2 ; + I1; I2 = I1 +; I1.operator+();I1.operator+(0); class Increase int value;public : Increase (int v=0 ) value= v; Increase operator + ( ); /重載前置重載前置+ Increase operator + ( int ); /重載后置重載后置+; 例例 重載自增運算符重載自增運

17、算符Increase I1(1), I2 ; +I1; I2 = +I1; I2 = + + I1;/I1結(jié)果如何結(jié)果如何 Increase Increase : operator + ( ) +value ;return *this; 調(diào)用復(fù)制構(gòu)造調(diào)用復(fù)制構(gòu)造返回對象?返回對象? class Increase int value;public : Increase (int v=0 ) value= v; Increase operator + ( ); /重載前置重載前置+ Increase operator + ( int ); /重載后置重載后置+; 例例 重載自增運算符重載自增運算符

18、Increase I1(1), I2 ; I1 +; I2 = I1 +; Increase Increase : operator + (int) Increase temp;temp.value = value +; return temp; 返回局部對象返回局部對象 void main( ) Increase a , b , n ; for ( int i = 0 ; i 10 ; i + ) a = n + ; cout n= ; n.display( ) ; cout a= ; a.display( ) ; for ( int i = 0 ; i 10 ; i + ) b = + n

19、 ; cout n= ; n.display( ) ; cout b= ; b.display( ) ; 重載自增運算符重載自增運算符cout “n=”nendl;設(shè)設(shè)A Aobject ; +Aobject; / A對象自增對象自增 成員函數(shù)成員函數(shù)重載重載 友元函數(shù)友元函數(shù)重載重載 6.3.1 重載重載+與與-第第4章章 運算符重載運算符重載 4.4.2 重載自增運算符重載自增運算符A : A operator+ () ; Aobject . operator +( ) ;解釋為解釋為friend A operator+ (A &) ; operator +( Aobject ) ;解釋為

20、解釋為友員函數(shù)重載友員函數(shù)重載+class Increaseint value ;public : Increase ( ) value=0; void display( ) const coutvaluen; ;friend Increase& operator + ( Increase & ) ; / 前置前置friend Increase& operator + ( Increase &, int ) ; ;Increase& operator + ( Increase & a ) a.value + ; return a ; Increase& operator + ( Increas

21、e & a, int ) Increase temp(a); a.value + ; return temp; 6.3.1 重載重載+與與-第第4章章 運算符重載運算符重載 通過引用參數(shù)通過引用參數(shù)操作對象操作對象?4.4.3 特殊運算符的重載特殊運算符的重載class IntArraypublic:IntArray(int s=0); IntArray(); /其他成員函數(shù)其他成員函數(shù)private:int * pArr; /數(shù)組首地址數(shù)組首地址int size; /數(shù)組大小數(shù)組大小;第第4章章 運算符重載運算符重載 使用數(shù)組的局限性使用數(shù)組的局限性int i=3, a3, bi; cout

22、 b ; a = b ; a3 = b3;重載下標運算符重載下標運算符 運算符運算符 是二元運算符是二元運算符, ,下標運算符下標運算符“ ” ”通常用通常用于在數(shù)組中標識數(shù)組元素的位置,下標運算符重載可以于在數(shù)組中標識數(shù)組元素的位置,下標運算符重載可以實現(xiàn)數(shù)組數(shù)據(jù)的賦值和取值實現(xiàn)數(shù)組數(shù)據(jù)的賦值和取值. .只能用成員函數(shù)重載,不能用友元函數(shù)重載只能用成員函數(shù)重載,不能用友元函數(shù)重載 下標運算符函數(shù)重載的一般形式為:下標運算符函數(shù)重載的一般形式為: 返回類型返回類型 類名類名 : operator ( int index ) ;: operator ( int index ) ;6.3.3 重載

23、運算符重載運算符和和()第第4章章 運算符重載運算符重載 返回數(shù)組元素的引用返回數(shù)組元素的引用元素下標元素下標第第4章章 運算符重載運算符重載重載下標運算符重載下標運算符 class IntArraypublic: IntArray(int s=0); IntArray(); int& operator(int i);private: int * pArr; int size;int& IntArray:operator(int i) if(isize) cout Out of range!endl; return pArr0; return pArri; IntArray a(3),b(5)

24、; for( int i = 1 ; i=5;i+) bi = i; for( i = 1 ; i=5; i+) cout ai ; cout a bendl; istream 和和 ostream 是是 C+ 的預(yù)定義流類的預(yù)定義流類 cin 是是 istream 的對象,的對象,cout 是是 ostream 的對象的對象 運算符運算符 由由 istream 重載為提取操作,重載為提取操作, 用于輸出于輸入基本類型數(shù)據(jù)用于輸出于輸入基本類型數(shù)據(jù); 重載重載 輸出和輸入用戶自定義的數(shù)據(jù)類型輸出和輸入用戶自定義的數(shù)據(jù)類型 .重載流插入和流提取運算符重載流插入和流提取運算符 第第4章章 運算符重

25、載運算符重載 重載函數(shù)形式 : istream & operator (istream &, 自定義類 &);ostream & operator ”和“”的函數(shù)作為友元函數(shù)或普通的函數(shù)。重載流插入和流提取運算符重載流插入和流提取運算符 第第4章章 運算符重載運算符重載第第4章章 運算符重載運算符重載重載運算符重載運算符class IntArraypublic: IntArray(int s=0); IntArray(); int& operator(int i);friend ostream& operator ( ostream& out, intArray&a) ;private: in

26、t * pArr; int size;ostream& operator(ostream& out, IntArray& a) for(int i = 1 ; i=a.size ; i+) out a.pArri ; return out;cout 的別名的別名 IntArray a(3),b(5); for( int i = 1 ; i=5;i+) bi = i; for( i = 1 ; i=5; i+) cout ai ; cout a bendl; 第第4章章 運算符重載運算符重載class IntArray int * pArr; int size;public: IntArray(

27、int s=0); IntArray(); int& operator(int i);friend ostream& operator ( ostream&, intArray&) ; IntArray a(3),b(5); for( int i = 1 ; i=5;i+) bi = i; a = b; cout a bendl; =可以不必重載可以不必重載運行錯誤運行錯誤v復(fù)制構(gòu)造復(fù)制構(gòu)造 v 賦值運算賦值運算第第4章章 運算符重載運算符重載 IntArray a(5), b(a); IntArray a(5),b(3); b = a; (a)賦值操作前 (b)賦值操作后第第4章章 運算符重

28、載運算符重載IntArray:IntArray(int s) size = s; if(size = 0) /空數(shù)組空數(shù)組 pArr = NULL; else /分配空間,分配空間,0號元素不用號元素不用 pArr = new intsize+1; for(int i = 1; i= size;i+) pArri = 0; / 數(shù)組元素置數(shù)組元素置0 IntArray:IntArray( ) if(pArr!=NULL) delete pArr ; /釋放數(shù)組空間釋放數(shù)組空間 IntArray a(5); IntArray b= a; 深復(fù)制與淺復(fù)制深復(fù)制與淺復(fù)制v復(fù)制構(gòu)造復(fù)制構(gòu)造- 深復(fù)制與淺復(fù)制深復(fù)制與淺復(fù)制v 賦值運算賦值運算第第4章章 運算符重載運算符重載 IntArray a(5), b(a); IntArray a(5),b(3); b = a; (a)析構(gòu)對象b (b) 析構(gòu)對象av 賦值運算賦值運算第第4章章 運算符重載運算符重載 IntArray a(5), b(a); IntArray a(5),b(3); b

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論