面向?qū)ο蟪绦蛟O(shè)計 Charpter 4_第1頁
面向?qū)ο蟪绦蛟O(shè)計 Charpter 4_第2頁
面向?qū)ο蟪绦蛟O(shè)計 Charpter 4_第3頁
面向?qū)ο蟪绦蛟O(shè)計 Charpter 4_第4頁
面向?qū)ο蟪绦蛟O(shè)計 Charpter 4_第5頁
已閱讀5頁,還剩88頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第四章第四章 類和對象類和對象面向?qū)ο蟪绦蛟O(shè)計及面向?qū)ο蟪绦蛟O(shè)計及C+C+計算機系計算機系本章主要本章主要內(nèi)容內(nèi)容l類概念和定義類概念和定義l對象的聲明對象的聲明l構(gòu)造函數(shù)構(gòu)造函數(shù)l析構(gòu)函數(shù)析構(gòu)函數(shù)l拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)l對象數(shù)組和對象指針對象數(shù)組和對象指針l向函數(shù)傳遞對象向函數(shù)傳遞對象l靜態(tài)成員靜態(tài)成員l友元友元l類的聚集類的聚集( (類對象為成員類對象為成員) )結(jié)構(gòu)和類結(jié)構(gòu)和類1 1、結(jié)構(gòu)的擴充。、結(jié)構(gòu)的擴充。C C中,只有可能包含不同類型的數(shù)據(jù)中,只有可能包含不同類型的數(shù)據(jù)C+C+中,還有可能包含函數(shù)中,還有可能包含函數(shù)P50P50例例3.13.1C+C+中,一個結(jié)構(gòu)的成員通常分為

2、:中,一個結(jié)構(gòu)的成員通常分為:l私有成員(內(nèi)部細(xì)節(jié)的對外隱藏)私有成員(內(nèi)部細(xì)節(jié)的對外隱藏)l公有成員(對外提供的服務(wù)功能窗口)公有成員(對外提供的服務(wù)功能窗口)C+C+中的類中的類 更安全的數(shù)據(jù)類型更安全的數(shù)據(jù)類型l類是具有相同屬性和行為的一組對象類是具有相同屬性和行為的一組對象的集合,它為屬于該類的全部對象提的集合,它為屬于該類的全部對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個主要部分。性和行為兩個主要部分。l利用類可以實現(xiàn)數(shù)據(jù)的封裝、隱藏、利用類可以實現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。其模塊化程度比繼承與派生。其模塊化程度比C C中采中采用函數(shù)更高。用

3、函數(shù)更高。類的定義格式:類的定義格式:class public: ; private: ; protected: ; 類的說明部分類的說明部分關(guān)鍵字關(guān)鍵字訪問權(quán)限關(guān)鍵字訪問權(quán)限關(guān)鍵字類的實現(xiàn)部分類的實現(xiàn)部分公有類型成員公有類型成員在關(guān)鍵字在關(guān)鍵字publicpublic后面聲明,它們是類后面聲明,它們是類與外部的接口,任何外部函數(shù)都可以訪與外部的接口,任何外部函數(shù)都可以訪問公有類型數(shù)據(jù)和函數(shù)。問公有類型數(shù)據(jù)和函數(shù)。私有類型成員私有類型成員在關(guān)鍵字在關(guān)鍵字privateprivate后面聲明,后面聲明,只允許只允許本類中的函數(shù)訪問,而類外部的任何函本類中的函數(shù)訪問,而類外部的任何函數(shù)都不能訪問。

4、數(shù)都不能訪問。如果如果緊跟在類名稱的后面聲明私有成員,緊跟在類名稱的后面聲明私有成員,則則關(guān)鍵字關(guān)鍵字privateprivate可以可以省略。省略。保護類型保護類型在關(guān)鍵字在關(guān)鍵字protectedprotected后面聲明后面聲明與與privateprivate類似,其差別表現(xiàn)在繼承類似,其差別表現(xiàn)在繼承與派生時對派生類的影響不同。與派生時對派生類的影響不同。數(shù)據(jù)成員數(shù)據(jù)成員 格式: 類型 變量列表;描述對象的內(nèi)部數(shù)據(jù)結(jié)構(gòu)描述對象的內(nèi)部數(shù)據(jù)結(jié)構(gòu)1、與一般的變量定義相同,但需要將它放在類、與一般的變量定義相同,但需要將它放在類的定義體中。的定義體中。 2 2、類中所有成員不可用、類中所有成員

5、不可用externextern(外部變量(外部變量) )、autoauto、registregist(寄存器變量)進(寄存器變量)進 行修飾。行修飾。3 3、在類中不允許對所定義的數(shù)據(jù)成員進在類中不允許對所定義的數(shù)據(jù)成員進行初始化。行初始化。基本類型、已聲明的派生類型基本類型、已聲明的派生類型說明:說明:成員函數(shù)成員函數(shù) 操作數(shù)據(jù)成員操作數(shù)據(jù)成員格式格式 返回類型返回類型 類名類名 : : 成員函數(shù)名(參數(shù)說明)成員函數(shù)名(參數(shù)說明) 函數(shù)體 在類中說明原形,在類外定義函數(shù)體實現(xiàn),并在函在類中說明原形,在類外定義函數(shù)體實現(xiàn),并在函數(shù)名前使用類名加以限定。也可以直接在類中定義函數(shù)數(shù)名前使用類名加

