C++程序設(shè)計教程8_第1頁
C++程序設(shè)計教程8_第2頁
C++程序設(shè)計教程8_第3頁
C++程序設(shè)計教程8_第4頁
C++程序設(shè)計教程8_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C++程序設(shè)計教程(第二版)第八章

類Chapter8

Class

蘇州大學計算機科學與技術(shù)學院2/5/20231類

類是一種可以作為交易的概念代碼.類是自定義的數(shù)據(jù)類型.類與應(yīng)用程序不同,類的功能雖然獨立,但不能獨立啟動,就象汽車零件那樣.類機制要通過編程的方法來維護類的數(shù)據(jù)表達,值范圍和操作并不是簡單的,因為要限制一些操作只能讓類自己來做,以免發(fā)生問題時,無人敢對其負責.類機制就是通過語言的規(guī)定性來實現(xiàn)一些技術(shù),使類具有數(shù)據(jù)封裝,信息屏蔽,多態(tài)等特征,起到數(shù)據(jù)類型的作用,而達到方便編程的目的.2/5/20232第八章內(nèi)容從結(jié)構(gòu)到類(FromStructuretoClass)

成員函數(shù)(MemberFunctions)

操作符(Operators)

再論程序結(jié)構(gòu)(ProgramStrutureRestatement)

屏蔽類的實現(xiàn)(ShieldClassImplementations)

靜態(tài)成員(StaticMembers)

友元(Friends)2/5/202338.1從結(jié)構(gòu)到類結(jié)構(gòu)體舉例(f0801)單純堆積數(shù)據(jù)空間構(gòu)造的類型,不含有相關(guān)操作所有相關(guān)操作都必須由使用結(jié)構(gòu)體的程序員自己承擔,不便于代碼的移植和重用僅是一個不完整的自定義數(shù)據(jù)類型2/5/202348.1從結(jié)構(gòu)到類類概念:不但描述數(shù)據(jù)空間,還描述其操作的自定義類型定義方法classDate{ private:

int

year,month,day; public: voidsetdate(int,int,int); ……};2/5/202358.1從結(jié)構(gòu)到類類舉例(f0802)成員函數(shù)和成員變量成員權(quán)限privatepublicProtected類定義的兩部分:類定義本體和成員函數(shù)定義一般情況下類的定義和應(yīng)用程序為多文件結(jié)構(gòu)2/5/202368.1從結(jié)構(gòu)到類類對象和變量變量:由內(nèi)部數(shù)據(jù)類型或衍生的結(jié)構(gòu)類型所產(chǎn)生的實體對象:由類產(chǎn)生的實體,本質(zhì)上,變量也是對象,只不過粗糙一點罷了2/5/202378.1從結(jié)構(gòu)到類類和結(jié)構(gòu)體的比較結(jié)構(gòu)體的開放性類的封閉和自成一體性類的使用使得程序開發(fā)的流程分工變得極為清晰2/5/202388.2成員函數(shù)成員函數(shù)與普通函數(shù)的區(qū)別成員函數(shù)屬于類,成員函數(shù)定義是類設(shè)計的一部分,其作用域是類作用域.而普通函數(shù)一般為全局函數(shù)成員函數(shù)的操作主體是對象,使用時通過捆綁對象來行使其職責,而普通函數(shù)被調(diào)用時沒有操作主體2/5/202398.2成員函數(shù)成員函數(shù)的定義方法類內(nèi)部定義類外部定義合理選擇上述兩種方法的原則成員函數(shù)的內(nèi)聯(lián)性問題成員函數(shù)可以在類內(nèi),也可以在類外定義,若在類內(nèi)定義,則默認為內(nèi)聯(lián)函數(shù).但編譯器對內(nèi)聯(lián)的接受自有其原則.2/5/202310成員函數(shù)的定義方法classDate{

intyear,month,day;public:voidset(inty,intm,intd)//默認內(nèi)聯(lián)

{ year=y;month=m;day=d;}…};inlinebool

