C++及Windows可視化程序設(shè)計第5章_第1頁
C++及Windows可視化程序設(shè)計第5章_第2頁
C++及Windows可視化程序設(shè)計第5章_第3頁
C++及Windows可視化程序設(shè)計第5章_第4頁
C++及Windows可視化程序設(shè)計第5章_第5頁
已閱讀5頁,還剩172頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第5章 對象和類,5.1 類及其實例化 5.2 類和對象的性質(zhì) 5.3 結(jié)構(gòu)和聯(lián)合 5.4 構(gòu)造函數(shù) 5.5 析構(gòu)函數(shù) 5.6 綜合例題,5.7 重載對象的賦值運算符 5.8 對象成員的初始化 5.9 類模板與標(biāo)準(zhǔn)模板庫 5.10 面向?qū)ο缶幊痰奈募?guī)范 實驗 習(xí)題,本章重點介紹在C+中定義類、建立和使用對象的方法。雖然同類對象在其數(shù)據(jù)成員的取值方面是不相同的,但可以共用相同的代碼。 類是對同類對象的描述,它不但描述了對象之間的公有接口,同時也給出了對象的內(nèi)部實現(xiàn)(數(shù)據(jù)成員和成員函數(shù))。,像構(gòu)造枚舉和結(jié)構(gòu)一樣,類也是一種用戶自己構(gòu)造的數(shù)據(jù)類型并遵循C+的規(guī)定。 例如,類也要先聲明后使用;不管聲

2、明的內(nèi)容是否相同,聲明同一個名字的兩個類是錯誤的,類是具有惟一標(biāo)識符的實體;在類中聲明的任何成員不能使用extern、auto和register關(guān)鍵字進行修飾;類中聲明的變量屬于該類,在某些情況下,變量可以被該類的不同實例所共享。,5.1 類及其實例化 5.1.1 定義類,類和其他數(shù)據(jù)類型不同的是,組成這種類型的不僅可以有數(shù)據(jù),而且可以有對數(shù)據(jù)進行操作的函數(shù),它們分別叫做類的數(shù)據(jù)成員和類的成員函數(shù),而且不能在類聲明中對數(shù)據(jù)成員使用表達式進行初始化。,1. 聲明類 類是對一組性質(zhì)相同對象的程序描述。在C+中聲明類的一般形式為 class 類名 private: 私有數(shù)據(jù)和函數(shù) public: 公

3、有數(shù)據(jù)和函數(shù) protected: 保護數(shù)據(jù)和函數(shù) ;,類聲明以關(guān)鍵字class開始,其后跟類名。 類所聲明的內(nèi)容用花括號括起來,右花括號后的分號作為類聲明語句的結(jié)束標(biāo)志。這一對花括號“”之間的內(nèi)容稱為類體。 類中定義的數(shù)據(jù)和函數(shù)稱為這個類的成員(數(shù)據(jù)成員和成員函數(shù))。 類成員均具有一個屬性,叫做訪問權(quán)限,通過它前面的關(guān)鍵字來定義。顧名思義,關(guān)鍵字private 、public和protected 以后的成員的訪問權(quán)限分別是私有、公有和保護的,把這些成員分別叫做私有成員、公有成員和保護成員。 訪問權(quán)限用于控制對象的某個成員在程序中的可訪問性,如果沒有使用關(guān)鍵字,則所有成員默認聲明為privat

4、e權(quán)限。這些關(guān)鍵字的使用順序和次數(shù)也都是任意的。,【例5.1】 描述點的Point類。 class Point /類名Point private: /聲明為私有訪問權(quán)限 int x,y;/私有數(shù)據(jù)成員 public: /聲明為公有訪問權(quán)限 void Setxy(int a,int b);/無返回值的公有成員函數(shù) void Move(int a,int b);/無返回值的公有成員函數(shù) void Display();/無返回值的公有成員函數(shù) int Getx(); /返回值為int的公有成員函數(shù) int Gety(); /返回值為int的公有成員函數(shù) ; /類聲明以分號結(jié)束 x和y是私有成員,Se

5、txy、Display、Move、Getx和Gety是公有成員。因為只是聲明函數(shù),所以可只給出函數(shù)原型?!纠?.2】是其等效的聲明方式。,【例5.2】 使用默認關(guān)鍵字及改變關(guān)鍵字順序和次數(shù)的Point類。 class Point /類名Point int x;/默認私有數(shù)據(jù)成員 public: /聲明為公有訪問權(quán)限 /無返回值的公有成員函數(shù)Setxy的函數(shù)原型 void Setxy(int,int); /無返回值的公有成員函數(shù)Move的函數(shù)原型 void Move(int,int); void Display();/無返回值的公有成員函數(shù)的函數(shù)原型 int Getx(); /返回值為int的公