6、以限定。也可以直接在類中定義函數(shù)體,形成內(nèi)聯(lián)成員函數(shù)。體,形成內(nèi)聯(lián)成員函數(shù)。說明:說明:1. 在類中可以直接訪問類中說明的成員以在類中可以直接訪問類中說明的成員以描述該成員函描述該成員函數(shù)對它們所進行的操作;數(shù)對它們所進行的操作;2. 2. 一般成員函數(shù)可以重載。一般成員函數(shù)可以重載。3. 3. 成員函數(shù)可以設(shè)置參數(shù)的缺省值。成員函數(shù)可以設(shè)置參數(shù)的缺省值。4. 4. 函數(shù)體可寫在類體內(nèi)(函數(shù)體可寫在類體內(nèi)(內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)),也可寫在類體外),也可寫在類體外這時有兩種情況:有這時有兩種情況:有inlineinline引導(dǎo)的顯式內(nèi)聯(lián)函數(shù)、普引導(dǎo)的顯式內(nèi)聯(lián)函數(shù)、普通非內(nèi)聯(lián)函數(shù)。通非內(nèi)聯(lián)函數(shù)。5.

7、5. 在在C+C+中,類和結(jié)構(gòu)類似,但區(qū)別在于:缺省值不同中,類和結(jié)構(gòu)類似,但區(qū)別在于:缺省值不同, ,缺省情況下,類中的所有成員均為缺省情況下,類中的所有成員均為私有成員私有成員 內(nèi)聯(lián)成員函數(shù)內(nèi)聯(lián)成員函數(shù)l為了提高運行時的效率,對于較簡單為了提高運行時的效率,對于較簡單的函數(shù)可以聲明為內(nèi)聯(lián)形式。的函數(shù)可以聲明為內(nèi)聯(lián)形式。l在類中聲明內(nèi)聯(lián)成員函數(shù)的方式:在類中聲明內(nèi)聯(lián)成員函數(shù)的方式:將函數(shù)體放在類的聲明中。將函數(shù)體放在類的聲明中。使用使用inlineinline關(guān)鍵字。關(guān)鍵字。例例: :一個關(guān)于日期類的定義一個關(guān)于日期類的定義Class TDatepublic :void SetDate(in

8、t y,int m,int d)int IsLeapYear();void Print();private:int year,month,day;/私有數(shù)據(jù)成員私有數(shù)據(jù)成員/公有成員函數(shù)公有成員函數(shù)日期類的實現(xiàn)部分:日期類的實現(xiàn)部分:inline void TDate:SetDate(int y,int m,int d) year=y; month=m; day=d; int TDate:IsLeapYear() return(year% 4=0&year%100!=0)|(year%400=0); inline void TDate:Print()() coutyear“.”mont

9、h“.”dayendl; 例題:例題:#include#includevoid main()() TDate date1; date1.SetDate(1996,5,4); int leap=date1.IsLeapYear(); coutleapendl; date1.Print;說明:程序由三部分組成說明:程序由三部分組成1、類的定義、類的定義2、類成員函數(shù)的具體實現(xiàn)、類成員函數(shù)的具體實現(xiàn)3、聲明對象并傳遞消息、聲明對象并傳遞消息對象的定義對象的定義定義格式:定義格式:對象成員的訪問方法對象成員的訪問方法; 一個或多個對象名,以逗號分割;可以是一個或多個對象名,以逗號分割;可以是指向?qū)ο笾?/p>

10、向?qū)ο蟮闹羔樀闹羔樆蚧蛞妹妹驅(qū)ο髷?shù)組名,或?qū)ο髷?shù)組名例:例:TDate date1,date2,*Pdate,date31,&date3=date1; 類的對象是該類的某一特定實體,即類類型的變類的對象是該類的某一特定實體,即類類型的變量。定義對象之前,一定要先說明該對象的類。量。定義對象之前,一定要先說明該對象的類。類中成員的訪問方式類中成員的訪問方式l類中成員互訪類中成員互訪l類外訪問類外訪問P57例例3.3直接使用成員名直接使用成員名一般對象的成員表示方法:使用一般對象的成員表示方法:使用“對象對象名名.成員名成員名”方式訪問方式訪問 public 屬性的成員屬性的成員

11、指向?qū)ο蟮闹羔樀某蓡T表示方法:使用指向?qū)ο蟮闹羔樀某蓡T表示方法:使用“對象指針名對象指針名成員名成員名”或或“*對象指針對象指針名名.成員名成員名”方式訪問方式訪問 public 屬性的成員屬性的成員幾種特殊的成員函數(shù)幾種特殊的成員函數(shù): 對數(shù)據(jù)成員進行初始化。(賦值語句、初始化表)對數(shù)據(jù)成員進行初始化。(賦值語句、初始化表) 缺省構(gòu)造函數(shù)缺省構(gòu)造函數(shù) 拷貝初始化構(gòu)造函數(shù)(制造復(fù)制品)拷貝初始化構(gòu)造函數(shù)(制造復(fù)制品) 專門做掃尾工作的,完成對象被刪除前的一些清理專門做掃尾工作的,完成對象被刪除前的一些清理工作。工作。 缺省析構(gòu)函數(shù)缺省析構(gòu)函數(shù)構(gòu)造函數(shù):構(gòu)造函數(shù):析構(gòu)函數(shù)析構(gòu)函數(shù):創(chuàng)建類的對象時

12、系統(tǒng)自動調(diào)用。創(chuàng)建類的對象時系統(tǒng)自動調(diào)用。構(gòu)造函數(shù)構(gòu)造函數(shù)作用:作用:在對象被創(chuàng)建時使用特定的值構(gòu)造對象,或者在對象被創(chuàng)建時使用特定的值構(gòu)造對象,或者說將對象說將對象初始化初始化為一個特定的狀態(tài)。為一個特定的狀態(tài)。 特點:特點: 1 1、構(gòu)造函數(shù)名與類名相同。、構(gòu)造函數(shù)名與類名相同。 函數(shù)體可寫在類體內(nèi),也可寫在類體外函數(shù)體可寫在類體內(nèi),也可寫在類體外 2 2、不指明類型說明。、不指明類型說明。 可以有一個或多個參數(shù),不可用可以有一個或多個參數(shù),不可用void void 修飾修飾 3 3、可、可重載重載定義。表示類對象的不同初始化方式。定義。表示類對象的不同初始化方式。 允許為允許為內(nèi)聯(lián)內(nèi)聯(lián)函

