C++面向?qū)ο蟪绦蛟O(shè)計(jì) 第二章 類(lèi)與對(duì)象.ppt_第1頁(yè)
C++面向?qū)ο蟪绦蛟O(shè)計(jì) 第二章 類(lèi)與對(duì)象.ppt_第2頁(yè)
C++面向?qū)ο蟪绦蛟O(shè)計(jì) 第二章 類(lèi)與對(duì)象.ppt_第3頁(yè)
C++面向?qū)ο蟪绦蛟O(shè)計(jì) 第二章 類(lèi)與對(duì)象.ppt_第4頁(yè)
C++面向?qū)ο蟪绦蛟O(shè)計(jì) 第二章 類(lèi)與對(duì)象.ppt_第5頁(yè)
已閱讀5頁(yè),還剩91頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,1,主講教師: 個(gè)人主頁(yè):http:;/,高級(jí)語(yǔ)言程序設(shè)計(jì)II,四川大學(xué)計(jì)算機(jī)學(xué)院,四川大學(xué)計(jì)算機(jī)學(xué)院,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,2,教材:C+面向?qū)ο蟪绦蛟O(shè)計(jì),李濤 主編 游洪躍 陳良銀 李琳等編 高等教育出版社 2006年2月出版,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,3,本書(shū)內(nèi)容,第1章 緒論 第2章 C+類(lèi)和對(duì)象 第3章 繼承 第4章 多態(tài)性 第5章 模板 第6章 C+常見(jiàn)問(wèn)題 第7章 Visual C+編程基礎(chǔ) 第8章 對(duì)話(huà)框、常用消息、菜單和工具條 第9章 單文檔界面和多文檔界面 第10章

2、圖形設(shè)備接口 實(shí)驗(yàn) (待安排),2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,4,提綱,輸入與輸出流,第二章 類(lèi)與對(duì)象,ARM Vector Table,FIQ,IRQ,(Reserved),Data Abort,Prefetch Abort,Software Interrupt,Undefined Instruction,Reset,1,3,2,類(lèi)與對(duì)象,類(lèi)的定義,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,5,類(lèi)的誕生(一),類(lèi)(Class)是面向?qū)ο笏枷胫械囊粋€(gè)重要組成部分。如何在計(jì)算機(jī)中將“類(lèi)”表達(dá)出來(lái)? 在C語(yǔ)言中,當(dāng)定義結(jié)構(gòu)體(struct): struct SAMP

3、LE int member1, member2; var1; 以后,就可以使用結(jié)構(gòu)中的成員: int var = var1.member1*var1.member2;,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,6,類(lèi)的誕生(二),將結(jié)構(gòu)體成員的使用代碼寫(xiě)成一個(gè)函數(shù),得到: int caluc(struct SAMPLE var) return var.member1*var.member2; ,操作結(jié)構(gòu)變量,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,7,然后,將上面的函數(shù)放入結(jié)構(gòu)體中 struct SAMPLE int calcu() return member1*memb

4、er2; int member1, member2; ;,數(shù)據(jù)成員,函數(shù)成員,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,8,類(lèi)的誕生(三),這樣的結(jié)構(gòu)體就具有了一定的屬性(member1和member2),也具有一定的行為(函數(shù)calcu), 它就是“類(lèi)”的雛形。 該結(jié)構(gòu)體的使用方法如下: struct SAMPLE var; var.member1 = var.member2 = 10; int temp = var.calcu();,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,9,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,10,C+類(lèi)的聲明與定義(一),clas

5、s CCompanyStaff /BEGIN /聲明成員函數(shù) void SetBasicSal ( float sal ); / 設(shè)置基本工資 /聲明(定義)數(shù)據(jù)成員 int m_iStaffNum ; / 工作編號(hào) char m_cName20 ; / 姓名 float m_fRateOfAttend ; / 出勤率 float m_fBasicSal ; / 基本工資 ; / END 多了一個(gè)函數(shù)(SetBasicSal),其它都象結(jié)構(gòu)體。,struct class,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,11,CCompanyStaff類(lèi)的定義以關(guān)鍵字class開(kāi)始。 其后是

6、類(lèi)名。 “”表示類(lèi)定義的開(kāi)始和結(jié)束,最終以分號(hào)結(jié)束。 一般在類(lèi)中只聲明成員函數(shù)的原型,而函數(shù)的實(shí)現(xiàn)(即函數(shù)體的定義)則放在類(lèi)外完成。 “函數(shù)原型”,即只聲明函數(shù)名、參數(shù)類(lèi)型和返回值類(lèi)型,而不包括函數(shù)體代碼。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,12,C+類(lèi)的聲明與定義(二),函數(shù)的定義則可在函數(shù)(SetBasicSal)聲明之后: void CCompanyStaff:SetBasicSal(float sal ) m_fBasicSal = sal ; 函數(shù)定義:函數(shù)名前多了一個(gè)類(lèi)作用域運(yùn)算符(CCompanyStaff:),用于標(biāo)識(shí)該函數(shù)定義屬于哪一個(gè)類(lèi)。,2020/10/