Date::isLeapYear()//顯式內(nèi)聯(lián){ return!(year%400)||!(year%4)&&year%100;}…8.2成員函數(shù)17:26:1711訪問成員函數(shù)的方式對象方式

Dated;d.set(2005,12,5);…對象指針方式

Date*dp=newDate;

dp->set(2005,12,5);//…deletedp;17:26:1712常成員函數(shù)與函數(shù)的常量參數(shù)常成員函數(shù)

對捆綁的對象,不允許寫操作函數(shù)的常量參數(shù)對傳遞的參數(shù),不允許寫操作例如:

bool

Date::comp(constDate&a)const{year=2005;//error:常成員函數(shù)捆綁的對象

a.year=2003;//error:常量對象

returnyear==b.yaer&&month==a.month&&day==a.day;}

常成員函數(shù)的服務(wù)對象一般是類的使用者2/5/202313重載成員函數(shù)類的成員函數(shù)允許進行重載重載的處理規(guī)則和以前相同舉例(f0804)2/5/2023148.3操作符操作符定義的函數(shù)重載特征操作符在類中定義的目的:方便編程和直觀上的理解操作符定義就是函數(shù)定義,調(diào)用操作符就是調(diào)用函數(shù)舉例:f0805

Pointoperator+(constPoint&a,constPoint&b){Points;

s.set(a.x+b.x,a.y+b.y);returns;}Pointp,q;p.set(3,2);q.set(1,5);Pointr=p+q;//p+q等價于operator+(p,q)2/5/2023158.3操作符操作符在類中定義的作用:

讓編譯器理解人性化編程代碼.從正確性上講并不是必要的.例如,Java不允許操作符重載操作符在類中定義的性質(zhì)不能創(chuàng)建新的操作符:如@個別操作符不能重載:如“::”、“.”、“?:”等,因為對這些運算符的重載會嚴重破壞語法規(guī)則優(yōu)先級和結(jié)合性不能改變Pointa,b,c;Pointd=a+b*c;操作數(shù)不能改變專門處理對象禁止使重載后的操作符的意義發(fā)生根本變化2/5/202316運算符重載時的值返回和引用返回值返回:返回臨時表達式的值,例如:Pointoperator+(constPoint&a,constPoint&b){Points;

s.set(a.x+b.x,a.y+b.y);returns;}引用返回:如果有將返回值放入?yún)?shù)中并需要進行連續(xù)操作的需要,便需要以引用形式返回參數(shù)。例如:ostream&operator<<(ostream&o,constPoint&d){returno<<”(“<<d.x<<”,“<<d.y<<”)\n”;}8.3操作符2/5/202317增量操作符的重載增量操作符重載時的特殊性:前后增量的形式相同但意義不同前增量運算符分析:運算后表達式結(jié)果和變量自身結(jié)果的一致,且要求進行變量本身的左值連續(xù)運算后增量運算符分析:運算后表達式結(jié)果和變量自身結(jié)果的不一致,且不允許進行變量本身的左值連續(xù)運算處理方法:使參數(shù)和返回值類型不同舉例:f0806后增量運算符重載時的編譯特殊處理:實參和形參個數(shù)不一致8.3操作符2/5/202318運算符重載的成員函數(shù)化處理成員函數(shù)形式的操作符重載:PointPoint::operator+(constPoint&d)const{Points;

s.set(x+d.x,y+d.y);returns;}普通函數(shù)形式的操作符重載:

Pointoperator+(constPoint&a,constPoint&b)const{Points;

s.set(a.x+b.x,a.y+b.y);returns;}8.3操作符2/5/202319運算符重載的成員函數(shù)化處理無論是成員函數(shù)形式的重載還是普通函數(shù)形式的重載:p+q等價于成員操作符p.operator+(q),或者普通操作符operator(p,q)兩者必居其一.成員函數(shù)形式的運算符重載的必要條件:某個操作數(shù)是當前類的對象<<不可以成為成員函數(shù)形式重載的原因8.3操作符2/5/2023208.4再論程序結(jié)構(gòu)訪問控制成員函數(shù)一般為公有public。公有的成員函數(shù)在類的外部可以被使用,即外界可以調(diào)用成員函數(shù).數(shù)據(jù)成員一般為私有private。私有的數(shù)據(jù)成員在外部不能被訪問,即外界不能訪問對象的數(shù)據(jù)分量,而只能由成員函數(shù)內(nèi)部去處理.公有和私有可任意設(shè)定訪問控制public和private是語言提供給程序員的功能:類的內(nèi)部和外部被隔絕類的界面(接口):類全部公有成員函數(shù)的聲明2/5/2023218.4再論程序結(jié)構(gòu)類的程序結(jié)構(gòu)舉例:f0809類定義作為頭文件,如:point.h類的實現(xiàn)作為獨立編譯單元,如:point.cpp使用類的程序作為另一獨立編譯單元,如:f0809.cpp類的頭文件和類的實現(xiàn)可以作為一個獨立的資源提供給編程者.內(nèi)聯(lián)的成員函數(shù)定義一般放在頭文件中.頭文件中必須使用頭文件衛(wèi)士技術(shù).2/5/202322類作用域和類定義作用域類定義作用域:從類定義結(jié)束開始,到從外面包圍類定義的塊結(jié)束(若類定義外無包圍塊,則結(jié)束于文件);使用類的程序員在類定義作用域下編程類作用域:類定義內(nèi)部及成員函數(shù)定義內(nèi)部;實現(xiàn)類的程序員在類作用域下編程舉例(f0810)類作用域中成員變量被局部變量屏蔽的現(xiàn)象及其理解類作用域其實是類定義作用域的子集8.4再論程序結(jié)構(gòu)2/5/2023238.5屏蔽類的實現(xiàn)使用類的應(yīng)用程序只需要類定義頭文件編程實現(xiàn)類,也只需要類定義頭文件,不需要使用類的程序細節(jié)確定了類定義(頭文件),便可以從事兩方面的編程而互不干涉.類定義成功地屏蔽了類的實現(xiàn),是類機制的技術(shù)體現(xiàn).舉例2/5/2023248.6靜態(tài)成員8.6.1靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員的需要性類中屬性的共有性使用全局變量來解決屬性共有性問題的缺陷應(yīng)該屬于類,但不能使用普通成員變量的形式來實現(xiàn)屬性共有舉例:f08122/5/202325靜態(tài)數(shù)據(jù)成員的使用概念:屬于類的全部對象所有的靜態(tài)成員變量稱為靜態(tài)數(shù)據(jù)成員,它對于每個類而言只有一個實體,每個對象中不再有它的副本。定義方法:分為聲明和定義初始化兩個形式舉例:f0813合理的靜態(tài)數(shù)據(jù)成員定義初始化位置類定義頭文件(類定義體內(nèi)部和外部):KOMain函數(shù)所在文件的的開頭:KO類定義內(nèi)部實現(xiàn)部分(即成員函數(shù)定義的位置):OK8.6靜態(tài)成員2/5/2023268.6.2靜態(tài)成員函數(shù)調(diào)用時,不捆綁對象,所以,不能直接操作對象和其成員,若需訪問該類對象,必須以參數(shù)傳遞之.靜態(tài)成員函數(shù)一般設(shè)計為公有的,以訪問私有靜態(tài)數(shù)據(jù)成員為目的.靜態(tài)成員函數(shù)一般不能訪問普通成員變量調(diào)用方式是以類名加域操作符::后跟靜態(tài)成員函數(shù).舉例:f08148.6靜態(tài)成員2/5/2023278.7友元友元的概念需要使用友元的原因:某些類以外的函數(shù)(如普通函數(shù)等)需要直接訪問某個類的保護或私有成員需要使用友元的目的:提高效率友元使用的后果:破壞了類的封裝特性(除特殊情況,不推薦使用)舉例(f0815):若以普通函數(shù)的身份實現(xiàn),則要大量調(diào)用成員函數(shù)去訪問私有數(shù)據(jù)成員,而用友元之后,可

溫馨提示

  • 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

提交評論