13、數(shù)、函數(shù)、帶缺省形參值帶缺省形參值的函數(shù)的函數(shù) 4 4、如果程序中未定義,則系統(tǒng)自動產(chǎn)生出、如果程序中未定義,則系統(tǒng)自動產(chǎn)生出一個缺省形一個缺省形式式的無參構(gòu)造函數(shù)(的無參構(gòu)造函數(shù)(只創(chuàng)建對象,不會給對象的數(shù)據(jù)成員只創(chuàng)建對象,不會給對象的數(shù)據(jù)成員賦初值)賦初值)。但只要程序中定義過了任何一個不管是有參)。但只要程序中定義過了任何一個不管是有參或無參的構(gòu)造函數(shù),系統(tǒng)都不會再產(chǎn)生缺省的構(gòu)造函數(shù)了?;驘o參的構(gòu)造函數(shù),系統(tǒng)都不會再產(chǎn)生缺省的構(gòu)造函數(shù)了。 初始化方式說明初始化方式說明P64:l在構(gòu)造函數(shù)體內(nèi)用賦值語句給對象的數(shù)據(jù)成員在構(gòu)造函數(shù)體內(nèi)用賦值語句給對象的數(shù)據(jù)成員賦初值。賦初值。Tdate:TD

14、ate(int y,int m,int d)year=y;month=m;day=d;l通過初始化表的機制進行初始化。通過初始化表的機制進行初始化。初始化表:位于構(gòu)造函數(shù)的首部,形式如下:初始化表:位于構(gòu)造函數(shù)的首部,形式如下:構(gòu)造函數(shù)名:數(shù)據(jù)成員構(gòu)造函數(shù)名:數(shù)據(jù)成員( (初始值初始值) ),數(shù)據(jù)成員,數(shù)據(jù)成員( (初始值初始值) )如:如:Tdate:TDate(int y,int m,int d):year(y),month(m),day(d)說明:說明:l有些特殊類型的數(shù)據(jù)成員(有些特殊類型的數(shù)據(jù)成員(常量類型常量類型聲明聲明const和引用類型聲明和引用類型聲明type &),

15、),在構(gòu)造函數(shù)中不能通過賦值語句直接在構(gòu)造函數(shù)中不能通過賦值語句直接賦值,只能通過初始化表進行賦值。賦值,只能通過初始化表進行賦值。l而有些數(shù)據(jù)成員,如果是需要存放在而有些數(shù)據(jù)成員,如果是需要存放在堆中或數(shù)組中,則必須在構(gòu)造函數(shù)中堆中或數(shù)組中,則必須在構(gòu)造函數(shù)中使用賦值語句,不要用初始化表的方使用賦值語句,不要用初始化表的方式式P83例例 題:題:#includeclass initi_data int x; int ℞ const float pi; public: initi_data(int x1):rx(x),pi(3.14) x=x1; void display() c

16、outx=x rx=rx pi=pi; ;void main() initi_data id(100); id.display();執(zhí)行結(jié)果:執(zhí)行結(jié)果: x=100 rx=100 pi=3.14說明:初始化表實現(xiàn)對引用類型變量說明:初始化表實現(xiàn)對引用類型變量rx和常量和常量pi的初始化的初始化析構(gòu)函數(shù)析構(gòu)函數(shù) 具有特定有意義的成員函數(shù)具有特定有意義的成員函數(shù)特點 1 1、函數(shù)名與類名相同,加前綴、函數(shù)名與類名相同,加前綴 2 2、無重載、無重載 3 3、不指明數(shù)據(jù)類型,無參數(shù)、不可用、不指明數(shù)據(jù)類型,無參數(shù)、不可用void void 修飾修飾 4 4、當(dāng)對象生存期結(jié)束,系統(tǒng)自動調(diào)用。、當(dāng)對象生

17、存期結(jié)束,系統(tǒng)自動調(diào)用。1、如果一個對象被定義在一個函數(shù)體內(nèi),則當(dāng)、如果一個對象被定義在一個函數(shù)體內(nèi),則當(dāng)該函數(shù)結(jié)束時,自動調(diào)用析構(gòu)函數(shù)該函數(shù)結(jié)束時,自動調(diào)用析構(gòu)函數(shù)2 2、當(dāng)一個對象是使用、當(dāng)一個對象是使用newnew運算符被動態(tài)創(chuàng)建的,運算符被動態(tài)創(chuàng)建的,在使用在使用deletedelete釋放它時,自動調(diào)用析構(gòu)函數(shù)。釋放它時,自動調(diào)用析構(gòu)函數(shù)。撤消對象,返回內(nèi)存空間撤消對象,返回內(nèi)存空間缺省構(gòu)造函數(shù)和缺省析構(gòu)函數(shù)缺省構(gòu)造函數(shù)和缺省析構(gòu)函數(shù)說明:說明:當(dāng)在程序中定義了一個對象而沒有指明初始化時:當(dāng)在程序中定義了一個對象而沒有指明初始化時:1 1、類中沒有定義構(gòu)造函數(shù),則編譯器便按缺省構(gòu)造函