7、14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,13,C+類(lèi)的聲明與定義(三),對(duì)于C+語(yǔ)言的編程習(xí)慣: 1、將類(lèi)的聲明存放于“*.h”或“*.hpp”的頭文件中,每個(gè)類(lèi)一個(gè)聲明文件。 2、將類(lèi)的定義存放于“*.cpp”文件中,與相應(yīng)的聲明文件一一對(duì)應(yīng),.c .cpp,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,14,封裝成類(lèi)的好處可以實(shí)現(xiàn)數(shù)據(jù)隱藏。 封裝也確定了類(lèi)成員的訪問(wèn)屬性。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,15,對(duì)象的封裝性,C+語(yǔ)言引入面向?qū)ο笏枷耄腩?lèi)(對(duì)象)的概念之后,必然會(huì)具有一些新的特性。 面向?qū)ο笏枷胫蓄?lèi)(對(duì)象)的基本特性之一:封裝性。 封裝性:直觀理解,

8、類(lèi)將屬于它的數(shù)據(jù)(成員變量)和針對(duì)數(shù)據(jù)的操作(成員函數(shù))包裹在一起就是一種封裝。 封裝的目的:保護(hù)類(lèi)(對(duì)象)的實(shí)現(xiàn)。 對(duì)封裝屬性進(jìn)行細(xì)分:公有的;私有的;保護(hù)的。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,16,C+的封裝(一),C+語(yǔ)言為了實(shí)現(xiàn)面向?qū)ο蟮姆庋b,引入了三個(gè)新的“修飾”關(guān)鍵字: public (公有的):公開(kāi)的,可見(jiàn)的。對(duì)象成員(變量與方法)可以在對(duì)象外使用。 private (私有的):不可見(jiàn)的。成員只能在對(duì)象內(nèi)部使用。 protected (保護(hù)的):受到保護(hù)的。成員也只能在內(nèi)部使用。(以后再討論) C+類(lèi)的成員(變量和方法)具有了各自不同的屬性。,2020/10/

9、14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,17,C+的封裝(二),class CCompanyStaff public: void SetBasicSal ( float sal ); / 設(shè)置基本工資 private: int m_iStaffNum ; / 工作編號(hào) char m_cName20 ; / 姓名 float m_fRateOfAttend ; / 出勤率 float m_fBasicSal ; / 基本工資 ; / END,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,18,C+的封裝(三),CCompanyStaff staff; staff.SetBasicSal(600

10、); /合法的,因?yàn)镾etBasicSal是一個(gè)公開(kāi)(public)的方法。 staff.m_iStaffNum = 100; /非法的,因?yàn)閙_iStaffNum是一個(gè)私有(private)的變量。 void CCompanyStaff:SetBasicSal(float sal) m_fBasicSal = sal; /SetBasicSal是對(duì)象的成員,所以它的定義中可以訪問(wèn)m_fBasicSal私有變量。 ,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,19,C+的封裝(四),1、C+類(lèi)定義中的缺省屬性為私有的(private)。 2、每個(gè)修飾符的作用范:從一個(gè)修飾符開(kāi)始,直到另

11、外一個(gè)修飾符時(shí)結(jié)束(或類(lèi)結(jié)束了)。 3、C+類(lèi)中的成員(變量和方法)都應(yīng)該明確地指明它們各自的屬性。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,20,類(lèi)成員的訪問(wèn)權(quán)限,封裝所實(shí)現(xiàn)的數(shù)據(jù)隱藏是面向?qū)ο蟪绦蛟O(shè)計(jì)的一個(gè)關(guān)鍵特性隱藏一個(gè)類(lèi)的數(shù)據(jù)從而使其他類(lèi)無(wú)法訪問(wèn)。 隱藏由封裝實(shí)現(xiàn),所以隱藏所實(shí)現(xiàn)的類(lèi)成員的訪問(wèn)控制權(quán)限也和封裝方法一一對(duì)應(yīng)。 對(duì)應(yīng)于封裝,類(lèi)成員有3種訪問(wèn)權(quán)限: 公有類(lèi)型(public)、 私有類(lèi)型(private) 保護(hù)類(lèi)型(protected)。,數(shù)據(jù)隱藏,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,21,類(lèi)內(nèi),類(lèi) 外,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)

