版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第三章 類和對象,數(shù)據(jù)封裝,C+語言與C語言最大的不同,在于 C+語言增加了面向?qū)ο蟮母拍睢?C+語言允許用戶定義新的抽象數(shù)據(jù)類型。,類類型,將一組數(shù)據(jù)和對它們的相 關(guān)操作封裝在一起,實現(xiàn)的是面向 對象中的核心概念: 數(shù)據(jù)封裝;,3.1 類 與 對 象,3.1.1 類的定義 定義用戶定義的類型Date ,考慮對該類型數(shù)據(jù)的操作,可能有: struct Date int d,m,y; void init_date(Date ,函數(shù)和數(shù)據(jù)類型之間沒有聯(lián)系,因此,需要操作一個Date數(shù)據(jù)時,需要Date類型的參數(shù)。 C+語言允許在結(jié)構(gòu)類型定義中,加入函數(shù)的定義,這些函數(shù)的目的,也是要操作某個結(jié)構(gòu)的變
2、量。,該結(jié)構(gòu)更復(fù)雜定義為:,struct Date int day,month,year; void init_date(int d,int m,int y); Date add_year(int n); ;,在C+語言中,抽象數(shù)據(jù)類型更一般的形式為: class className attributes; / data members; operations; / member functions; ; /注意這個分號的存在 稱為類類型的定義,它定義了一個新類型。Class_name是類名,也就是該類型的類型名。,class Date int day,month,year; void ini
3、t_date(int d,int m,int y); Date add_year(int n); ;,一個類類型中可以有兩種成員:數(shù)據(jù)和操作。在C+中稱它們?yōu)? 數(shù)據(jù)成員 成員函數(shù),C+不允許在聲明數(shù)據(jù)成員時進行初始化 class aclass int num=0; /錯誤 ;,成員函數(shù),與一般的函數(shù)一樣,具有:函數(shù)名、參數(shù)列表、返回值。 不過有些特殊的成員函數(shù)可能沒有返回類型。沒有返回類型指的是函數(shù)聲明前不能加任何的類型說明,包括void,這與函數(shù)沒有返回值是不同的。,(1)在類中定義成員函數(shù),class Date private : int day, month, year; public
4、: void InitDate (int d ,int m,int y) day=d; month=m; year=y; ;,(2)在類外定義成員函數(shù),在類中聲明成員函數(shù),在類外定義成員函數(shù)的格式為: 返回類型 類名: 函數(shù)名(參數(shù)列表) ,class Date private : int day, month, year; public: void InitDate (int d ,int m,int y); ;,void Date:InitDate (int d ,int m,int y) day=d; month=m; year=y; ,3.1.2 訪問控制,一個類類型中可以有兩種成員:
5、數(shù)據(jù)和操作。在C+中稱它們?yōu)閿?shù)據(jù)成員和成員函數(shù)。 根據(jù)它們的被訪問權(quán)限,成員又可以分為私有段成員、保護段成員和公有段成員。,class 類名 private: /定義私有段成員 私有段數(shù)據(jù)和函數(shù)定義; public: /定義公有段成員 公有段數(shù)據(jù)和函數(shù)定義; ;,其中,類名是一個標(biāo)識符,代表類類型的類型名;private、public稱為段約束 符,其中private可以缺省(即沒有被段約束符說明的成員就是私有段成員);,在一個類中,可以被外部訪問的部分 被定義在public段中。這些成員被稱 為公有成員。不能被外部訪問的部分 被定義在private段或protected段中, 分別稱為私有成
6、員和受保護的成員。,一個類外部的函數(shù)或者其他的類只能訪問這個類的公有成員(有例外)。其他成員是訪問函數(shù)或類不能“看見”的(invisible) ,也就是不能直接訪問的(inaccessable)。, 以內(nèi)的部分 稱為類內(nèi); 以外的部分稱為類外。,一個類的定義實現(xiàn)了數(shù)據(jù)封裝:類外不可見:(即封裝起來的部分) 私有段數(shù)據(jù) 私有段函數(shù)原型 私有段函數(shù)和公有段函數(shù)的實現(xiàn),類外可見:類向外提供部分 公有段數(shù)據(jù) 公有段函數(shù)原型,24,class Date private : int day, month, year; / 類外不可訪問 public: void InitDate(int d, int m,
7、 int y); /類外可訪問 void AddYear(int year); void AddMonth(int month); void AddDay(int day); ;,定義公有和私有成員的順序可以是任意的。,數(shù)據(jù)封裝是一個相對的概念,只 是對于類外而言。而對于類內(nèi)部 所有的成員都是相互可見的。,27,3.1.3 類和對象的關(guān)系,類只是一種形式化的定義,要使用類提 供的功能,必須使用類的實例,即對象, 一個類可以定義多個對象,而對象要占 據(jù)一定的內(nèi)存空間。每個對象都包含類 中定義的各個數(shù)據(jù)成員的存儲空間,共 享類中定義的成員函數(shù)。,28,類和對象的關(guān)系就像整型和變量的關(guān)系。 int
8、i; Date d;,不同的類對象擁有自己的數(shù)據(jù)成員,而共享函數(shù)成員的代碼。一個例子:,30,class Circle private: intx; inty; float fRadius;,public: void SetXY(int a,int b); void SetRadius(float r); void Move(int newx,int newy); ;,一個類應(yīng)該包括哪些數(shù)據(jù)成員,可以從兩個方面考慮:所有這個類的對象都應(yīng)該有什么屬性;每一個具體的該類的對象應(yīng)該包括哪些屬性。,如對圓的考慮,所有的圓都應(yīng)該有圓心和半徑兩個屬性;每一個具體的圓應(yīng)該包括自己的圓心和半徑。,class
9、Circle int x; int y; float radius; public: void set_xy_r(int a,int b,float r); void move(int newx,int newy);;,所有的圓的對象具有自己的圓心和半徑,而共享所有對圓的操作。,類與對象的關(guān)系就類似于整數(shù)類型 int 與整型變量的關(guān)系。類和整數(shù)類型 int代表的是一般的概念,對象和整型變量代表的是具體的實例。,類代表了一組對象的共同性;對象代表了具體的性質(zhì)。,類在概念上是一種抽象機制,它抽象了一類對象的存儲和操作特性。,在系統(tǒng)實現(xiàn)中,類是一 種共享機制,它提供了一類對象共享其類的操作實現(xiàn)。,類
10、是一種封裝機制,它將一組數(shù)據(jù)和對該組數(shù)據(jù)的操作封裝在一起。,類是對象的模型,對象承襲了類中的數(shù)據(jù)和方法(操作)。只是各實例對象的數(shù)據(jù)初始化狀態(tài)和各個數(shù)據(jù)成員的值不同。,3.1.4 類外訪問成員的方法,類外訪問成員的方法為: 對象.公有成員函數(shù)名(實參表) 對象.公有數(shù)據(jù),或定義一個指向?qū)ο蟮闹羔榿碓L問公有段的成員。方式為: 指針-公有成員函數(shù)(實參表) 指針-公有數(shù)據(jù),或者 (*指針).公有成員函數(shù)(實參表) (* 指針).公有段的數(shù)據(jù),class Date private: int day,month,year; public: void init(int d,int m,int y); v
11、oid show( ); ;,void Date:init(int d,int m,int y) day=d; month=m; year=y; ,void Date:show() coutyear-month- dayendl; ,void main() Date today; today.init(25,3,2011); today.show( ); Date *p; p= ,在一個成員函數(shù)內(nèi)部(函數(shù)體內(nèi)),不需要顯示指明訪問的數(shù)據(jù)是哪個對象的,雖然一個類類型的所有對象都具有該類類型中定義的所有數(shù)據(jù),但成員函數(shù)能夠“知道”它在操作的數(shù)據(jù)屬于激活該函數(shù)的那個對象。,注意:,數(shù)據(jù)封裝是一個相對
12、的概念,只是對于類外而言,而對于類內(nèi),所有成員都是互相可見的。一個類的成員函數(shù)的實現(xiàn),可以在類內(nèi)完成,也可以放在類外實現(xiàn),但函數(shù)本身仍然是類內(nèi)的函數(shù)。,在類中定義的函數(shù),自動默認(rèn)為內(nèi)聯(lián)函數(shù)。 類外實現(xiàn)的函數(shù),不是內(nèi)聯(lián)函數(shù)。內(nèi)外可以在原型前加上inline,使之成為內(nèi)聯(lián)函數(shù)。,如:,inline void Date: init_date( int dd,int mm,int yy) d=dd; m=mm; y=yy; ,通過使用類的公有段成員來訪問這個類。因此,類的公有段成員(公有段數(shù)據(jù)和公有段成員 函數(shù)的函數(shù)原型)提供了類的外部界面,而私有段成員以及所有段成員函數(shù)的實現(xiàn)細節(jié)(函數(shù)體部分)則由類
13、封裝起來,讓類的使用者看不到。,在C+語言中,私有數(shù)據(jù)只能嚴(yán)格通過成員函數(shù)訪問,任何類外(除了友元)對私有數(shù)據(jù)的訪問都是非法的。使用私有數(shù)據(jù)這一語言特性來隱藏由類對象操縱的數(shù)據(jù);,然后提供一些成員函數(shù)來訪問這些數(shù)據(jù),但隱藏了改變這些數(shù)據(jù)的能力和實現(xiàn)細節(jié)。這樣,使得類對數(shù)據(jù)的描述和類提供給外部世界來處理數(shù)據(jù)的界面這兩件事互相獨立,這就給出了面向?qū)ο蟮闹匾浴?一個類的重要性在于它對外部世界的一組對象描述了同一界面 ,至于怎樣去實現(xiàn)這些功能,僅僅是類內(nèi)部關(guān)心的事。各個對象通過該界面完成各項功能。,3.2 靜 態(tài) 成 員,關(guān)鍵字static(表示靜態(tài)的)可以用于說明一個類的成員(包括數(shù)據(jù)成員和成員函
14、數(shù)),稱它們?yōu)閟tatic成員。,(1)靜態(tài)數(shù)據(jù)成員,在一個類中,若將一個數(shù)據(jù)說明前加上static,則該數(shù)據(jù)稱為靜態(tài)數(shù)據(jù),static數(shù)據(jù)成員被該類的所有對象共享。無論建立多少個該類的對象,都只有一個靜態(tài)數(shù)據(jù)的存儲空間。,類的static數(shù)據(jù)成員必須在類外進行定義,方式為: type 類名:static成員;,類的static數(shù)據(jù)成員若要初始化,在類外定義該static數(shù)據(jù)成員時進行。 定義且初始化的方式為: type 類名:static成員=初值;,static數(shù)據(jù)成員屬于類,而不屬于對象;static數(shù)據(jù)成員也分為公有和私有的;在類外只能 訪問公有的static數(shù)據(jù)成員,且訪問方式為:
15、類名:static公有數(shù)據(jù)成員,在類內(nèi)可以訪問所有的static數(shù)據(jù)成員,采用直接訪問方式。,class counter static int count; public: void set(int num) count=num; void show( ) coutcount; ;,int counter:count=0; void main( ) counter a,b; a.show(); b.show(); a.set(10); a.show(); b.show(); /coutcounter:countendl; ,成員函數(shù)也能被說明為靜態(tài)的。與靜態(tài)數(shù)據(jù) 成員一樣,靜態(tài)成員函數(shù)屬于類而
16、不是某個 類對象。 因此,在類外調(diào)用一個公有靜態(tài)成 員函數(shù),不需要指明對象或指向?qū)ο蟮闹羔槨?其訪問方式為: 類名:靜態(tài)公有成員函數(shù)名(參數(shù)列表),66,(2)靜態(tài)成員函數(shù),一般使用靜態(tài)成員函數(shù)來訪問靜態(tài)數(shù)據(jù)成員; 若在靜態(tài)成員函數(shù)中要訪問非靜態(tài)成員時, 必 須明確指出該靜態(tài)成員函數(shù)在哪個對象上操作, 必須要有限定詞(即需要通過對象或指向?qū)ο蟮?指針進行),一般也就需要類類型作靜態(tài)成員函 數(shù)的參數(shù)類型(除非是使用全局對象)。,#include class integer private: int a; static int b; public: static void set(int n1,i
17、nt n2,integer ,int integer:b=0; void integer: set(int n1,int n2,integer ,void main() integer obj1; integer:set(1,2,obj1); obj1.set(3,4,obj1); ,3.1.6 C+的類,C+語言的類共有三種方式:class類、struct類和union類。 1 class類 class類是C+語言中最典型的抽象數(shù)據(jù)類型。,1) class類的一般形式,class類名 private: 私有段數(shù)據(jù)及函數(shù); public: 公有段數(shù)據(jù)及函數(shù); ;,2) 無名類:,沒有類名的類稱為無名類。 class global; 無名類只能定義一個對象。,3)空類: class empty ; 空類沒有任何成員,包括數(shù)據(jù)和函數(shù)??疹惪梢远x多個對象,各個對象具有不同的地址。,2 類與結(jié)構(gòu),在C+中,結(jié)構(gòu)是另外一種形式的類。C+中的結(jié)構(gòu)也可以包括數(shù)據(jù)和成員函數(shù)。C+ +的結(jié)構(gòu)和類的差別在于缺省時,類的成員是私有的,而結(jié)構(gòu)的成員是公有的。,除此以外, 類與結(jié)構(gòu)有完全相同
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 重癥監(jiān)護室實習(xí)生出科考試試題含答案
- 2025年礦山廢水處理試題及答案
- 東北特鋼員工年終總結(jié)(3篇)
- 電視銷售方面年終總結(jié)(3篇)
- 保育老師培訓(xùn)
- 醫(yī)務(wù)人員院感考試試題及答案
- 關(guān)于校園欺凌自查報告
- ?;钒踩荚囋嚲?含答案)
- 新疆維吾爾自治區(qū)昌吉回族自治州呼圖壁縣2025-2026學(xué)年八年級上學(xué)期1月期末考試生物試卷 (含答案)
- 保育員國家培訓(xùn)課件中級
- 2025年國家基本公共衛(wèi)生服務(wù)考試試題(附答案)
- 2025年醫(yī)院社區(qū)衛(wèi)生服務(wù)中心工作總結(jié)及2026年工作計劃
- 2025-2026學(xué)年北師大版七年級生物上冊知識點清單
- 委托作品協(xié)議書
- 食品加工廠乳制品設(shè)備安裝方案
- 2025至2030中國芳綸纖維行業(yè)發(fā)展分析及市場發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報告
- 尾牙宴活動策劃方案(3篇)
- 魯教版(2024)五四制英語七年級上冊全冊綜合復(fù)習(xí)默寫 (含答案)
- 生蠔課件教學(xué)課件
- 組塔架線安全培訓(xùn)
- 化療神經(jīng)毒性反應(yīng)護理
評論
0/150
提交評論