18、數(shù)、類中沒有定義構(gòu)造函數(shù),則編譯器便按缺省構(gòu)造函數(shù)來初始化該對象,這時該對象的所有數(shù)據(jù)成員初始值是來初始化該對象,這時該對象的所有數(shù)據(jù)成員初始值是任意的。任意的。2 2、在類中顯式定義了沒有參數(shù)的構(gòu)造函數(shù),則編譯器調(diào)、在類中顯式定義了沒有參數(shù)的構(gòu)造函數(shù),則編譯器調(diào)用該函數(shù)。用該函數(shù)。缺省構(gòu)造函數(shù)格式:缺省構(gòu)造函數(shù)格式: : ()()缺省析構(gòu)函數(shù)格式:缺省析構(gòu)函數(shù)格式: : ()() 重載構(gòu)造函數(shù)重載構(gòu)造函數(shù)class A / public: A(); A(int); A(int,char); A(float,char); / ;viod main() A x; A y(23); A m(12,

19、M); A w(3.4,W); / A (int i=0);warning C4520: A : multiple default constructors specifiederror C2668: A:A : ambiguous call to overloaded function二義性二義性拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)- -自行復(fù)制本類對象自行復(fù)制本類對象class class 類名類名 public : public : 類名(形參);類名(形參);/構(gòu)造函數(shù)構(gòu)造函數(shù) 類名(類名類名(類名 & &對象名);對象名);/拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù) . ;類名類名: : 類名(

20、類名類名(類名 & &對象名)對象名)/拷貝構(gòu)造函數(shù)的實現(xiàn)拷貝構(gòu)造函數(shù)的實現(xiàn) 函數(shù)體函數(shù)體 拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參其形參為本類的對象引用。為本類的對象引用。( (功能:把初始值對象的每一個功能:把初始值對象的每一個數(shù)據(jù)成員度復(fù)制到新建立的對象中去數(shù)據(jù)成員度復(fù)制到新建立的對象中去) )拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)class Point public: Point(in xx=0,int yy=0)X=xx; Y=yy; Point(Point& p); int GetX() return X; int GetY() retu

21、rn Y; private: int X,Y;Point:Point (Point& p) X=p.X; Y=p.Y; cout拷貝構(gòu)造函數(shù)被調(diào)用拷貝構(gòu)造函數(shù)被調(diào)用endl;拷貝構(gòu)造函數(shù)的調(diào)用(一拷貝構(gòu)造函數(shù)的調(diào)用(一)例例:int main(void) Point A(1,2); Point B(A); /拷貝構(gòu)造函數(shù)被調(diào)用拷貝構(gòu)造函數(shù)被調(diào)用 coutB.GetX()endl; return 0; 當(dāng)用類的一個對象去初始化該類的另一當(dāng)用類的一個對象去初始化該類的另一個對象時系統(tǒng)自動調(diào)用它實現(xiàn)拷貝賦值。個對象時系統(tǒng)自動調(diào)用它實現(xiàn)拷貝賦值??截悩?gòu)造函數(shù)的調(diào)用(二)拷貝構(gòu)造函數(shù)的調(diào)用(二)

22、l例如:例如:void f(Point p) coutp.GetX()endl; /調(diào)用析構(gòu)函數(shù)調(diào)用析構(gòu)函數(shù)int main() Point A(1,2); f(A); /調(diào)用拷貝構(gòu)造函數(shù)調(diào)用拷貝構(gòu)造函數(shù) return 0; 若函數(shù)的形參為類對象,調(diào)用函數(shù)時,實若函數(shù)的形參為類對象,調(diào)用函數(shù)時,實參賦值給形參,系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)。參賦值給形參,系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)??截悩?gòu)造函數(shù)的調(diào)用(三)拷貝構(gòu)造函數(shù)的調(diào)用(三)l例如:例如:Point g() Point A(1,2); return A; /調(diào)用拷貝構(gòu)造函數(shù)調(diào)用拷貝構(gòu)造函數(shù)int main() Point B; B=g(); re

23、turn 0; 當(dāng)函數(shù)的返回值是類對象時,系統(tǒng)自動調(diào)用拷當(dāng)函數(shù)的返回值是類對象時,系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(shù)。貝構(gòu)造函數(shù)??截悩?gòu)造函數(shù)拷貝構(gòu)造函數(shù)如果程序員沒有為類聲明拷貝初始如果程序員沒有為類聲明拷貝初始化構(gòu)造函數(shù),則編譯器自己生成一個拷化構(gòu)造函數(shù),則編譯器自己生成一個拷貝構(gòu)造函數(shù)。貝構(gòu)造函數(shù)。這個構(gòu)造函數(shù)執(zhí)行的功能是:用作這個構(gòu)造函數(shù)執(zhí)行的功能是:用作為初始值的對象的每個數(shù)據(jù)成員的值,為初始值的對象的每個數(shù)據(jù)成員的值,初始化將要建立的對象的對應(yīng)數(shù)據(jù)成員初始化將要建立的對象的對應(yīng)數(shù)據(jù)成員。例:例:Class Tdatepublic :TDate(int y,int m,int d);TDate

24、(TDate &date); TDate() cout“Destructor called.n”;void Print();private:int year,month,day;Tdate:TDate(int y,int m,int d)year=y;month=m;day=d; cout“Constructor called.n”;Tdate:TDate(TDate &date)year=date.year;month=date.month;day=date.day; cout“Constructor called.n”;void Tdate:Print()coutyear“

25、.”;coutmonth“.”;coutdayendl;#include#includevoid main()TDate day1(1998,5,26),day3;TDate day2(day1);day3f(day2);day3.print();();TDate f(TDate Q)int y,m,d;yQ.year1;mQ.month+1;d=Q.day+1;TDate R(y,m,d);return R;思考:思考:該程序共調(diào)用拷貝初始化函數(shù)該程序共調(diào)用拷貝初始化函數(shù)幾次,調(diào)用析構(gòu)函數(shù)幾次?幾次,調(diào)用析構(gòu)函數(shù)幾次?說明:拷貝初始化函數(shù)的使用說明:拷貝初始化函數(shù)的使用:1 1、明確表示由一