12、學(xué)院,22,公有類(lèi)型的成員定義了類(lèi)的接口,由關(guān)鍵字public聲明,在類(lèi)外只能訪問(wèn)公有成員。 私有類(lèi)型的訪問(wèn)權(quán)限為私有的成員由關(guān)鍵字private聲明,它們只能被類(lèi)本身的成員函數(shù)訪問(wèn),來(lái)自類(lèi)外部的任何訪問(wèn)都是非法的。 保護(hù)類(lèi)型的成員與私有成員類(lèi)似,區(qū)別僅在于繼承過(guò)程中,保護(hù)類(lèi)型的成員可以被所在類(lèi)的派生類(lèi)成員函數(shù)訪問(wèn);而這一點(diǎn)對(duì)于私有成員來(lái)說(shuō)是非法的。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,23,類(lèi)的成員函數(shù)可以訪問(wèn)類(lèi)的所有成員,沒(méi)有任何限制; 而類(lèi)對(duì)象訪問(wèn)類(lèi)的成員就要受到訪問(wèn)控制符的限制。 訪問(wèn)權(quán)限舉例: sclass2_1_demo.h smain2_1.cpp,類(lèi)對(duì)象和類(lèi)的成

13、員函數(shù)對(duì)數(shù)據(jù)成員的訪問(wèn)權(quán)限不同。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,24,外部接口是類(lèi)外訪問(wèn)類(lèi)中私有數(shù)據(jù)的橋梁。 聲明時(shí),類(lèi)中不同訪問(wèn)權(quán)限的成員可以按任意順序出現(xiàn)。 但依然涉及到一個(gè)編程習(xí)慣問(wèn)題: “以數(shù)據(jù)為中心” “以行為為中心”,國(guó)際公約。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,25,建議把一個(gè)類(lèi)的數(shù)據(jù)成員都聲明為私有的訪問(wèn)權(quán)限。 這樣做有兩個(gè)好處: 一是信息隱藏,即實(shí)現(xiàn)封裝,把類(lèi)的內(nèi)部實(shí)現(xiàn)和外部表現(xiàn)分開(kāi),讓使用者無(wú)需了解類(lèi)的實(shí)現(xiàn)細(xì)節(jié); 二是數(shù)據(jù)保護(hù),將類(lèi)的重要信息保護(hù)起來(lái),以免被其他程序不恰當(dāng)?shù)匦薷摹?2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,2

14、6,成員函數(shù)的實(shí)現(xiàn),被隱藏的數(shù)據(jù)可以有成員函數(shù)來(lái)訪問(wèn),對(duì)數(shù)據(jù)的操作也體現(xiàn)在成員函數(shù)中: 成員函數(shù)決定對(duì)象的操作行為。 它是程序算法的實(shí)現(xiàn)部分。 它也是對(duì)封裝的數(shù)據(jù)進(jìn)行操作的唯一途徑。 它有兩種方式:類(lèi)外實(shí)現(xiàn)和類(lèi)內(nèi)實(shí)現(xiàn)。,數(shù)據(jù)對(duì)成員函數(shù)無(wú)法隱藏。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,27,1一般實(shí)現(xiàn)方式,類(lèi)外實(shí)現(xiàn)成員函數(shù)的形式如下: 返回值類(lèi)型 類(lèi)名:成員函數(shù)名(形式參數(shù)表) 函數(shù)體 例2.2 企業(yè)員工類(lèi)的實(shí)現(xiàn)。 sclass2_2_companyStaff.h s2_2sclass2_2_companyStaff.cpp s2_2smain2_2.cpp,2020/10/14,

15、主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,28,2內(nèi)聯(lián)函數(shù)方式,內(nèi)聯(lián)函數(shù)是指程序在編譯時(shí)用函數(shù)的代碼替換每一處函數(shù)調(diào)用的地方 。 內(nèi)聯(lián)的優(yōu)點(diǎn)以空間換時(shí)間。 內(nèi)聯(lián)的兩種方式: 系統(tǒng)默認(rèn):sclass2_2_0_companyStaff.h 和函數(shù)前加關(guān)鍵字inline : inline () smain2_3.cpp 。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,29,內(nèi)聯(lián)和宏替換,宏替換是在編譯前由預(yù)處理程序進(jìn)行預(yù)處理,它只做簡(jiǎn)單的字符替換而不涉及語(yǔ)法檢查。 而內(nèi)聯(lián)函數(shù)是在編譯時(shí)處理的,編譯程序能識(shí)別內(nèi)聯(lián)函數(shù),對(duì)它進(jìn)行語(yǔ)法檢查。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,30,類(lèi)與對(duì)象

16、,類(lèi)(class):具有相同或相近的性質(zhì)和行為的事物集合。 對(duì)象(object):the instance of a class。一個(gè)類(lèi)的實(shí)例,即類(lèi)的性質(zhì)(變量)具體化之后成為 對(duì)象。 一個(gè)對(duì)象是類(lèi)的一種特殊情況。 一個(gè)類(lèi)會(huì)有很多的對(duì)象, 一個(gè)對(duì)象屬于一個(gè)類(lèi)。 它們是一對(duì)多的關(guān)系。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,31,C+中的對(duì)象(一),當(dāng)C+中類(lèi)的成員變量被賦與特定的值之后,它即成為一個(gè)C+的對(duì)象。 CCompanyStaff staff; /一個(gè)對(duì)象變量 staff.m_iStafNum = 12345; staff.m_cName = “張三” ; staff成為類(lèi)