6、有成員函數(shù)的函數(shù)原型 int Gety(); /返回值為int的公有成員函數(shù)的函數(shù)原型,private: /聲明為私有訪問權(quán)限 int y;/私有數(shù)據(jù)成員 ; /類定義以分號結(jié)束 由此可見,成員函數(shù)聲明的規(guī)則與第4章所述的函數(shù)聲明規(guī)則相同。 2. 定義成員函數(shù) 類中說明的成員函數(shù)用來對數(shù)據(jù)成員進行操作。例如,Point類的Setxy函數(shù)用來為該類的對象設(shè)置初始值,而當(dāng)調(diào)用成員函數(shù)Getx時,則返回一個對象的數(shù)據(jù)成員x的值。 在類中只對這些成員函數(shù)進行了函數(shù)聲明,還必須在程序中實現(xiàn)這些成員函數(shù)。 定義成員函數(shù)的一般形式為,返回類型 類名成員函數(shù)名(參數(shù)列表) 成員函數(shù)的函數(shù)體/內(nèi)部實現(xiàn) 其中“”

7、是作用域運算符,“類名”是成員函數(shù)所屬類的名字,“”用于表明其后的成員函數(shù)是屬于這個特定的類。換言之,“類名成員函數(shù)名”的意思就是對屬于“類名”的成員函數(shù)進行定義,而“返回類型”則是這個成員函數(shù)返回值的類型。余下的工作就是定義成員函數(shù)的函數(shù)體。 例如Setxy是類Point的成員函數(shù),它沒有返回值,則定義如下: void Point Setxy(int a,int b) x=a; y=b;,將“void PointSetxy(int a,int b)”理解為定義Point的函數(shù)成員Setxy(int a,int b),該成員帶有兩個整型參數(shù),函數(shù)沒有返回值(void)。按此方法,可寫出其他幾個

8、成員函數(shù)的定義: void Point Move(int a,int b) x=x+a; y=y+b; void Point Display() coutx,yendl; int Point Getx() return x; int Point Gety() return y;,也可以使用關(guān)鍵字inline將成員函數(shù)定義為內(nèi)聯(lián)函數(shù),例如: inline int Point Getx() return x; 如果在聲明類的同時,在類體內(nèi)給出成員函數(shù)的定義,則默認為內(nèi)聯(lián)函數(shù)。例如在類中將聲明Getx的語句“int Getx();”改為“int Getx()return x;”,則Getx為內(nèi)聯(lián)函數(shù)

9、。 一般直接在類體內(nèi)給出簡單成員函數(shù)的定義。有些成員函數(shù)的實現(xiàn)方式不止一種,例如 void Point Display() coutGetx(),Gety()endl;,是調(diào)用成員函數(shù)Getx()和Gety()實現(xiàn)的,它們使用了cout流,應(yīng)在定義之前包含如下語句: #include using namespace std; 3. 數(shù)據(jù)成員的賦值 不能在類體內(nèi)給數(shù)據(jù)成員賦值,即下面的方法是錯誤的: Class Point int x=25,y=56; ;,當(dāng)然,在類體外面就更不允許了。 數(shù)據(jù)成員的具體值是用來描述對象的屬性的。只有產(chǎn)生了一個具體的對象,這些數(shù)據(jù)值才有意義,所以又稱對象的初值或?qū)?/p>

10、象初始化。 這跟簡單數(shù)據(jù)類型的道理一樣,int是整數(shù)類型,但需要聲明整數(shù)對象之后才有意義,“int x=5;”使得整數(shù)對象x的值為5,只是類具有成員函數(shù)而已。 假設(shè)已經(jīng)有了一個對象A,則可使用“.”運算符調(diào)用成員函數(shù)Setxy賦初值。例如: A.Setxy(25,56);,將對象A的數(shù)據(jù)成員x和y分別賦給25和56,即A.x=25,A.y=56。其實,真正的初始化是使用與Point同名的構(gòu)造函數(shù)Point(int,int)實現(xiàn)的。 在1.10.1節(jié)介紹使用string的對象str時,使用“string str(real is);”語句。按此推理,可以寫出產(chǎn)生Point的對象的語句: Point

11、 A(25,56); 這就是使用構(gòu)造函數(shù)產(chǎn)生類的實例。不過,現(xiàn)在還沒有定義構(gòu)造函數(shù)Point(int,int),所以還不能使用這種方法。但可以看到數(shù)據(jù)封裝的跡象了!,Point類是用戶定義的一種類型,Point類所說明的數(shù)據(jù)成員描述了對象的內(nèi)部數(shù)據(jù)結(jié)構(gòu),對數(shù)據(jù)成員的訪問通過類的成員函數(shù)來進行。 使用Point在程序中聲明變量,具有Point類的類型的變量被稱為Point的對象。只有產(chǎn)生類的對象,才能使用這些數(shù)據(jù)和成員函數(shù)。 類Point不僅可以聲明對象,還可以聲明對象的引用和對象的指針,語法與基本數(shù)據(jù)類型一樣。 Point A,B; /定義Point類型的對象A和B Point *p= for

