第6章-類與對象_第1頁
第6章-類與對象_第2頁
第6章-類與對象_第3頁
第6章-類與對象_第4頁
第6章-類與對象_第5頁
已閱讀5頁,還剩36頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

學習目標掌握類的概念和定義方法掌握對象的定義和使用方法了解構造函數和析構函數的特點、功能,掌握它們的定義和使用方法了解靜態(tài)成員的特點以及與非靜態(tài)成員的區(qū)別6.1類6.1.1類的定義類是一種復雜的自定義數據類型。它的定義一般包括說明部分和實現部分。說明部分用來聲明類包含的數據成員和成員函數,實現部分用來定義成員函數的具體實現。類的一般定義形式如下:class<類名>{[[private:]<數據成員及成員函數的說明或實現>][proteted:<數據成員及成員函數的說明或實現>][public:<數據成員及成員函數的說明或實現>]};6.1類6.1.2類的數據成員數據成員是類的一個重要組成部分。類的數據成員同結構struct中的數據成員是一致的,不僅定義的語法一樣,使用的結構也一樣。6.1類6.1.3類的成員函數成員函數實現對類中數據成員的操作。它描述了類的行為。由于對象的封裝性,類的成員函數是對私有數據成員進行操作的唯一途經。1.成員函數的聲明一般地,類的成員函數聲明的結構如下:<返回類型><成員函數名>([<參數列表>]);<返回類型>是成員函數的返回值類型,如果沒有返回值,則類型為void。<成員函數名>是一般的函數名。<參數列表>是函數的形式參數表,如Date類中Set()函數中的inty,intm和intd。6.1類2.成員函數的實現成員函數的聲明只是說明類中需要這樣一個成員函數,該成員函數具體執(zhí)行什么操作,需要進一步定義這個成員函數,來實現它的操作功能。成員函數定義的結構如下:<返回類型><類名>::<成員函數名>([<參數列表>]){<函數體>}成員函數定義的結構與普通函數不同的地方是:在<返回類型>和<成員函數名>之間加了一個“<類名>::”,其中雙冒號“::”是作用域運算符,用來標識成員函數或數據是屬于那個類的。6.1類6.1.4成員函數的存取權限成員函數的存取權限有3級:公有的(public)、保護的(protected)和私有的(private)。(1)公有成員用public關鍵字聲明,它定義了類的外部接口,只有公有成員才可以被用戶程序直接訪問。(2)私有成員用private關鍵字聲明,它定義了類的內部使用的數據和函數,私有的數據成員只能被類本身的成員函數及友元類的成員函數訪問,其他類的成員函數,包括其派生類的成員函數都不能訪問它們;

(3)保護成員用protected關鍵字聲明,存取權限介于公有成員和私有成員之間,它在類的繼承中使用。保護的數據成員與私有數據成員類似,除了能被類本身的成員函數和說明為友元類的成員函數可以訪問外,該類的派生類的成員函數也可以訪問。6.2對象6.2.1對象的定義1.對象的定義對象的定義形式有如下2種:(1)<類名><對象名列表>;(2)在定義類的同時定義對象class<類名>{[[private:]<數據成員及成員函數的說明或實現>][proteted:<數據成員及成員函數的說明或實現>][public:<數據成員及成員函數的說明或實現>]}對象名列表;6.2對象2.對象的存儲空間對象是一個類的變量,也稱為類的實例。在VC++中,在定義類時,系統(tǒng)不會給類分配內存空間,只有創(chuàng)建對象時,C++才為每個對象分配內存空間,用于存放該對象的具體數據成員值;由于所有對象的成員函數的代碼是相同的,所以,系統(tǒng)將成員函數的存儲空間處理成該類的所有對象共享同一代碼空間。6.2對象表6-1常用類型的對齊方式

型對齊方式(變量存放的起始地址相對于結構的起始地址的偏移量)char偏移量必須為sizeof(char)即1的倍數int偏移量必須為sizeof(int)即4的倍數float偏移量必須為sizeof(float)即4的倍數double偏移量必須為sizeof(double)即8的倍數short偏移量必須為sizeof(short)即2的倍數6.2對象6.2.2對象成員的使用定義對象后,就可以用對象訪問其成員,訪問格式如下:<對象名>.數據成員名<對象名>.成員函數名([<參數列表>])說明(1)“.”稱為成員引用符,指示對象的成員。(2)<對象名>也可以使用指向對象的指針替代,則訪問對象的格式為:

<指向對象的指針>->數據成員名

<指向對象的指針>->成員函數名([參數列表])6.2對象6.2.3定義類和對象的有關說明定義類和對象的有關說明如下:(1)類中數據成員的類型可以是基本數據類型(如整型、實型、字符型等)、構造數據類型(如數組類型、指針類型、引用類型、結構類型等),以及自定義的“類”類型(結構類型是“類”類型的特例)。自身類的指針或引用可以作為類的成員,但自身類的對象不可作為成員。(2)當定義一個類時,引用了另一個類,而另一個類的定義在當前類的后面,則必須對另一個類作引用性說明。6.3對象的初始化和撤銷6.3.1構造函數1.構造函數的定義構造函數的定義可以在類體內也可以在類體外。?在類體內定義構造函數的一般格式是:<類名>([<形參列表>]) //此處的“類名”作為構造函數名{…

//數據成員的初始化語句

}在類體外定義時,必須在體內聲明,聲明格式為:

<類名>([<形參列表>]);//構造函數的聲明6.3對象的初始化和撤銷2.構造函數的運行定義了構造函數,在創(chuàng)建對象時,編譯系統(tǒng)先根據類的說明,為該對象分配存儲空間,然后自動調用合適的構造函數對對象進行初始化。對象的創(chuàng)建格式如下:<類名><對象名>(<構造函數的實參列表>);3.帶默認參數值的構造函數與普通函數一樣,構造函數中的參數也可以缺省,這時,如果在創(chuàng)建對象時不指定參數,編譯系統(tǒng)將使用默認值來初始化數據成員。6.3對象的初始化和撤銷4.構造函數的重載在定義一個類時,可以根據需要定義一個或多個構造函數,若定義多個構造函數稱為構造函數的重載。構造函數也可以根據參數個數或類型的不同進行重載。6.3對象的初始化和撤銷6.3.2析構函數析構函數也是一個特殊的成員函數,它的作用與構造函數相反,析構函數的功能是:系統(tǒng)在撤銷對象時,自動調用它做一些清理工作。即析構函數是用來釋放該對象所占用的資源。析構函數的名稱和類名相同,在類名前加上了一個“~”符號。析構函數同構造函數一樣,不能有任何返回類型,也不能有void類型。析構函數是無參數函數,不能重載,一個類只能有一個析構函數。析構函數的定義可以在類體內也可以在類體外。?在類體內定義析構函數的一般格式是:

<~類名>()//此處的“~類名”作為析構函數名

{…

//清理工作語句

}6.3對象的初始化和撤銷6.3.2析構函數?在類體外定義析構函數的一般格式是:

<類名>::<~類名>()

{ … //清理工作語句

}6.3對象的初始化和撤銷6.3.3拷貝構造函數拷貝構造函數是一種特殊的構造函數,它的功能是用一個已知對象來初始化一個新創(chuàng)建的同類對象。?在類體外定義拷貝構造函數的格式如下:

<類名>::<類名>([const]類名&obj]//注意形參是實參對象的[常]引用

{<函數體>}?在類體內定義拷貝構造函數的格式是:把前面的類名限定去掉即可。

<類名>([const]類名&obj]//注意形參是實參對象的[常]引用

{<函數體>}6.4靜態(tài)成員6.4.1靜態(tài)數據成員靜態(tài)數據成員不從屬于任何一個具體對象,所以必須對它初始化,而且對它的初始化不能在構造函數中進行。靜態(tài)數據成員的定義和使用方法如下:(1)靜態(tài)數據成員的定義格式為:

<static><數據類型><靜態(tài)數據成員名>;(2)靜態(tài)數據成員初始化的格式為:

<數據類型><類名>::<靜態(tài)數據成員名>=<值>;(3)靜態(tài)數據成員的訪問格式為:

<類名>::<靜態(tài)數據成員名>6.4靜態(tài)成員6.4.2靜態(tài)成員函數類似于靜態(tài)數據成員,也可以把成員函數聲明為靜態(tài)的,即靜態(tài)成員函數。靜態(tài)成員函數也是屬于整個類,只要類存在,靜態(tài)成員函數就可以使用。因此,對靜態(tài)成員的引用不需要用對象名。在靜態(tài)成員函數的實現中不能直接引用類中說明的非靜態(tài)成員,但可以引用類中說明的靜態(tài)成員。如果靜態(tài)成員函數中要引用非靜態(tài)成員時,則可通過對象來引用。

(1)靜態(tài)成員函數的聲明格式為:<static><返回類型><靜態(tài)成員函數名>([<形式參數列表>]);6.4靜態(tài)成員(2)靜態(tài)成員函數的定義可以在類體內,也可以在類體外。?在類體內定義格式為:<static><返回類型><靜態(tài)成員函數名>([<形式參數列表>]){<函數體>}?如果在類體外定義,首先要在類體內聲明函數。在類體外定義格式為:<返回類型><靜態(tài)成員函數名>([<形式參數列表>]){<函數體>}(3)靜態(tài)成員函數的訪問格式為:<類名>::<靜態(tài)成員函數名>([<參數表>]);6.5友元類具有封裝性和隱藏性。只有類的成員函數才能訪問該類的私有成員,而程序中的其它函數是無法訪問的類中私有成員的,它們僅能訪問類中的公有成員。這給類的數據訪問帶來了不便。為了解決這個問題,C++提供了友元機制。6.5.1普通函數作為友元函數要使一個函數成為某個類的友元函數,必須在該類中對此函數進行聲明。聲明友元函數的方式是在類中使用關鍵字friend,其一般格式為:friend<返回類型><友元函數名>([<參數表>]);6.5友元6.5.3友元類不僅函數可以作為一個類的友元,一個類也可以作為另一個類的友元,這時該類稱為友元類。當一個類作為另一個類的友元時,意味著這個類的所有成員函數都是另一個類的友元函數??梢园慈缦路绞蕉x友元類:

classA { ... friendclassB;//定義類B是類A的友元類

}; classB { ... public: voidf1(); floatf2(); floatf3(); };

于是,在B類的所有成員函數(如f1()、f2()、f3())中,均可直接訪問A類的私有成員。6.6類與指針一個對象一旦被創(chuàng)建,系統(tǒng)就給它分配了一個存儲空間,該存儲空間的起始地址可以象簡單變量的地址一樣,使用指針變量操作。對象初始化后,會占用內存空間,可以使用指針變量指向對象起始地址,稱為對象指針。對于類來說,可以定義指向其對象的指針和指向類成員的指針。此外,在C++的類中,還有一種特殊的指針,即this指針。6.6類與指針6.6.1指向類對象的指針類作為一種數據類型,可以定義變量(即對象),也可定義指針,即指向類類型變量(對象)的指針,稱為指向類對象的指針或指向對象的指針。?指向類對象指針的定義格式為:類名*指針變量名;?對象指針一旦指向某一對象后,就可以用它進行訪問。通常使用“->”或“(*).”運算符:指針變量->成員

(*指針變量).成員6.6類與指針6.6.2new和delete函數new和delete是C++動態(tài)申請存儲單元和刪除存儲單元的函數。對于動態(tài)申請存儲空間,只能通過指針間接訪問,而沒有直接訪問方式。1.new運算符new運算符常用的四種格式如下:(1)格式一:<指針變量>=new<數據類型>;功能:申請一個<數據類型>變量的空間,返回該空間的起始地址,并賦給<指針變量>。6.6類與指針(1)格式二:<指針變量>=new<數據類型>(<值>);功能:申請一個<數據類型>變量的空間,用<值>初始化該空間,返回該空間的起始地址,并賦給<指針變量>。與格式一的區(qū)別在于給定變量初值。(3)格式三:<指針變量>=new<數據類型>[<表達式>];功能:申請一個一維數組空間,數據元素類型是<數據類型>,元素的個數是<表達式>,返回該空間的起始地址,并賦給<指針變量>。(4)格式四:<指針變量>=new<數據類型>[<表達式1>][<表達式2>];功能:申請一個二維數組空間,數據元素類型是<數據類型>,行數是<表達式1>,列數是<表達式2>,返回該空間的起始地址,地址類型是行指針,并賦給<指針變量>。6.6類與指針2.delete運算符delete運算符有兩種格式:(1)格式一:

delete<指針變量>;功能:釋放一個由<指針變量>指向的變量的空間。用于釋放由new運算符格式一及格式二分配的空間。(2)格式二:

delete[N]<指針變量>;//N可省略功能:釋放一個由<指針變量>指向的數組的空間,該數組有N個元素。數組可以是一維或二維數組。6.6類與指針6.6.3this指針this是一個隱含于成員函數中(或對象內)的特殊指針。該指針指向調用成員函數的當前對象。當對象調用成員函數時,系統(tǒng)自動將對象自身的指針(對象的地址)傳遞給成員函數,在成員函數中可直接使用該指針,指針名為this。通常在成員函數中直接寫變量名訪問數據成員,實際上,由于成員函數中隱含著一個指針this,它指向調用成員函數的對象,所以,可以通過this指針訪問它所指向的對象的成員。6.7情景應用——圖書借閱管理系統(tǒng)6.7.1項目描述1.客戶需求描述某社區(qū)圖書館為了提高辦公效率,減少因紙張浪費帶來的辦公開支,現欲開發(fā)一個圖書借閱管理系統(tǒng)。該系統(tǒng)具有如下功能:?新進圖書入庫 ?讀者注冊登記 ?辦理借還書手續(xù)?為讀者提供借書查詢

?館內庫存圖書查詢6.7情景應用——圖書借閱管理系統(tǒng)2.實施方案按照項目所涉及的技術與教材關聯知識點,分三個版本開發(fā)完善。(1)第一版:利用面向對象程序設計方法,設計三個類:圖書類Item、讀者類Reader和圖書館操作類CMain,能模擬圖書籍入庫、讀者注冊、借還書等功能。(2)第二版:在第一版的基礎上,增加雜志的借閱功能。利用繼承和派生的知識,從書籍和雜志中抽象出共性,建立圖書基類Book,將書籍和雜志作為其派生類。(3)第三版:在第二版的基礎上,增加數據存儲功能,完善圖書借閱管理系統(tǒng)。6.7情景應用——圖書借閱管理系統(tǒng)6.7.2類的設計在一個信息系統(tǒng)內識別對象是最基本的,通過識別不同對象并進行抽象和分類,就能識別出相同屬性和行為的對象歸納類。在圖書借閱管理系統(tǒng)內,有書籍名Title、讀者Author、借書證Code、管理人員借還書行為等對象和事件,他們分別各是一個類。確定圖書借閱管理系統(tǒng)的各個類,并確定各個類對象的屬性。1.圖書類Item圖書館有成千上萬的書,每冊書都是一個對象,它們形成圖書類(Item)。圖書類,從流通管理的角度來看,應包含書名Title、作讀者Author、分類號IndexCode、條形碼BarCode等屬性。并包含為各數據成員賦值操作、讀取條碼(GetCode)、顯示圖書的基本信息等操作。6.7情景應用——圖書借閱管理系統(tǒng)6.7.2類的設計classItem{ charTitle[40]; //書名

charAuthor[20]; //作者

charIndexCode[10];//分類號

longBarCode; //條形碼public: Item(); voidSetTitle(char[]); voidSetAuthor(char[]); voidSetIndexCode(char[]); voidSetBarCode(long); longGetBarCode(){returnBarCode;} voidShow(); //顯示書的信息};6.7情景應用——圖書借閱管理系統(tǒng)2.讀者類Reader讀者類(Reader),包含姓名(Name)、職務(Position)、借書證號(Code)等屬性。一個讀者允許借若干冊書,用一個Item的數組保存相應信息。另外對讀者所借書的統(tǒng)計itemCounter。對其屬性的操作行為定義為類的成員函數。即:需定義為各屬性賦值的操作、讀取借書證的操作。借還書需要修訂所借書數組,定義AddBook()和DelBook()兩個操作,顯示所借書的操作ShowBook()。3.操作類CMain在圖書借閱管理系統(tǒng)內,操作類(CMain),包含統(tǒng)計庫存書籍總冊數、已注冊的讀者人數等屬性。同時,包含為新

溫馨提示

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

評論

0/150

提交評論