17、CCompanyStaff的一個(gè)對(duì)象,它有了一個(gè)工作編號(hào),對(duì)應(yīng)一個(gè)人名。 當(dāng)然,還會(huì)有很多其它的對(duì)象,比如staff1、staff2等等,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,32,C+中的對(duì)象(二),1、對(duì)象針對(duì)計(jì)算機(jī)而言,就是代碼中的一個(gè)變量。 2、C+中對(duì)象變量的使用與C語(yǔ)言中結(jié)構(gòu)體變量的使用方法一樣。 CCompanyStaff staff1, *pstaff1, staff310; staff1.m_iStafNum = 11111; pstaff m_iStafNum = 22222; staff0.m_iStafNum = 33333;,2020/10/14,主講教

18、師:四川大學(xué)計(jì)算機(jī)學(xué)院,33,C+類(lèi)的對(duì)象化(一),C+中對(duì)象是類(lèi)的變量,但它不象變量那么單純。 C+提供一套特殊的機(jī)制實(shí)現(xiàn)類(lèi)到對(duì)象的轉(zhuǎn)換。 class CCompanyStaff public: CCompanyStaff(); CCompanyStaff(); void SetBasicSal ( float sal ); / 設(shè)置基本工資 private: int m_iStaffNum ; / 工作編號(hào) ; / END,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,34,對(duì)象的創(chuàng)建和銷(xiāo)毀,創(chuàng)建對(duì)象時(shí),“對(duì)象存放在何處?” 需要向操作系統(tǒng)申請(qǐng)一定的內(nèi)存空間用于存放新建的對(duì)象。 為對(duì)

19、象分配存儲(chǔ)空間主要有靜態(tài)分配和動(dòng)態(tài)分配兩種方式。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,35,可以將對(duì)象或靜態(tài)成員存放在棧中或靜態(tài)存儲(chǔ)區(qū)域中。 動(dòng)態(tài)內(nèi)存分配是指在堆(也稱(chēng)自由內(nèi)存)中分配存儲(chǔ)單元,即為對(duì)象動(dòng)態(tài)從堆中分配內(nèi)存。 使用操作符new分配內(nèi)存空間; 使用操作符delete釋放內(nèi)存空間。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,36,構(gòu)造函數(shù)與析構(gòu)函數(shù),C+語(yǔ)言為了保證一個(gè)對(duì)象被初始化(類(lèi)的實(shí)例化),定義了一組特殊的方法(函數(shù)),專(zhuān)門(mén)用于對(duì)象生成時(shí)的初始化。 構(gòu)造函數(shù)(constructor)與類(lèi)名稱(chēng)相同,沒(méi)有返回值。它在對(duì)象生成之時(shí)自動(dòng)執(zhí)行。 析構(gòu)函數(shù)(des

20、tructor)在類(lèi)名前加作為函數(shù)名的函數(shù),沒(méi)有返回值,也沒(méi)有參數(shù)。它在對(duì)象結(jié)束時(shí)自動(dòng)執(zhí)行。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,37,C+要求類(lèi)設(shè)置一個(gè)專(zhuān)門(mén)的成員函數(shù)來(lái)負(fù)責(zé)類(lèi)中所有對(duì)象的初始化,這個(gè)成員函數(shù)就是構(gòu)造函數(shù)。 構(gòu)造函數(shù)的作用就是在對(duì)象被創(chuàng)建時(shí)利用特定的值構(gòu)造對(duì)象,將對(duì)象初始化到一個(gè)特定的狀態(tài)。 聲明一個(gè)構(gòu)造函數(shù)的語(yǔ)示格式如下: public: 類(lèi)名();,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,38,構(gòu)造函數(shù)可以由程序設(shè)計(jì)人員自己編寫(xiě)。 也可以由系統(tǒng)提供。 例2.4 構(gòu)造函數(shù)舉例。 sclass2_4_companyStaff.h smain2_4.c

21、pp,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,39,重載構(gòu)造函數(shù),所謂重載構(gòu)造函數(shù),是指同一個(gè)構(gòu)造函數(shù)名,具有不同的實(shí)現(xiàn)。 例2.5 在員工管理系統(tǒng)中,創(chuàng)建一個(gè)對(duì)象時(shí),還可以一次性地給對(duì)象的姓名、出勤率、基本工資等幾個(gè)數(shù)據(jù)成員都賦初值,這就需要重載構(gòu)造函數(shù)。 sclass2_5_companyStaff.h sclass2_5_companyStaff.cpp smain2_5.cpp,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,40,需要注意一點(diǎn),當(dāng)構(gòu)造函數(shù)帶默認(rèn)參數(shù)時(shí),要謹(jǐn)防出現(xiàn)歧義。 例2.6 下面這個(gè)程序存在歧義。 sclass2_6.h smain2_6.cpp

