面向對象編程技術與方法 課件 第5章 運算符重載_第1頁
面向對象編程技術與方法 課件 第5章 運算符重載_第2頁
面向對象編程技術與方法 課件 第5章 運算符重載_第3頁
面向對象編程技術與方法 課件 第5章 運算符重載_第4頁
面向對象編程技術與方法 課件 第5章 運算符重載_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

面向對象編程技術與方法(C++)

第5章運算符重載第5章運算符重載第5章

運算符重載

5.1運算符重載的概念

5.2運算符重載的規(guī)則

5.3運算符重載的兩種形式

5.3.1重載為類的成員函數

5.3.2重載為類的友元函數

5.3.3兩種重載方式討論

5.4特殊運算符重載舉例

5.4.1類型轉換運算符

5.4.2復合賦值運算符

5.4.3自增和自減運算符

5.4.4流提取運算符和流插入運算符

5.5函數對象

5.6小結

第5章運算符重載5.1運算符重載的概念

5.2運算符重載的規(guī)則 5.3運算符重載的兩種形式 5.4特殊運算符重載舉例 5.5函數對象 5.6小結

第5章運算符重載5.1運算符重載的概念運算符重載也就是函數重載。運算符函數重載的聲明格式: 返回類型operator運算符(形參列表);C++預定義的運算符只能操作基本數據類型的對象,例如對于int型對象a和b,求和可以直接寫為a+b。但是對于類對象,不能直接使用類似的表達方式。例如,對于兩個CPoint類型的對象obj1和obj2,我們仍然希望能夠像基本數據類型那樣將表達式寫為:obj1+obj2。解決方法就是在定義類CPoint時,重載運算符函數operator+()。第5章運算符重載5.1運算符重載的概念 5.2運算符重載的規(guī)則

5.3運算符重載的兩種形式 5.4特殊運算符重載舉例 5.5函數對象 5.6小結

第5章運算符重載5.2運算符重載的規(guī)則大多數C++運算符都可以重載。下面幾個不能重載:成員訪問運算符(.)、成員指針訪問運算符(.*)、作用域運算符(::)、求字節(jié)數運算符(sizeof)、類型識別(typeid)、條件運算符(?:)C++不允許用戶定義新的運算符,只可以對已有的運算符進行重載。重載不會改變運算符操作對象的個數。重載后運算符的優(yōu)先級以及結合性不變。運算符重載函數與一般函數的區(qū)別是:前者的參數個數只能是一個或者兩個,而一般函數參數的個數沒有限制。運算符重載函數的形參不能帶默認值。雖然重載允許改變函數的功能,但應當使運算符重載后的功能與重載前的功能類似。一般來說,操作數包含有類對象的運算符都應該重載。但取地址運算符“&”可以直接使用,不用自己重載;賦值運算符“=”有時不用重載,因為系統(tǒng)可以提供一個默認的賦值函數,特殊情況下則需要用戶重新定義。第5章運算符重載5.1運算符重載的概念 5.2運算符重載的規(guī)則 5.3運算符重載的兩種形式5.4特殊運算符重載舉例 5.5函數對象 5.6小結

第5章運算符重載5.3運算符重載的兩種形式5.3.1重載為類的成員函數在下面的例子中,定義一個復數類Complex。以一元運算符取負(-)和二元運算符減(-)為例,說明將一元運算符和二元運算符重載為成員函數的方法。由于類的非靜態(tài)成員函數都隱含一個this參數,當調用對象的成員函數時this被自動初始化指向當前的對象。因此表面上看,一元運算符成員函數不帶參數,二元運算符成員函數帶一個參數,該參數是右操作數(運算符右側的操作數),左操作數由this提供。第5章運算符重載5.3.2重載為類的友元函數將上例改為重載為友元的形式。由于友元函數不是類的成員函數,因此沒有this指針。這時,一元運算符友元函數應帶一個參數,二元運算符友元函數應帶兩個參數。第5章運算符重載5.3.3兩種重載方式討論運算符的兩種重載形式都可以實現要求的功能,但是成員函數和友元函數是不同的。從表面上看,友元函數比成員函數多一個形參。實際上,成員函數所在的對象就是第1個操作數。一般而言,應將一元運算符重載為成員函數,將二元運算符重載為友元函數?!?)”、“[]”、“->”、“->*”及“=”必須重載為成員函數。如果運算符的第一個操作數為當前的類類型,則可以重載為成員函數;如果運算符有一個操作數不是當前的類類型,則應重載為友元函數。例如,要計算(7.53-c1)的值,其中c1是Complex類對象。成員函數重載時,該表達式被解釋為:7.53.operator-(c1);友元函數重載時,該表達式被解釋為:operator-(Complex(7.53),c1)第5章運算符重載第5章運算符重載5.1運算符重載的概念 5.2運算符重載的規(guī)則 5.3運算符重載的兩種形式 5.4特殊運算符重載舉例