26、個對象初始化另一個對象時;明確表示由一個對象初始化另一個對象時; 如如:TDateTDate day2 day2(day1day1););2 2、當(dāng)對象作為函數(shù)參數(shù)傳遞給函數(shù)形參時、當(dāng)對象作為函數(shù)參數(shù)傳遞給函數(shù)形參時;如如:day3day3f f(day2day2););3 3、當(dāng)對象作為函數(shù)返回值時;、當(dāng)對象作為函數(shù)返回值時; 如如:return Rreturn R;對象數(shù)組和對象指針對象數(shù)組和對象指針l對象數(shù)組:數(shù)組里的每個元素都是某個對象數(shù)組:數(shù)組里的每個元素都是某個類類型的對象。類類型的對象。l創(chuàng)建對象數(shù)組時對數(shù)組元素的初始化。創(chuàng)建對象數(shù)組時對數(shù)組元素的初始化。對象與數(shù)組對象與數(shù)組/例

27、例3.12#includeclass exam int x;public: void set_x(int n) x=n; int get_x() return x;void main() int i; for (i=0;i4;i+) for (i=0;i4;i+) cout endl;有四個對象: ob0, ob1 ob2, ob3對象名.成員名有參構(gòu)造函數(shù),數(shù)組對象賦值有參構(gòu)造函數(shù),數(shù)組對象賦值#includeclass examint x;public:exam(int n) x=n;int get_x() return x;void main() exam ob4= 11,22,33,4

28、4; int i; for (i=0;i4;i+) outobi.get_x() ; cout endl;定義對象數(shù)組、 賦值執(zhí)行結(jié)果:執(zhí)行結(jié)果:11 22 33 44 對象數(shù)組元素例:例:#includeclass pointprivate: int x,y;public: point() x=5;y=5; /無參構(gòu)造函數(shù)無參構(gòu)造函數(shù)point(int a, int b) /有參構(gòu)造函數(shù)有參構(gòu)造函數(shù) x=a;y=b;int getx() return x;int gety() return y;void main() point op(3,4); coutop x=op.getx(); co

29、ut op y=op.gety()endl; point op_array20; coutop_array15 x=op_array15.getx(); coutop_array15 y=op_array15.gety()endl; 對象數(shù)組元素.成員函數(shù) 對象名.成員函數(shù)執(zhí)行結(jié)果執(zhí)行結(jié)果 op x=3 op y=4op_array15 x=5 op_array15 y=5/例例 對二維數(shù)組對象進行初始化對二維數(shù)組對象進行初始化#includeclass exampleprivate: int x,y;public: example(int n, int m) /有參構(gòu)造函數(shù)有參構(gòu)造函數(shù) x=

30、n; y=m; example( ) cout“Destructor called.n”; int getx( ) return x;int gety( ) return y;main()example op32=example(1,2), example(3,4), example(5,6), example(7,8), example(9,10), example(11,12) ;int i;for (i=0;i3;i+)coutopi0.get_x ;coutopi0.get_y“n”; coutopi1.get_x ; coutopi1.get_y“n”; cout“n”;return

31、 0;閱讀程序閱讀程序#includeclass Apublic:A(int i=0)x=i;cout構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)調(diào)用endl;A(const A &p) x=p.x; cout拷貝初始化構(gòu)造函數(shù)調(diào)用拷貝初始化構(gòu)造函數(shù)調(diào)用endl; void print() coutx=xendl;private: int x; main()A a1(10),a2; A arr12=a1,a2; int i; A arr23=A(10),A(20),A(30),arr33; for (i=0;i2;i+) arr1i.print (); for (i=0;i3;i+) arr2i.print

32、(); arr30=A(90); arr31=arr10; arr32=arr11; for (i=0;i-成員名成員名 ob-get_x() ob-get_x() /例例3_15#includeclass exe int x; public: void set_a(int a) x=a; void show_a() coutxshow_a(); 執(zhí)行結(jié)果執(zhí)行結(jié)果: 2 2 對象指針引用對象數(shù)組對象指針引用對象數(shù)組復(fù)習(xí):復(fù)習(xí): int array10, *p;數(shù)組名為數(shù)組的首地址數(shù)組名為數(shù)組的首地址p=array; 指針指向數(shù)組的第一個元素指針指向數(shù)組的第一個元素array0p+; 指針指向數(shù)

33、組的第二個元素指針指向數(shù)組的第二個元素array1對象數(shù)組與對象指針如同數(shù)組與指針的關(guān)系對象數(shù)組與對象指針如同數(shù)組與指針的關(guān)系exe ob4 , exe ob4 , * *p;p;p=ob; p=ob; 對象指針指向?qū)ο髷?shù)組的第一個元素對象指針指向?qū)ο髷?shù)組的第一個元素 ob0ob0p+; p+; 對象指針指向?qū)ο髷?shù)組的第二個元素對象指針指向?qū)ο髷?shù)組的第二個元素 ob1ob1/3_15_2#includeclass exe int x;public:void set_a(int a)x=a; void show_a()coutxshow_a(); p+; /指向數(shù)組的第二個元素指向數(shù)組的第二個元

34、素 p-show_a();執(zhí)行結(jié)果:執(zhí)行結(jié)果: 10 20this 指針指針this隱含在每個類的成員函數(shù)中。即:某個成員函數(shù)被調(diào)用時系統(tǒng)會自動向它傳遞一個即:某個成員函數(shù)被調(diào)用時系統(tǒng)會自動向它傳遞一個隱含的參數(shù),該參數(shù)是指向函數(shù)操作對象的指針(地隱含的參數(shù),該參數(shù)是指向函數(shù)操作對象的指針(地址),該指針用址),該指針用this來引用,稱為來引用,稱為this指針。指針。當(dāng)一個對象調(diào)用成員函數(shù)時:當(dāng)一個對象調(diào)用成員函數(shù)時: 1、編譯程序?qū)?、編譯程序?qū)his指針指向當(dāng)前對象的地址指針指向當(dāng)前對象的地址 2、調(diào)用成員函數(shù)、調(diào)用成員函數(shù) 3、每次成員函數(shù)存取數(shù)據(jù)成員時,將隱含使用、每次成員函數(shù)存取