22、當(dāng)創(chuàng)建對(duì)象d2時(shí) ,有二義性。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,41,拷貝構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)是用來(lái)復(fù)制對(duì)象的一種特殊的構(gòu)造函數(shù)。 聲明拷貝構(gòu)造函數(shù)的語(yǔ)法格式如下: class 類(lèi)名 public: 類(lèi)名( const類(lèi)名 CPoint c = a;,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,43,析構(gòu)函數(shù),析構(gòu)函數(shù)與構(gòu)造函數(shù)的作用幾乎正好相反,當(dāng)一個(gè)對(duì)象消失時(shí),或用delete刪除用new創(chuàng)建的對(duì)象時(shí),系統(tǒng)都會(huì)自動(dòng)調(diào)用類(lèi)的析構(gòu)函數(shù),做一些清理工作。 聲明一個(gè)析構(gòu)函數(shù)的語(yǔ)法格式如下: class Demo public: Demo(); Demo( void )

23、; ,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,44,析構(gòu)函數(shù)不能重載 。 / 析構(gòu)函數(shù) CCompanyStaff( void ) cout 對(duì)象 m_cName 消亡 endl; ,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,45,當(dāng)某對(duì)象消亡時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用該對(duì)象的析構(gòu)函數(shù)。 而且調(diào)用的順序是:最后創(chuàng)建的對(duì)象最先消亡,即最先調(diào)用其析構(gòu)函數(shù); 相反地,最先創(chuàng)建的對(duì)象最后消亡,即最后調(diào)用其析構(gòu)函數(shù)。 如果不顯式地定義析構(gòu)函數(shù),系統(tǒng)也會(huì)生成一個(gè)默認(rèn)的析構(gòu)函數(shù),它是一個(gè)空的析構(gòu)函數(shù),不做任何事情。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,46,C+類(lèi)的對(duì)象化(二)

24、,class CCompanyStaff public: CCompanyStaff(); CCompanyStaff(int num, char* pName); CCompanyStaff(); void SetBasicSal ( float sal ); / 設(shè)置基本工資 ; / END CCompanyStaff staff(12345, “張三”);,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,47,C+類(lèi)的對(duì)象化(三),1、構(gòu)造函數(shù)與析構(gòu)函數(shù)被“隱含”調(diào)用,即不管愿意與否,它們都會(huì)被“強(qiáng)制”地執(zhí)行。 2、C+類(lèi)都有缺省的構(gòu)造函數(shù),即沒(méi)有參數(shù)的構(gòu)造函數(shù)。它也是“強(qiáng)制”的,沒(méi)

25、有定義每個(gè)類(lèi)也有一個(gè)這樣的構(gòu)造函數(shù)。 3、編程習(xí)慣:不管有用沒(méi)用,希望編程人員為每個(gè)類(lèi)定義明確的構(gòu)造與析構(gòu)函數(shù),2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,48,對(duì)象成員的訪問(wèn),可以通過(guò)對(duì)象名,也可以通過(guò)對(duì)象地址來(lái)訪問(wèn)一個(gè)對(duì)象 : ; . / 訪問(wèn)公有數(shù)據(jù)成員 . ()/ 訪問(wèn)公有成員函數(shù) CCompanyStaff staff1( LiHua ) ; staff1.SetBasicSal( 4000.0 );,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,49, *; - / 訪問(wèn)公有數(shù)據(jù)成員 - ()/ 訪問(wèn)公有成員函數(shù) CCompanyStaff *pstaff ; pst

26、aff = new CCompanyStaff( LiuMei, 0.95, 3000.0 ); pstaff - GetName( ),2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,50,例2.8 在員工管理系統(tǒng)中,建立兩個(gè)對(duì)象分別用兩種方式去訪問(wèn)類(lèi)成員。 sclass2_8_companyStaff.h sclass2_8_companyStaff.cpp smain2_8.cpp,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,51,普通對(duì)象指針,例2.9 普通對(duì)象指針舉例。 sclass2_9_objPointer.h smain2_9.cpp CPointerExam *p

27、ointer; pointer = 對(duì)象指針在使用之前一定要初始化,為其動(dòng)態(tài)分配存儲(chǔ)空間; 使用完畢必須釋放該對(duì)象指針?biāo)淼馁Y源。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,52,對(duì)象的this指針,每個(gè)對(duì)象都擁有自己獨(dú)立的數(shù)據(jù)成員。 而類(lèi)中的所有對(duì)象使用相同的成員函數(shù),成員函數(shù)在內(nèi)存中只有一份。 每個(gè)對(duì)象隱含了一個(gè)常量指針,稱(chēng)為this指針,用于指向當(dāng)前發(fā)送消息的對(duì)象,以識(shí)別當(dāng)前調(diào)用成員函數(shù)的對(duì)象究竟是誰(shuí) 。 當(dāng)通過(guò)一個(gè)對(duì)象調(diào)用成員函數(shù)時(shí),系統(tǒng)先將該對(duì)象的地址賦給this指針,成員函數(shù)在對(duì)對(duì)象的數(shù)據(jù)進(jìn)行操作時(shí),就隱含地使用了this指針。,2020/10/14,主講教師:四川大學(xué)