12、(int i=0; i2; i+) delete ptri; ,必須為每個數(shù)組元素調(diào)用delete析構(gòu)相應(yīng)的對象數(shù)組元素所占的空間。輸出結(jié)果如下: Initializing 2,4 Initializing 7,8 Destructor is active Destructor is active 數(shù)據(jù)成員使用指針時,需要為它們申請空間,要注意區(qū)分動態(tài)對象數(shù)組和指針數(shù)組的區(qū)別,以及析構(gòu)時的異同。注意分析下面的例子。,#include using namespace std; class Test private: char *str; public: Test(char *str=Here!)

13、; Test(); ;,Test:Test(char *s) /定義構(gòu)造函數(shù) str=new charstrlen(s)+1; strcpy(str,s); cout Initializing strendl; Test:Test() cout Delete strendl; ,void main ( ) Test *ptr1=new Test(We are here!); Test *ptr2=new Test2; Test *ptr32=new Test(We), new Test(You) ; delete ptr1; delete ptr2; for(int i=0; i2; i+)

14、delete ptr3i; ,第一個創(chuàng)建的是一個Test對象的指針ptr1,初始化的值為: We are here! 析構(gòu)需要使用一個單獨的語句“delete ptr1;”。 第二個創(chuàng)建的是一個Test對象的動態(tài)數(shù)組,這個數(shù)組有兩個元素,初始化的值在內(nèi)中順序排列為: Here! 0Here!0 指針ptr2指向首地址,需要使用語句 delete ptr2; 來析構(gòu)這分配給這兩個對象的存儲空間。 第三個創(chuàng)建的是一個Test對象的動態(tài)數(shù)組,這個數(shù)組有兩個元素,初始化的值分別為: 對象,ptr30內(nèi)容為 We;ptr31內(nèi)容為 You。 所以要使用循環(huán)語句逐個析構(gòu)。 輸出結(jié)果如下: Initiali

15、zing We are here! Initializing Here! Initializing Here! Initializing We Initializing You Delete We are here! Delete Here! Delete Here! Delete We Delete You,如果在定義類時沒有定義析構(gòu)函數(shù),C+編譯器要為這個類產(chǎn)生一個默認的析構(gòu)函數(shù)。正如沒有給類定義構(gòu)造函數(shù),C+編譯系統(tǒng)會產(chǎn)生一個默認構(gòu)造函數(shù)一樣,編譯器也為它產(chǎn)生一個函數(shù)體為空的默認析構(gòu)函數(shù): TestTest(),5.5.3 默認析構(gòu)函數(shù),【例5.9】 演示調(diào)用構(gòu)造函數(shù)及 析構(gòu)函數(shù)的綜合例

16、題。 下面這個程序綜合演示了調(diào)用構(gòu)造函數(shù)、調(diào)用復(fù)制構(gòu)造函數(shù)及調(diào)用析構(gòu)函數(shù)的順序,并演示了調(diào)用復(fù)制構(gòu)造函數(shù)的3種不同情況。 另外,本程序還比較了函數(shù)使用對象和對象的引用為參數(shù)的情況。,5.6 綜合例題,#include using namespace std; class Point private: int X,Y; public: Point(int a=0,int b=0) /構(gòu)造函數(shù) X=a; Y=b; coutInitializingendl; Point(const Point 以繞過類型轉(zhuǎn)換所帶來的運行時間開銷。 程序運行結(jié)果如下: We They We We We Go home

17、!,可以在一個類中說明具有某個類的類型數(shù)據(jù)成員,這些成員稱為對象成員。 在類X中說明對象成員的一般形式為: class X 類名1成員名1; 類名2成員名2; 類名n成員名n; ;,5.8 對象成員的初始化,說明對象成員是在類名之后給出對象成員的名字。為初始化對象成員,X類的構(gòu)造函數(shù)要調(diào)用這些對象成員所在類的構(gòu)造函數(shù),X類的構(gòu)造函數(shù)的定義形式如下: X X(參數(shù)表0): 成員1(參數(shù)表1), 成員2(參數(shù)表2),成員n(參數(shù)表n) /其他操作 冒號“:”后由逗號隔開的項組成成員初始化列表,其中的參數(shù)表給出為調(diào)用相應(yīng)成員所在類的構(gòu)造函數(shù)時應(yīng)提供的參數(shù)。這些參數(shù)一般來自“參數(shù)表0”,可以使用任意復(fù)