35、數(shù)據(jù)成員時,將隱含使用 this指針。指針。例:例:#includeclass exth int i;public:void load(int val)this-i=val; int get()return this-i; ;void main() exth obj1,obj2; obj1.load(100); obj2.load(200); coutobj1.get()endl; coutobj2.get()endl;exth obj1,obj2; obj.load(100); obj.load(200); coutobj1.get()endl; coutobj2.get()iobj1,th

36、is-i,指向,指向obj1obj1的的i=100i=100對象對象 obj2obj2調(diào)用調(diào)用load() load() 和和get()get()時,時, thisthis指針指向指針指向obj2, this-i , obj2, this-i , 指向指向obj2obj2的的i=200i=200閱讀下面程序,觀察運行結(jié)果,理解閱讀下面程序,觀察運行結(jié)果,理解this指針的含義指針的含義 #includeclass Apublic: A(int i=0,int j=0)x=i;y=j; void print( )cout調(diào)用該函數(shù)的對象的調(diào)用該函數(shù)的對象的this指針是指針是thisendl;

37、coutx=x ,y=yendl;private: int x,y;main()A a1(10,20),a2;cout“a1地址地址:&a1endl;a1.print();cout“a2地址地址:&a2endl;a2.print (); a1a1地址:地址:0 x0065FDF00 x0065FDF0調(diào)用該函數(shù)的對象的調(diào)用該函數(shù)的對象的thisthis指針是:指針是:0 x0065FDF00 x0065FDF0 x=10 ,y=20 x=10 ,y=20a2a2地址:地址:0 x0065FDE80 x0065FDE8調(diào)用該函數(shù)的對象的調(diào)用該函數(shù)的對象的thisthis指針是:指

38、針是:0 x0065FDE80 x0065FDE8x=0 ,y=0 x=0 ,y=0本章主要內(nèi)容本章主要內(nèi)容l類概念和定義類概念和定義l對象的聲明對象的聲明l構(gòu)造函數(shù)構(gòu)造函數(shù)l析構(gòu)函數(shù)析構(gòu)函數(shù)l拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)l對象數(shù)組和對象指針對象數(shù)組和對象指針l向函數(shù)傳遞對象向函數(shù)傳遞對象l靜態(tài)成員靜態(tài)成員l友元友元l類的聚集類的聚集(類對象為成員類對象為成員)向函數(shù)傳遞對象向函數(shù)傳遞對象l對象可以作為參數(shù)傳遞給函數(shù),其方對象可以作為參數(shù)傳遞給函數(shù),其方法與傳遞系統(tǒng)自定義類型的數(shù)據(jù)相同,法與傳遞系統(tǒng)自定義類型的數(shù)據(jù)相同,在向函數(shù)傳遞對象時,可以通過傳值在向函數(shù)傳遞對象時,可以通過傳值調(diào)用方式,也可

39、以使用對象指針作為調(diào)用方式,也可以使用對象指針作為參數(shù)實現(xiàn)傳地址調(diào)用,為了更直接體參數(shù)實現(xiàn)傳地址調(diào)用,為了更直接體現(xiàn)傳地址,大多數(shù)情況下使用對象引現(xiàn)傳地址,大多數(shù)情況下使用對象引用作為函數(shù)參數(shù)。用作為函數(shù)參數(shù)。向函數(shù)傳遞對象向函數(shù)傳遞對象對象作為參數(shù)傳遞給函數(shù)對象作為參數(shù)傳遞給函數(shù)1、傳值調(diào)用方式傳值調(diào)用方式函數(shù)對對象的任何修改不影響調(diào)用該函數(shù)函數(shù)對對象的任何修改不影響調(diào)用該函數(shù)的對象本身。的對象本身。對象地址作為參數(shù)傳遞給函數(shù)對象地址作為參數(shù)傳遞給函數(shù)2 2、傳地址調(diào)用方式傳地址調(diào)用方式函數(shù)對對象的修改影響調(diào)用該函數(shù)的對象本身。函數(shù)對對象的修改影響調(diào)用該函數(shù)的對象本身。/3_19/3_19#

40、includeiostream.h#include class trclass tr int int i; i; public: public: tr(int tr(int n)i=n; n)i=n; void set_i(int void set_i(int n)i=n; n)i=n; int int get_i()return i; get_i()return i; ;void sqr_it(void sqr_it(tr tr ob ob) ) / /形參為形參為tr tr類類型類類型 ob.set_i(ob.get_i()ob.set_i(ob.get_i()* *ob.get_i();

41、ob.get_i(); coutcopy of obj has i vaule coutcopy of obj has i vaule of of ob.get_i();ob.get_i(); cout coutn;n; void main()void main() tr tr obj(10); obj(10); sqr_it(obj sqr_it(obj); ); / /傳值的方式傳給函數(shù)的形參傳值的方式傳給函數(shù)的形參 coutBut,obj.icoutBut,obj.i is unchanged in main:; is unchanged in main:; coutobj.get_i(

42、)endl coutobj.get_i()endl; ; 執(zhí)行結(jié)果:執(zhí)行結(jié)果:copy of obj has i vaule of 100But,obj.i is unchanged in main: 10/3_20/3_20#includeiostream.h#include class trclass tr int int i; i;public:public:tr(inttr(int n)i=n; n)i=n;void set_i(intvoid set_i(int n)i=n; n)i=n;intint get_i()return i; get_i()return i; ;void v