28、計(jì)算機(jī)學(xué)院,53,CCompanyStaff( char cName ) strcpy( m_cName, cName ); CCompanyStaff( char cName, CCompanyStaff *const this ) strcpy( this - m_cName, cName ); ,顯示指明this,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,54,CCompanyStaff( char cName ) strcpy( this - m_cName, cName ); ,隱含this,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,55,一般不需要顯示指出thi

29、s,只有當(dāng)函數(shù)需要返回當(dāng)前對(duì)象自身的時(shí)候,才顯式地使用它。 例2.10 this指針舉例。 sclass2_10_this.h smain2_10.cpp CSample Add( CSample s1, Csample s2 ) this - n = s1.n + s2.n; return ( *this ); ,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,56,類(lèi)成員指針,如果指針指向類(lèi)數(shù)據(jù)成員的地址,則這個(gè)指針?lè)Q為類(lèi)數(shù)據(jù)成員指針; :* sclass2_11_dataPointer.h smain2_11.cpp int CSample:*p = 類(lèi)數(shù)據(jù)成員指針只能指向公有數(shù)據(jù)成

30、員。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,57,如果指針指向類(lèi)成員函數(shù)的地址,則稱(chēng)為類(lèi)成員函數(shù)指針。 聲明一個(gè)類(lèi)成員函數(shù)指針并為其賦值的語(yǔ)法格式如下: (:*)() = :; 使用指向成員函數(shù)的指針調(diào)用函數(shù)的格式如下: (*)(),2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,58,/ 主文件:smain2_12.cpp #include sclass2_8_companyStaff.h / 包含sclass2_8_companyStaff.h的代碼 #include using namespace std; void main( void ) void ( CCompa

31、nyStaff : *pFunc )( float ); / 聲明一個(gè)類(lèi)成員函數(shù)指針 CCompanyStaff staff( LiHua) ; / 創(chuàng)建一個(gè)對(duì)象staff pFunc = CCompanyStaff: SetBasicSal; / 指針初始化指向SetBasicSal函數(shù) ( staff.*pFunc ) (3000); / 相當(dāng)于staff調(diào)用SetBasicSal() cout 員工LiHua 的基本工資是 staff.GetBasicSal(); ,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,59,對(duì)象數(shù)組,例2.13 對(duì)象數(shù)組應(yīng)用舉例 sclass2_13_f

32、ruit.h smain2_13.cpp CFruit d4; / 創(chuàng)建一個(gè)對(duì)象數(shù)組,相應(yīng)調(diào)用4次構(gòu)造函數(shù) 如需要建立一個(gè)對(duì)象數(shù)組,必須滿(mǎn)足以下條件: 至少有一個(gè)構(gòu)造函數(shù)沒(méi)有參數(shù)或只帶默認(rèn)參數(shù)。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,60,inline與static,inline(嵌入)專(zhuān)門(mén)修飾類(lèi)中的成員函數(shù),表示該成員函數(shù)在使用時(shí)會(huì)被“替換”。簡(jiǎn)單地理解,它就是C語(yǔ)言中的宏定義。 inline后的函數(shù)沒(méi)有調(diào)用過(guò)程,將有助于代碼的執(zhí)行效率。 static(靜態(tài))修改類(lèi)中的成員(變量和函數(shù)),表明該成員只有一個(gè)副本,與具體的對(duì)象沒(méi)有關(guān)系。 static后的成員變量可以用于對(duì)象間的數(shù)

33、據(jù)共享。 static后的成員函數(shù)只能使用static 成員變量。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,61,static成員的使用,當(dāng)一個(gè)成員被static修飾之后,它的使用不再屬于各個(gè)對(duì)象,而是屬于這個(gè)類(lèi)。 class CCompanyStaff public: static void SetBasicSal ( float sal ); int m_iStaffNum; ; / END CCompany:m_iStaffNum = 1234; CCompany:SetBasicSal(30000);,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,62,靜態(tài)成員,類(lèi)的