18、雜的表達式,其中可以有函數(shù)調(diào)用。如果某項的參數(shù)表為空,則表中相應(yīng)的項可以省略。,對象成員構(gòu)造函數(shù)的調(diào)用順序取決于這些對象成員在類中說明的順序,與它們在成員初始化列表中給出的順序無關(guān)。 當(dāng)建立X類的對象時,先調(diào)用對象成員的構(gòu)造函數(shù),初始化對象成員,然后才執(zhí)行X類的構(gòu)造函數(shù),初始化X類中的其他成員。 析構(gòu)函數(shù)的調(diào)用順序與構(gòu)造函數(shù)正好相反。 下面分析一個實際的例子。,【例5.11】 分析下面程序中析構(gòu)函數(shù)與構(gòu)造函數(shù)的調(diào)用順序。 #include using namespace std; class object private: int val; public: object(): val(0) c

19、outDefault constructor for object“endl; object(int i): val(i) coutConstructor for object“valendl; object() coutDestructor for object“valendl; ;,class container private: object one;/初始化順序與對象成員產(chǎn)生的順序有關(guān) object two;/排在前面的先初始化 int data; public: container(): data(0) coutDefault constructor for container“en

20、dl; container(int i,int j,int k); container() coutDestructor for container“dataendl; ;,/與初始化列表順序無關(guān) container container(int i,int j,int k): two(i),one(j) data=k; coutConstructor for container“dataendl; void main() container obj,anObj(5,6,10); 程序運行結(jié)果如下:,Default constructor for object /為對象成員one調(diào)用 /默認構(gòu)造

21、函數(shù) Default constructor for object /為對象成員two調(diào)用 /默認構(gòu)造函數(shù) Default constructor for container/為對象obj調(diào)用 /container類的默認構(gòu)造函數(shù) Constructor for object 6 /為對象成員one調(diào)用 /構(gòu)造函數(shù) Constructor for object 5 /為對象成員two調(diào)用 /構(gòu)造函數(shù) Constructor for container 10 /為對象anObj調(diào)用 /container類的有參構(gòu)造函數(shù),Destructor for container 10 /調(diào)用contain

22、er類的析 /構(gòu)函數(shù)析構(gòu)對象anObj Destructor for object 5 /析構(gòu)數(shù)據(jù)成員為5的對象two Destructor for object 6 /析構(gòu)數(shù)據(jù)成員為6的對象one Destructor for container 0 /調(diào)用container類的析構(gòu) /函數(shù)析構(gòu)對象obj Destructor for object 0 /析構(gòu)對象two Destructor for object 0 /析構(gòu)對象one 在這個程序中, container類包含有兩個object類的對象成員one和two。,對基本數(shù)據(jù)類型的成員的初始化也可以在成員初始化列表中進行,例如: co

23、ntainer container(int i,int j,int k) : two(i),one(j),data(k) 當(dāng)初始化const成員和引用成員時,必須通過成員初始化列表進行。 例如下面的例子。,class example private: const int num; int Point有輸出兩點距離的函數(shù)Distance。 給出Line類的實現(xiàn)并設(shè)計滿足要求的類模板Point。 分析輸出結(jié)果,總結(jié)構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用順序。,3. 提示 Line的對象不能直接存取Point對象的私有數(shù)據(jù)成員。 要求Display(Line&)函數(shù)也輸出兩個端點坐標(biāo)之間的距離,參數(shù)是Line對象

24、的引用。假設(shè)為“Line&s”,則引用點對象a的形式是s.a。對于a的成員函數(shù),s.a要用“.”運算符去調(diào)用,例如,使用“s.a.Display();”顯示Line對象的一個端點坐標(biāo)。 可以先不使用類模板,試驗成功之后再改為模板。 注意類模板函數(shù)成員在聲明之外定義和作為內(nèi)聯(lián)函數(shù)定義方法的異同。,5-1 設(shè)計一個點類Point,再設(shè)計一個矩形類,矩形類使用Point類的兩個坐標(biāo)點作為矩形的對角頂點,并可以輸出4個坐標(biāo)值和面積。使用測試程序驗證程序。 5-2 使用內(nèi)聯(lián)函數(shù)設(shè)計一個類,用來表示直角坐標(biāo)系中的任意一條直線并輸出它的屬性。 5-3 定義一個類模板,計算24個數(shù)據(jù)的最小值并用不同數(shù)據(jù)測試類的正確性。,習(xí)題,5-4 下面是以傳統(tǒng)形式的struct來定義一個存放字符的棧類型,并定義了有關(guān)棧操作的各種函數(shù)。編寫一個主函數(shù),定義并輸入一個字符串,用此串來驗證棧的各種操作,包括把串壓入棧中后再彈出,以相反的次序?qū)⑺鼈冿@示出來。 const max_len=1000; enum boolean false,true; enum EMPTY=-1,F(xiàn)ULL=max_len-

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論