43、oid sqr_it(trsqr_it(tr * *ob)ob) / /形參為類形參為類tr tr的對象指針的對象指針 ob-set_i(ob-get_i() ob-set_i(ob-get_i()* *ob-get_i();ob-get_i(); coutcopy of obj has i vaule coutcopy of obj has i vaule of get_i(); of get_i(); cout coutn;n; void main()void main() tr tr obj(10); obj(10); sqr_it(&objsqr_it(&obj); )

44、; / /傳地址的方式傳給函數(shù)的形參傳地址的方式傳給函數(shù)的形參 coutNow,obj.icoutNow,obj.i in main has been in main has been changed:;changed:; coutobj.get_i()endl coutobj.get_i()endl; ; 執(zhí)行結(jié)果:執(zhí)行結(jié)果:copy of obj has i vaule of 100New,obj.i in main has been changed:100/3_21/3_21#includeiostream.h#include class trclass tr int int i; i;

45、public:public:tr(inttr(int n)i=n; n)i=n;void set_i(intvoid set_i(int n)i=n; n)i=n;intint get_i()return i; get_i()return i; ;void void sqr_it(trsqr_it(tr &ob) &ob) / /形參為類形參為類tr tr的對象引用的對象引用 ob-set_i(ob-get_i() ob-set_i(ob-get_i()* *ob-get_i();ob-get_i(); coutcopy of obj has i vaule coutcopy

46、of obj has i vaule of get_i(); of get_i(); cout coutn;n; void main()void main() tr tr obj(10); obj(10); sqr_it(objsqr_it(obj); ); coutNow,obj.i coutNow,obj.i in main has been in main has been changed:;changed:; coutobj.get_i()endl coutobj.get_i()endl; ; 執(zhí)行結(jié)果:執(zhí)行結(jié)果:copy of obj has i vaule of 100New,ob

47、j.i in main has been changed:100本章主要內(nèi)容本章主要內(nèi)容l類概念和定義類概念和定義l對象的聲明對象的聲明l構(gòu)造函數(shù)構(gòu)造函數(shù)l析構(gòu)函數(shù)析構(gòu)函數(shù)l拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)l對象數(shù)組和對象指針對象數(shù)組和對象指針l向函數(shù)傳遞對象向函數(shù)傳遞對象l靜態(tài)成員靜態(tài)成員l友元友元l類的聚集類的聚集(類對象為成員類對象為成員)靜態(tài)成員靜態(tài)成員 lC+還有一種數(shù)據(jù)成員,稱作還有一種數(shù)據(jù)成員,稱作“靜態(tài)靜態(tài)”成員,成員,靜態(tài)成員是所有對象公有的。靜態(tài)成員有靜態(tài)靜態(tài)成員是所有對象公有的。靜態(tài)成員有靜態(tài)數(shù)據(jù)成員和靜態(tài)函數(shù)成員之分。數(shù)據(jù)成員和靜態(tài)函數(shù)成員之分。l靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員l說明

48、靜態(tài)數(shù)據(jù)成員的語句格式是:說明靜態(tài)數(shù)據(jù)成員的語句格式是: static 類型說明符類型說明符 成員名;成員名;#includeiostream.h#include class jtcyclass jtcy int int a; a; static intstatic int b b; ;/ /靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員 public:public: jtcy( int jtcy( int n) a=n;b+=n; n) a=n;b+=n; static void display(jtcystatic void display(jtcy c) c) / /靜態(tài)成員函數(shù),對象為靜態(tài)成員函數(shù),對象為形

49、參形參 couta=c.a,b=bendl couta=c.a,b=bendl; ; ;int jtcy:bint jtcy:b=2; =2; / /靜態(tài)數(shù)據(jù)成員初始化靜態(tài)數(shù)據(jù)成員初始化void main( )void main( ) jtcy jtcy AA(2), BB(4); AA(2), BB(4); jtcy:display(AAjtcy:display(AA); ); / /對象作為調(diào)用函數(shù)的參數(shù)對象作為調(diào)用函數(shù)的參數(shù) jtcy:display(BBjtcy:display(BB); ); / /對象作為調(diào)用函數(shù)的參數(shù)對象作為調(diào)用函數(shù)的參數(shù) 執(zhí)行結(jié)果:執(zhí)行結(jié)果:a=2,b=8 a=

50、4,b=8靜態(tài)成員靜態(tài)成員l(1)主要用途:定義類的各個對象所公用的數(shù)據(jù),如主要用途:定義類的各個對象所公用的數(shù)據(jù),如平均數(shù)、統(tǒng)計總數(shù)平均數(shù)、統(tǒng)計總數(shù)l(2) 在一個類的對象空間內(nèi),不包含靜態(tài)成員的空間,在一個類的對象空間內(nèi),不包含靜態(tài)成員的空間,所以靜態(tài)成員所占空間所以靜態(tài)成員所占空間不會不會隨著對象的產(chǎn)生而分配,隨著對象的產(chǎn)生而分配,或隨著對象的消失而回收。或隨著對象的消失而回收。l(3) 靜態(tài)數(shù)據(jù)成員的存儲空間的分配是在程序靜態(tài)數(shù)據(jù)成員的存儲空間的分配是在程序一開始一開始運行時運行時就被分配。并不是在程序運行過程中在某一函就被分配。并不是在程序運行過程中在某一函數(shù)內(nèi)分配空間和初始化。數(shù)內(nèi)

51、分配空間和初始化。l(4) 靜態(tài)數(shù)據(jù)成員的賦值語句,既不屬于任何類,也靜態(tài)數(shù)據(jù)成員的賦值語句,既不屬于任何類,也不屬于包括主函數(shù)在內(nèi)的任何函數(shù),不屬于包括主函數(shù)在內(nèi)的任何函數(shù),靜態(tài)變量賦初值靜態(tài)變量賦初值語句應(yīng)當(dāng)寫在程序的全局區(qū)域中,并且必須指明其數(shù)語句應(yīng)當(dāng)寫在程序的全局區(qū)域中,并且必須指明其數(shù)據(jù)類型與所屬的類名,并用如下格式:據(jù)類型與所屬的類名,并用如下格式: 類型類型 類名:變量名類名:變量名=值;值; 如:例如:例3_22中的中的:int Student:count=0; 靜態(tài)成員靜態(tài)成員l(5) 對于在類的對于在類的public部分說明的靜態(tài)數(shù)據(jù)部分說明的靜態(tài)數(shù)據(jù)成員,可以不使用成員函

52、數(shù)而直接訪問,即成員,可以不使用成員函數(shù)而直接訪問,即使未定義類的對象,同樣也可以直接訪問,使未定義類的對象,同樣也可以直接訪問,但在使用時也必須但在使用時也必須用類名指明所屬的類用類名指明所屬的類,如,如例例3.23P87;而而private和和protected部分的靜部分的靜態(tài)成員態(tài)成員只能通過類的成員函數(shù)訪問。只能通過類的成員函數(shù)訪問。靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)與靜態(tài)數(shù)據(jù)成員一樣,靜態(tài)成員函數(shù)與類相與靜態(tài)數(shù)據(jù)成員一樣,靜態(tài)成員函數(shù)與類相聯(lián)系,不與類的對象相聯(lián)系,聯(lián)系,不與類的對象相聯(lián)系,不存在不存在thisthis指指針,針,所以訪問靜態(tài)成員函數(shù)時,不需要對象。所以訪問靜態(tài)成員函數(shù)時,不

53、需要對象。如:如:P89P89例例3.243.24靜態(tài)成員函數(shù)的定義:靜態(tài)成員函數(shù)的定義:static static 類型類型 函數(shù)名(形參)函數(shù)名(形參) 函數(shù)體函數(shù)體 本章主要內(nèi)容本章主要內(nèi)容l類概念和定義類概念和定義l對象的聲明對象的聲明l構(gòu)造函數(shù)構(gòu)造函數(shù)l析構(gòu)函數(shù)析構(gòu)函數(shù)l拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)l對象數(shù)組和對象指針對象數(shù)組和對象指針l向函數(shù)傳遞對象向函數(shù)傳遞對象l靜態(tài)成員靜態(tài)成員l友元友元l類的聚集類的聚集(類對象為成員類對象為成員)友員友員 friend Private:成員public:pf();f();不可訪問不可訪問Private:成員public:pf();friend f

54、();f();指明友員關(guān)系可訪問可訪問可訪問可訪問可訪問可訪問作用:提高程序的運行效率。作用:提高程序的運行效率。友元友元l友元是友元是C+提供的一種破壞數(shù)據(jù)封裝和提供的一種破壞數(shù)據(jù)封裝和數(shù)據(jù)隱藏的機制。數(shù)據(jù)隱藏的機制。l通過將一個模塊聲明為另一個模塊的友通過將一個模塊聲明為另一個模塊的友元,一個模塊能夠引用到另一個模塊中元,一個模塊能夠引用到另一個模塊中本是被隱藏的信息。本是被隱藏的信息。l可以使用友元函數(shù)和友元類??梢允褂糜言瘮?shù)和友元類。l為了確保數(shù)據(jù)的完整性,及數(shù)據(jù)封裝與為了確保數(shù)據(jù)的完整性,及數(shù)據(jù)封裝與隱藏的原則,建議盡量不使用或少使用隱藏的原則,建議盡量不使用或少使用友元。友元。友