34、靜態(tài)成員擁有一塊單獨(dú)的存儲(chǔ)區(qū)。 該類(lèi)的所有對(duì)象都共享這塊靜態(tài)存儲(chǔ)空間 這就為對(duì)象提供了一個(gè)相互通信的方法。 靜態(tài)成員由關(guān)鍵字static標(biāo)識(shí) 。 它屬于類(lèi)而不屬于對(duì)象。 它分為靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,63,聲明一個(gè)靜態(tài)數(shù)據(jù)成員的語(yǔ)法格式如下: static 靜態(tài)數(shù)據(jù)成員在使用前也要初始化,但它的初始化不能在構(gòu)造函數(shù)中進(jìn)行,在類(lèi)外進(jìn)行。 : = 初始值 ; 其訪問(wèn)語(yǔ)法格式如下: :,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,64,sclass2_14_companyStaff.h sclass2_14_companyStaff.

35、cpp smain2_14.cpp static int s_iCount; int CCompanyStaff:s_iCount = 1000;,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,65,靜態(tài)成員函數(shù)是一種特殊的成員函數(shù),它屬于整個(gè)類(lèi),也為同類(lèi)中所有對(duì)象共同擁有。 只要類(lèi)存在,靜態(tài)成員函數(shù)就可以使用。 可以通過(guò)類(lèi)名和對(duì)象名來(lái)調(diào)用 。 其定義語(yǔ)法格式如下: :() 例2.15靜態(tài)成員函數(shù)舉例。 sclass2_15.h smain2_15.cpp,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,66,靜態(tài)成員函數(shù)一般不訪問(wèn)普通數(shù)據(jù)成員,它的作用主要是訪問(wèn)和操作同類(lèi)中的靜態(tài)數(shù)

36、據(jù)成員。 類(lèi)的普通成員函數(shù)都擁有this指針 。 而靜態(tài)成員函數(shù)沒(méi)有this指針,但可以通過(guò)類(lèi)名或?qū)ο竺麃?lái)實(shí)現(xiàn)對(duì)它的訪問(wèn)。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,67,對(duì)象封裝性的局限,已經(jīng)學(xué)習(xí)過(guò)類(lèi)對(duì)于成員的封裝(public, private, protected) 封裝性有效地保護(hù)了對(duì)象的內(nèi)部細(xì)節(jié),使得對(duì)象的使用和對(duì)象的實(shí)現(xiàn)分開(kāi),互相不產(chǎn)生影響。 同時(shí),封裝性帶來(lái)負(fù)面影響: 1、C+為實(shí)現(xiàn)對(duì)象的封裝,必然會(huì)做一些額外的工作,從而導(dǎo)致程序的效率下降。 2、一個(gè)對(duì)象封裝的太好,也會(huì)讓該對(duì)象很難使用,也很難實(shí)現(xiàn)。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,68,突破對(duì)象封

37、裝,C+提供了友元(friend)來(lái)解決由封裝性帶來(lái)的問(wèn)題。 friend關(guān)鍵字修改函數(shù)或類(lèi),因此對(duì)于一個(gè)類(lèi)而言,它有友元函數(shù)或友元類(lèi)。 friend用于應(yīng)對(duì)編程中一些比較特殊的情況(如提高效率),絕大多數(shù)情況下不需要使用。亂使用只會(huì)使C+變成C,甚至更糟。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,69,友元關(guān)系,一個(gè)類(lèi)可以聲明一個(gè)友元關(guān)系,一起來(lái)共享類(lèi)中的所有成員。 友元如果是一個(gè)函數(shù),則稱(chēng)為友元函數(shù); 如果是一個(gè)類(lèi),則稱(chēng)為友元類(lèi)。 友元函數(shù)是在類(lèi)中由關(guān)鍵字friend修飾的非成員函數(shù)。 友元函數(shù)可以是一個(gè)普通的函數(shù),也可以是其他類(lèi)的成員函數(shù)。 雖然它不是本類(lèi)的成員函數(shù),但是在它

38、的函數(shù)體中可以通過(guò)對(duì)象名訪問(wèn)類(lèi)的私有和保護(hù)成員。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,70,例2.16 友元函數(shù)與成員函數(shù)的比較。 sclass2_16.h smain2_16.cpp friend void FriendFunc ( CSample * cp, int a ) /增加一個(gè)對(duì)象指針參數(shù) cp-i = a; /對(duì)象指針參數(shù)為i指明當(dāng)前所屬對(duì)象 ,需要操作對(duì)象,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,71,友元函數(shù)的特點(diǎn): 第一、友元函數(shù)可以直接訪問(wèn)該類(lèi)的所有成員,但它不是該類(lèi)的成員函數(shù),可以像普通函數(shù)一樣在任何地方調(diào)用。 第二、友元函數(shù)不屬于任何類(lèi),因