5.5函數對象 5.6小結

第5章運算符重載5.4特殊運算符重載舉例5.4.1類型轉換運算符5.4.2復合賦值運算符5.4.3自增和自減運算符5.4.4流提取運算符和流插入運算符第5章運算符重載5.4特殊運算符重載舉例5.4.1類型轉換運算符類的轉換構造函數可以將數據由其他類型轉換為當前的類類型。反過來,如果想將數據由當前的類類型轉換為其他類型,需要將類型轉換運算符“()”重載為類的成員函數。其聲明形式為:

類名::operatorT();

該語句聲明將數據由當前的類類型轉換為T類型。注意該成員函數沒有參數,沒有返回類型,但函數體內必須有返回T類型值的語句。第5章運算符重載5.4特殊運算符重載舉例5.4.1類型轉換運算符5.4.2復合賦值運算符5.4.3自增和自減運算符5.4.4流提取運算符和流插入運算符第5章運算符重載5.4特殊運算符重載舉例5.4.2復合賦值運算符第4章介紹了賦值運算符的重載方法。假設在類定義中,重載了賦值運算符“=”和加法運算符“+”,那么復合賦值運算符“+=”是不是就可以直接使用呢?答案是否定的。要想使“+=”適用于類對象,必須單獨進行重載。其他復合賦值運算符也一樣。第5章運算符重載5.4特殊運算符重載舉例5.4.1類型轉換運算符5.4.2復合賦值運算符5.4.3自增和自減運算符5.4.4流提取運算符和流插入運算符第5章運算符重載5.4特殊運算符重載舉例5.4.3自增和自減運算符自增“++”和自減“--”都有前置和后置兩種情況。如果有“inta=3;”,++a的含義是“a的值先加1再被使用”,a++的含義是“先使用a的原值然后a再加1”。重載”++”后應保持原來的含義不變。規(guī)定后置一元運算符重載為成員函數時,帶一個int型參數,該參數并不使用,只是為了和前置情況區(qū)分開。前置++與后置++重載為成員函數的聲明形式分別為:

const類名&類名::operator++(); //前置

const類名類名::operator++(int);//后置運行結果:a:11c:11b:11c:10第5章運算符重載5.4特殊運算符重載舉例5.4.1類型轉換運算符5.4.2復合賦值運算符5.4.3自增和自減運算符5.4.4流提取運算符和流插入運算符第5章運算符重載5.4特殊運算符重載舉例5.4.4流提取和流插入運算符在標準庫的istream類中重載了提取運算符(>>),ostream類中重載了插入運算符(<<),這兩個運算符重載函數可以完成從istream對象(cin)提取和向ostream對象插入基本類型數據的功能,但不能提取和插入類對象數值。如果希望能夠提取和插入類對象數值,需要在定義類時重載這兩個運算符。第5章運算符重載5.1運算符重載的概念 5.2運算符重載的規(guī)則 5.3運算符重載的兩種形式 5.4特殊運算符重載舉例 5.5函數對象

5.6小結

第5章運算符重載5.5函數對象函數對象是指重載了調用運算符“()”(注意與類型轉換運算符區(qū)分開)的普通類對象,但是可以采用與函數調用形式相同的寫法來調用對象的該運算符重載函數。函數對象可以代替函數指針作為參數。優(yōu)點:首先,函數對象可以保存上次調用結果的數據,而使用普通函數只能將結果存儲在全局或者靜態(tài)變量中;其次,編譯器能內嵌重載的運算符代碼,就避免了函數調用所產生的運行時問題。運行結果:5,7第5章運算符重載5.1運算符重載的概念 5.2運算符重載的規(guī)則 5.3運算符重載的兩種形式 5.4特殊運算符重載舉例 5.5函數對象 5.6小結

第5章運算符重載

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論