版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
C++大學基礎教程第8章類與對象
北京科技大學信息基礎科學系2023/12/221北京科技大學類是實現(xiàn)C++面向對象程序設計的基礎。面向對象程序設計的基本特點有:抽象、封裝、繼承和多態(tài),類把數(shù)據(jù)和函數(shù)封裝在一起,是C++封裝的基本單元。28.1類和對象的定義8.2對象的使用8.3構造函數(shù)8.4析構函數(shù)8.5拷貝構造函數(shù)8.6類的靜態(tài)成員8.7類成員的保護和使用8.8類的組合(不要求)8.9面向對象分析和設計(不要求)第8章類與對象3
8.1類和對象的定義
2023/12/224北京科技大學8.1類和對象的定義一個類表示現(xiàn)實生活中的一類事物,比如“學生”事物有相應的特征或屬性,它們就是類的數(shù)據(jù)成員;事物可能有行為動作,也可能被某些行為動作所操作,這些都用函數(shù)來實現(xiàn),這些函數(shù)和類有著不可分割的關系,是構成類的函數(shù)成員,或者叫成員函數(shù)。在C++中,類實際上相當于一種用戶自定義的數(shù)據(jù)類型。
5對象是一類事物中的一個具體的個體。在定義了類類型后,就可以定義該類型的變量,這個變量就稱為類的對象(或實例)。所以,從程序設計的角度來看,對象就相當于變量。
8.1類和對象的定義6舉例:classStudent//類的定義{private:
intid; charname[20];
intage; floatscore;public: voidgetscore() voidprintstu()};
8.1類和對象的定義71、使用類對象如果已經(jīng)知道某個類的功能和接口函數(shù),就可以使用它了。先定義類對象,通過對象調(diào)用接口函數(shù)實現(xiàn)一定的功能。
classstudentstu01;//class也可以省略不寫stu01.getscore();stu01.printstu();
這個過程的本質(zhì)是:根據(jù)對象所需要完成的任務,向對象發(fā)送消息。對象收到消息后,調(diào)用接口中的相應的函數(shù),完成它的功能。對象只需要知道“做什么”,具體工作由成員函數(shù)來完成。
82、類的聲明類的聲明具體說明類的組成,聲明類的語法形式為: class類名稱 {public:
公有成員 protect:
保護型成員 private:
私有成員 };9其中,“成員”既可以是數(shù)據(jù)成員,也可以是成員函數(shù)的原型。數(shù)據(jù)成員的聲明方式與一般變量相同。函數(shù)成員是描述類的對象可以進行的操作,一般在類中聲明原型,在類聲明的外面定義函數(shù)的具體實現(xiàn)。2、類的聲明102、類的聲明關鍵字public、protect、private說明類成員的訪問控制屬性。私有(private)成員只允許本類的成員函數(shù)來訪問;公有(public)成員是類對外的接口,在類聲明和類(函數(shù))實現(xiàn)之后,類的對象可以訪問公有成員。保護型(protected)成員的可訪問性和私有成員的性質(zhì)相似。11關于訪問控制屬性,注意:在類聲明中,三種訪問控制屬性,可以按任意次序出現(xiàn),也可以不出現(xiàn)。public等關鍵字也可以多次出現(xiàn),但是一個成員只能具有一種訪問控制屬性。如果不寫訪問控制屬性關鍵字,默認的是private。在書寫時通常習慣將公有類型放在最前面,這樣便于閱讀,因為它們是外部訪問時所要了解的。一般情況下,一個類的數(shù)據(jù)成員應該聲明為私有成員,這樣封裝性較好。一個類應該有一些公有的函數(shù)成員,作為對外的接口,否則別的代碼無法訪問類
2、類的聲明12類的成員函數(shù)描述的是類的行為或操作。函數(shù)的原型聲明要在類的主體中,原型說明了函數(shù)的參數(shù)表和返回值類型。而函數(shù)的具體實現(xiàn)一般是寫在類聲明之外的。在類的外部定義成員函數(shù)的語法形式為:
返回值類型類名::成員函數(shù)名(參數(shù)表){
函數(shù)體}3、類的成員函數(shù)13如果在類的內(nèi)部定義成員函數(shù)的具體實現(xiàn),則該成員函數(shù)為內(nèi)聯(lián)成員函數(shù)。函數(shù)定義時沒有任何的附加說明,所以稱為隱式聲明的內(nèi)聯(lián)成員。
3、類的成員函數(shù)14定義一個對象和定義一個一般變量相同。定義變量時要分配存儲空間,同樣,定義一個對象時要分配存儲空間,一個對象所占的內(nèi)存空間是類的數(shù)據(jù)成員所占的空間總和。類的成員函數(shù)存放在代碼區(qū),不占內(nèi)存空間。類的成員是抽象的,對象的成員才是具體的。類的數(shù)據(jù)成員都不會有具體的屬性值。只有對象的成員才會有具體的屬性值。4、對象15聲明了類及其對象,在類的外部(指類定義和成員函數(shù)的實現(xiàn)代碼之外),就可以訪問對象的公有成員(包括數(shù)據(jù)成員和函數(shù)成員)了。
在類的外部,只能通過對象訪問類的公有成員;在類的成員函數(shù)內(nèi)部,可以直接訪問類的所有成員,這就實現(xiàn)了對訪問范圍的有效控制。
4、對象16類作用域是指類定義和相應的成員函數(shù)定義的范圍,通俗地稱為類的內(nèi)部。C++認為一個類的全部成員都是一個整體的相關部分。一個類的所有成員位于這個類的作用域內(nèi),在該范圍內(nèi),一個類的成員函數(shù)對本類的其它成員具有無限制的訪問權。
5、類的作用域與可見性17
8.2對象的使用
2023/12/2218北京科技大學8.2對象的使用對象是類的一個具體的實例,類和對象的關系相當于普遍與特殊的關系。在C++中,類是一個自定義的數(shù)據(jù)類型,對象是該數(shù)據(jù)類型的一個變量。所以,可以定義一個全局的對象,也可以在函數(shù)體中定義一個局部的對象,或者動態(tài)地從堆中申請空間來創(chuàng)建一個對象,還可以定義對象數(shù)組,以及使用對象作為函數(shù)的參數(shù)與返回值。
191、對象指針聲明對象指針的一般語法形式為:類名*對象指針名;使用對象指針訪問對象的成員,語法形式為:對象指針名->公有成員;例如:Clockc; //在棧中分配Clock型存儲空間Clock*pc1=newClock;//在堆中分配Clock型存儲空間Clock*pc2=&c;
pc1->SetTime(12,5,0);202、
this指針問:一個類中所有對象調(diào)用的成員函數(shù)都執(zhí)行同一段代碼。那么,成員函數(shù)又是怎么識別當前是那個對象在訪問呢?
答:this指針指出了成員函數(shù)當前所操作的數(shù)據(jù)所屬的對象。不同的對象調(diào)用成員函數(shù)時,this指針將指向不同的對象,也就可以訪問不同對象的數(shù)據(jù)成員。
213、對象數(shù)組對象數(shù)組的元素是對象,不僅具有數(shù)據(jù)成員,而且還有函數(shù)成員,可以通過數(shù)組元素調(diào)用成員函數(shù)。
224、對象用做函數(shù)的參數(shù)和返回值可以將對象作為參數(shù)傳遞給一個函數(shù)或從函數(shù)返回一個對象。直接用對象作為參數(shù),調(diào)用函數(shù)時,進行值傳遞,實參的值要復制給形參,如果類的數(shù)據(jù)成員較多時,需要一一復制,這種參數(shù)傳遞方式效率不高,可以使用對象指針或對象引用方式來傳遞函數(shù)參數(shù)。23
8.3構造函數(shù)
2023/12/2224北京科技大學8.3構造函數(shù)每個對象區(qū)別于其他對象的地方主要有兩個,外在的區(qū)別就是對象的標識符,即對象的名稱,而內(nèi)在的區(qū)別就是對象自身的屬性值,即數(shù)據(jù)成員的值。在定義一個對象的時候要給它分配存儲空間,也可以同時給它的數(shù)據(jù)成員賦初值,稱為對象的初始化。C++程序中的對象初始化工作由一個特殊的成員函數(shù)來完成,就是構造函數(shù)。因為不同類型的對象的初始化工作是不一樣的,因此構造函數(shù)從屬于某個類的,即每個類都要定義它自己的構造函數(shù),它是類的成員函數(shù)。
25定義構造函數(shù)的一般形式為:class類名{public:
類名(形參表); //構造函數(shù)的原型 //類的其它成員};類名::類名(形參表) //構造函數(shù)的實現(xiàn){ //函數(shù)體}
8.3構造函數(shù)26構造函數(shù)的特點是:構造函數(shù)的函數(shù)名與類名相同;而且沒有返回值。構造函數(shù)一定是公有函數(shù)。作為類的成員函數(shù),構造函數(shù)可以直接訪問類的所有數(shù)據(jù)成員。在類的內(nèi)部定義的構造函數(shù)是內(nèi)聯(lián)函數(shù)。構造函數(shù)可以帶默認形參值,也可以重載。
8.3構造函數(shù)27在聲明類是如果沒有定義類的構造函數(shù),編譯系統(tǒng)就會在編譯時自動生成一個默認形式的構造函數(shù),默認構造函數(shù)是構造對象時不提供參數(shù)的構造函數(shù)。除了無參數(shù)構造函數(shù)是默認構造函數(shù)外,帶有全部默認參數(shù)值的構造函數(shù)也是默認構造函數(shù)。8.3構造函數(shù)28
8.4析構函數(shù)
2023/12/2229北京科技大學與構造函數(shù)相反,當對象生存期結束時,需要調(diào)用析構函數(shù),釋放對象所占的內(nèi)存空間。與構造函數(shù)一樣,析構函數(shù)也是類的一個公有成員函數(shù),它的名稱是在類名前加“~”構成,沒有返回值,和構造函數(shù)不同的是析構函數(shù)不接受任何參數(shù)。析構函數(shù)是在對象生存期即將結束的時刻由系統(tǒng)自動調(diào)用的。如果程序員沒有定義析構函數(shù),系統(tǒng)將自動生成和調(diào)用一個默認析構函數(shù)。類的析構函數(shù)不能重載。8.4析構函數(shù)30
8.5拷貝構造函數(shù)
2023/12/2231北京科技大學拷貝構造函數(shù)就是函數(shù)的形參是類的對象的引用的構造函數(shù)。通過等于號復制對象時,系統(tǒng)會自動調(diào)用拷貝構造函數(shù)。如果程序在類定義時沒有顯式定義拷貝構造函數(shù),系統(tǒng)也會自動生成一個默認的拷貝構造函數(shù),把成員值一一復制。拷貝構造函數(shù)與原來的構造函數(shù)實現(xiàn)了函數(shù)的重載。8.5拷貝構造函數(shù)32完成簡單的一一對應的復制的拷貝構造函數(shù)稱為淺拷貝。如果類的數(shù)據(jù)成員包括指針變量,類的構造函數(shù)用new運算符為這個指針動態(tài)申請空間。如果通過淺拷貝進行了對象的復制。最后,在退出運行時,程序會報錯。這時需要用“深拷貝”的方式恰當定義類的拷貝構造函數(shù)。一般來講,如果一個類需要析構函數(shù)來釋放資源,則它也需要定義一個顯式拷貝構造函數(shù)來實現(xiàn)深拷貝。
淺拷貝與深拷貝33以下三種情況系統(tǒng)會自動調(diào)用拷貝構造函數(shù):當用類的一個對象去初始化該類的另一個對象時如果函數(shù)的形參是類的對象,調(diào)用函數(shù)時,進行形參和實參結合時如果函數(shù)的返回值是類的對象,函數(shù)執(zhí)行完成返回調(diào)用者時8.5拷貝構造函數(shù)34
8.6類的靜態(tài)成員
2023/12/2235北京科技大學1、靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員是類的數(shù)據(jù)成員的一種特例,采用static關鍵字來聲明。類的數(shù)據(jù)成員在類的每一個對象中分別存儲不同的數(shù)值,但是靜態(tài)數(shù)據(jù)成員則不同,它在整個類中只有一個拷貝,由該類的所有對象共同維護和使用,從而實現(xiàn)了同一類的不同對象之間的數(shù)據(jù)共享。靜態(tài)數(shù)據(jù)成員具有靜態(tài)生存期。在類的聲明中只能聲明靜態(tài)數(shù)據(jù)成員的存在。由于類的聲明是抽象的,靜態(tài)數(shù)據(jù)成員的初始化需要在類的外部進行,通過類名對它進行訪問。362、靜態(tài)成員函數(shù)可以通過定義和使用靜態(tài)成員函數(shù)來訪問靜態(tài)數(shù)據(jù)成員。所謂靜態(tài)成員函數(shù)就是使用static關鍵字聲明函數(shù)成員。同靜態(tài)數(shù)據(jù)成員一樣,靜態(tài)成員函數(shù)也屬整個類,由同一個類的所有對象共同維護,為這些對象所共享。372、靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)作為成員函數(shù),它的訪問屬性可以受到類的嚴格控制。對公有靜態(tài)成員函數(shù),可以通過類名或對象名來調(diào)用;而一般的非靜態(tài)公有成員函數(shù)只能通過對象名來調(diào)用。靜態(tài)成員函數(shù)可以直接訪問該類的靜態(tài)數(shù)據(jù)成員和函數(shù)成員;而訪問非靜態(tài)數(shù)據(jù)成員,必須通過參數(shù)傳遞方式得到對象名,然后通過對象名來訪問。38
8.7類成員的保護和使用
2023/12/2239北京科技大學1、類的封裝在程序設計中,將數(shù)據(jù)與操作數(shù)據(jù)的行為進行有機地結合,這就是封裝。C++語言提供類這種語言成分來實現(xiàn)封裝,類是屬性和操作的結合體,并且在定義類的屬性和操作時,規(guī)定了它們的可見性。通過封裝將一部分成員作為類與外部的接口,而將其它的成員隱藏起來,以防外界的干擾和誤操作,使程序的不同模塊之間的相互影響減小到最低限度。402、友元在一個類中,可以利用關鍵字friend將別的模塊(一般函數(shù)、其它類的成員函數(shù)或其它類)聲明為本類的友元,這樣類中本來隱藏的信息(私有和保護成員)就可以被友元訪問。友元提供了不同類或對象的成員函數(shù)之間、類的成員函數(shù)與一般函數(shù)之間進行數(shù)據(jù)共享的機制。友元并不是類的成員。412、友元關于友元類,要注意:友元關系是不能傳遞的。B類是A類的友元,C類是B類的友元,C類和A類之間,如果沒有聲明,就沒有任何友元關系,不能進行數(shù)據(jù)共享。友元關系是單向的。如果聲明B類是A類的友元,B類的成員函數(shù)就可以訪問A類的私有和保護數(shù)據(jù),但A類的成員函數(shù)卻不能訪問B類的私有和保護數(shù)據(jù)。423、常對象和常成員定義對象時用const進行修飾,稱為常對象,它的數(shù)據(jù)成員值在對象的整個生存期間內(nèi)不能被改變。也就是說,常對象在定義時必須進行初始化,而且不能被更新。使用常量,既實現(xiàn)了數(shù)據(jù)共享、又可以保證數(shù)據(jù)不會被改變。433、常對象和常成員對于類的某個成員函數(shù),使用const關鍵字修飾,稱為常成員函數(shù)。常對象只能調(diào)用常成員函數(shù),保證常對象的數(shù)據(jù)成員不能被修改。使用const說明的數(shù)據(jù)成員稱為常數(shù)據(jù)成員。如果在一個類中說明了常數(shù)據(jù)成員,那么任何函數(shù)中都不能對該成員賦值。構造函數(shù)對該數(shù)據(jù)成員進行初始化,就只能通過初始化列表。443、常對象和常成員常成員函數(shù)的特點:const是函數(shù)類型的一個組成部分,在函數(shù)實現(xiàn)時也要帶const關鍵字。常成員函數(shù)不能更新對象的數(shù)據(jù)成員,也不能調(diào)用該類中的非常成員函數(shù)。常對象只能調(diào)用常成員函數(shù),但是常成員函數(shù)也可以被普通對象來調(diào)用。const關鍵字可以被用于參與對重載函數(shù)的區(qū)分。45
8.8類的組合
2023/12/2246北京科技大學8.8類的組合類的組合(也稱類的聚集),描述的就是一個類內(nèi)嵌其它類的對象作為數(shù)據(jù)成員的情況,它們之間的關系是一種包含與被包含的關系。在面向對象程序設計中,可以對復雜對象進行分解、抽象,把一個復雜對象分解為簡單對象的組合。
47當創(chuàng)建組合類的對象時,各個內(nèi)嵌對象也將被自動創(chuàng)建。因此,在創(chuàng)建組合類對象時既要對本類的基本數(shù)據(jù)成員進行初始化,又要對內(nèi)嵌對象成員進行初始化。在聲明一個組合類的對象時,不僅它自身的構造函數(shù)將被調(diào)用,而且還將調(diào)用其內(nèi)嵌對象的構造函數(shù)。8.8類的組合48組合類構造函數(shù)定義的一般形式為:類名
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年蚌埠市固鎮(zhèn)縣司法局選聘專職人民調(diào)解員16人備考題庫及答案詳解參考
- 2025年河南鋼鐵集團數(shù)字應用研究院招聘備考題庫及答案詳解1套
- 花卉園藝工崗前競爭分析考核試卷含答案
- 2026屆福建省莆田市第二十五中學高三上學期12月月考歷史試題(含答案)
- 2025年招商銀行佛山分行社會招聘備考題庫及一套參考答案詳解
- 2025年中醫(yī)知識競賽題庫及答案(共130題)
- 2025年杭州市公安局濱江區(qū)分局招聘警務輔助人員備考題庫帶答案詳解
- 車輛工程智能駕駛感知系統(tǒng)優(yōu)化研究答辯
- 2025年如皋市衛(wèi)健系統(tǒng)部分單位公開招聘事業(yè)編制工作人員49人備考題庫有答案詳解
- 2025年浙江大學先進技術研究院多模態(tài)智能系統(tǒng)研究中心招聘備考題庫及完整答案詳解一套
- 開學第一課課件:從《長安的荔枝》看新學期的勇氣與堅持
- 計算機系畢業(yè)論文初稿
- 聯(lián)通通信傳輸管理辦法
- 第12課-甲午中日戰(zhàn)爭
- DBJT15-104-2015 預拌砂漿混凝土及制品企業(yè)試驗室管理規(guī)范
- 大學物理實驗惠斯通電橋測電阻電橋講義
- 網(wǎng)球單招專業(yè)講解
- 投資者關系管理
- 學堂在線 雨課堂 學堂云 臨床中成藥應用 章節(jié)測試答案
- 油庫警消管理辦法
- 物流協(xié)會管理辦法
評論
0/150
提交評論