39、此可以放在類(lèi)說(shuō)明的任何位置,既可以在public區(qū),也可以在private區(qū)。 第三、友元函數(shù)不需要通過(guò)對(duì)象或?qū)ο笾羔榿?lái)調(diào)用,可以直接調(diào)用即可。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,72,在類(lèi)中可把另一個(gè)類(lèi)聲明為友元類(lèi),如類(lèi)B是類(lèi)A的友元類(lèi),則類(lèi)B中的所有成員函數(shù)都是類(lèi)A的友元函數(shù),都可以訪問(wèn)類(lèi)A的私有和保護(hù)成員。 友元類(lèi)的聲明語(yǔ)句如下: class B; / 前向引用聲明 class A friend class B; / B為A的友元類(lèi) ,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,73,例2.17 編寫(xiě)一個(gè)有關(guān)棧結(jié)構(gòu)的程序,要求實(shí)現(xiàn)入棧和出棧。其中有兩個(gè)類(lèi),一個(gè)是

40、結(jié)點(diǎn)類(lèi)CNode,擁有結(jié)點(diǎn)值和指向下一結(jié)點(diǎn)的指針;另一個(gè)是棧類(lèi)CStack,它擁有棧的頭指針。 由此生成的鏈?zhǔn)浇Y(jié)構(gòu)如圖2.3所示。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,74,sclass2_17_stack.h sclass2_17_stack.cpp smain2_17 由于棧類(lèi)CStack是結(jié)點(diǎn)類(lèi)CNode的友元類(lèi),所以棧CStack類(lèi)的所有成員函數(shù)都成為類(lèi)CNode的友元函數(shù)。 因此Push( )和 Pop( )可以訪問(wèn)結(jié)點(diǎn)類(lèi)CNode對(duì)象的私有成員并對(duì)其進(jìn)行操作。 封裝是對(duì)象與外界之間一堵不透明的墻,而友元恰好在這堵墻上開(kāi)了一個(gè)小孔,它以犧牲信息隱藏、削弱封裝性為代價(jià)來(lái)

41、實(shí)現(xiàn)數(shù)據(jù)共享。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,75,2.3 C+輸入輸出流對(duì)象,標(biāo)準(zhǔn)輸入輸出流 :數(shù)據(jù)從程序中流入到屏幕或磁盤(pán)文件,即輸出流;數(shù)據(jù)從鍵盤(pán)流入到程序中,即輸入流。 所謂流,是從源到矢的數(shù)據(jù)流的抽象引用,具體地說(shuō),就是數(shù)據(jù)從一個(gè)對(duì)象流向另一個(gè)對(duì)象。 在進(jìn)行I/O操作時(shí),首先執(zhí)行打開(kāi)操作,使流和文件發(fā)生聯(lián)系,建立聯(lián)系后的文件才允許數(shù)據(jù)流入或流出,輸入輸出結(jié)束后,執(zhí)行關(guān)閉操作使文件與流斷開(kāi)聯(lián)系。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,76,C+流類(lèi)庫(kù),C+提供了一個(gè)流類(lèi)庫(kù),它具有兩個(gè)平行的根基類(lèi):streambuf類(lèi)和ios類(lèi) 。,2020/10/1

42、4,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,77,streambuf類(lèi)主要負(fù)責(zé)緩沖區(qū)的處理,提供對(duì)緩沖區(qū)的低級(jí)操作。 ios類(lèi)是流基類(lèi),它及其派生類(lèi)提供用戶(hù)使用流類(lèi)所需的接口,支持對(duì)streambuf的緩沖。 由它可以派生出輸入流類(lèi)istream和輸出流類(lèi)ostream等。 兩個(gè)根基類(lèi)以及由它們派生出的所有流類(lèi)(當(dāng)然包括istream類(lèi)和ostream類(lèi))都被定義在名為iostream的頭文件中。 因此須用“#include”編譯指令將iostream頭文件包含進(jìn)來(lái)。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,78,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,79,2020/10/14

43、,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,80,系統(tǒng)預(yù)定義的一些流: 進(jìn)行輸入輸出常用的標(biāo)準(zhǔn)輸入流對(duì)象cin和標(biāo)準(zhǔn)輸出流對(duì)象cout, 還有未被緩沖的標(biāo)準(zhǔn)錯(cuò)誤輸出cerr和被緩沖的標(biāo)準(zhǔn)錯(cuò)誤輸出clog。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,81,cin是通用輸入流類(lèi)istream_withassign的對(duì)象,與標(biāo)準(zhǔn)輸入設(shè)備連接。 它通過(guò)重載運(yùn)算符 “”執(zhí)行輸入操作,在流操作中將“”稱(chēng)為提取運(yùn)算符。 cin從輸入流中取出數(shù)據(jù),數(shù)據(jù)從提取運(yùn)算符“”處流進(jìn)程序。,2020/10/14,主講教師:四川大學(xué)計(jì)算機(jī)學(xué)院,82,cout是通用輸出流類(lèi)ostream的對(duì)象,與標(biāo)準(zhǔn)輸出設(shè)備連接。 通過(guò)重載運(yùn)算符“”執(zhí)行輸出操作,在流操作中,將“”稱(chēng)為

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論