55、元函數(shù)友元函數(shù)l友元函數(shù)是在類定義中由關(guān)鍵字友元函數(shù)是在類定義中由關(guān)鍵字friend修飾說明修飾說明的的非成員函數(shù)非成員函數(shù),在它的函數(shù)體中能夠通過對象名,在它的函數(shù)體中能夠通過對象名訪問訪問 對象的所有成員。對象的所有成員。l在類定義中使用關(guān)鍵字friend聲明;l是非成員函數(shù),可出現(xiàn)在類的私有、公有、保護部 分、在類定義之外定義;l使用類對象引用作參數(shù),通過該引用對象名訪問對象中的所有成員。l作用:增加靈活性,使程序員可以在封裝和快速作用:增加靈活性,使程序員可以在封裝和快速性方面做合理選擇。性方面做合理選擇。說明說明:l特點:可以訪問該類中的可以訪問該類中的所有所有成員。成員。l聲明形式

56、:friend type func_name ;友員函數(shù)類型友員函數(shù)類型:普通函數(shù)友元成員: 當(dāng)一個類的友元函數(shù)正好是另一個類的成員函數(shù)時.友元函數(shù)為一普通函數(shù)友元函數(shù)為一普通函數(shù)class ex int x; public: ex (int a)x=a; int getx()return x; friend long cube(ex &);long cube(ex &s) return (s.x*s.x*s.x);/友員函數(shù)友員函數(shù)ex 類類型類類型 /訪問訪問 ex類的私有成員類的私有成員void main() ex a(5); coutcube(a)endl; couta

57、.getx()*a.getx()*a.getx()endl;執(zhí)行結(jié)果:執(zhí)行結(jié)果: 125 125求兩點間的距離求兩點間的距離#include #include class Point public: Point(double xi, double yi) X=xi; Y=yi; double GetX() return X; double GetY() return Y; friend double Distance( Point& a, Point& b); private: double X, Y;double Distance( Point& a, Point&a

58、mp; b) double dx=a.X-b.X; double dy=a.Y-b.Y; return sqrt(dx*dx+dy*dy);int main() Point p1(3.0, 5.0), p2(4.0, 6.0); double d=Distance(p1, p2); coutThe distance is dendl; return 0;友元成員友元成員 -友元函數(shù)是其它類的成員函數(shù)友元函數(shù)是其它類的成員函數(shù)例:例:/3.27 當(dāng)友員函數(shù)為其它類的成員函數(shù)時注意:當(dāng)友員函數(shù)為其它類的成員函數(shù)時注意:l該友員函數(shù)不僅應(yīng)當(dāng)在它所在的類定義中聲明,且應(yīng)該友員函數(shù)不僅應(yīng)當(dāng)在它所在的類定義中聲明,且

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論