版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、C+程序設(shè)計基礎(chǔ),第7章 類與對象 北京郵電大學(xué)信通院 方莉 ,2,第7章 類與對象,類是實現(xiàn)C+面向?qū)ο蟪绦蛟O(shè)計的基礎(chǔ)。 面向?qū)ο蟪绦蛟O(shè)計的基本特點有:抽象、封裝、繼承和多態(tài)。 類把數(shù)據(jù)和函數(shù)封裝在一起,是C+封裝的基本單元。 本章主要內(nèi)容 類的使用、定義和實現(xiàn) 面向?qū)ο蠓治龊兔嫦驅(qū)ο笤O(shè)計,7.1 類和對象的定義 7.2 對象的使用 7.3 構(gòu)造函數(shù) 7.4 析構(gòu)函數(shù) 7.5 類的靜態(tài)成員 7.6 類成員的保護和使用 7.7 運算符重載 7.8 類的組合 7.9 面向?qū)ο蠓治龊驮O(shè)計,第7章 類與對象,4,7.1 類和對象的定義,一個類表示現(xiàn)實生活中的一類事物,比如“學(xué)生”, 事物有相應(yīng)的特征
2、或?qū)傩?,它們就是類的?shù)據(jù)成員; 事物可能有行為動作,也可能被某些行為動作所操作,這些都用函數(shù)來實現(xiàn),這些函數(shù)和類有著不可分割的關(guān)系,是構(gòu)成類的函數(shù)成員,或者叫成員函數(shù)。 在C+中,類實際上相當(dāng)于一種用戶自定義的數(shù)據(jù)類型。,5,在定義了類類型后,就可以定義該類型的變量,這個變量就稱為類的對象(或?qū)嵗?對象是一類事物中的一個具體的個體。 從程序設(shè)計的角度來看,對象就相當(dāng)于變量。,7.1 類和對象的定義,6,舉例:,class Student /類的定義 private: int id; char20 name; int age; float score; public: void getsco
3、re() void printstu() ;,7.1 類和對象的定義,7,7.1.1 使用類對象,如果已經(jīng)知道某個類的功能和接口函數(shù),就可以使用它了。先定義類對象,通過對象調(diào)用接口函數(shù)實現(xiàn)一定的功能。 class Student stu01; /class也可以省略不寫 Student stu01; stu01.getscore(); stu01.printstu(); 這個過程的本質(zhì)是:根據(jù)對象所需要完成的任務(wù),向?qū)ο蟀l(fā)送消息。對象收到消息后,調(diào)用接口中的相應(yīng)的函數(shù),完成它的功能。對象只需要知道“做什么”,具體工作由成員函數(shù)來完成。,8,class Student /類的定義 private
4、: int id; char name 20; float score; public: void GetData(); void PrintData(); ;,類的聲明:具體說明類的組成 class 類名 private: /數(shù)據(jù)成員 protected: /保護成員 public: /成員函數(shù) ; 一般寫在類的.h文件中,也可以寫在類的.cpp文件之首。,7.1.2 類的聲明,9,類實際上是一種用戶自定義的數(shù)據(jù)類型。 比較:,struct student int id; char20 name; float score; ;,class Student private: int id; c
5、har name20; float score; public: void GetData(); void PrintData(); ;,同是自定義的類型。 在無顯式聲明時,結(jié)構(gòu)體的成員是公有的,類的成員是私有的。,7.1.2 類的聲明,10,分析: 任何一個時鐘應(yīng)該有時、分、秒的值,這就是時鐘的屬性特征;時鐘的操作應(yīng)該有設(shè)置時間、顯示時間等。畫出時鐘類的標(biāo)記圖如下:,例: 要聲明一個時鐘類,11,舉例: class Clock public: void SetTime(int newH,int newM,int newS); void ShowTime(); private: int Hou
6、r; int Minute; int Second; ;,7.1.2 類的聲明,12,舉例: class Point public: void SetXY(int x, int y); void GetXY(int ,7.1.2 類的聲明,13,關(guān)鍵字public、protected、private說明類成員的訪問控制屬性。 私有(private)成員只允許本類的成員函數(shù)來訪問; 公有(public)成員是類對外的接口,在類聲明和類(函數(shù))實現(xiàn)之后,類的對象可以訪問公有成員。 保護型(protected)成員,對于類外其它函數(shù),其可訪問性和私有成員的性質(zhì)相似。,7.1.2 類的聲明,14,關(guān)于
7、訪問控制屬性,注意: 在類聲明中,三種訪問控制屬性,可以按任意次序出現(xiàn),也可以不出現(xiàn)。public等關(guān)鍵字也可以多次出現(xiàn),但是一個成員只能具有一種訪問控制屬性。 如果不寫訪問控制屬性關(guān)鍵字,默認(rèn)的是private。在書寫時通常習(xí)慣將公有類型放在最前面,這樣便于閱讀,因為它們是外部訪問時所要了解的。 一般情況下,一個類的數(shù)據(jù)成員應(yīng)該聲明為私有成員,這樣封裝性較好。一個類應(yīng)該有一些公有的函數(shù)成員,作為對外的接口,否則別的代碼無法訪問類。,7.1.2 類的聲明,15,“類的成員”既可以是數(shù)據(jù)成員,也可以是成員函數(shù)的原型。 數(shù)據(jù)成員,表示類的屬性,聲明方式與一般變量相同。 成員函數(shù),描述類的對象可以進(jìn)
8、行的操作,一般在類中聲明原型,在類聲明之外定義函數(shù)的具體實現(xiàn)。,7.1.2 類的聲明,16,類的成員函數(shù)描述的是類的行為或操作。 在類聲明中,聲明函數(shù)的原型。(類的聲明文件.h文件) 函數(shù)的具體實現(xiàn)一般寫在類聲明之外。(類的實現(xiàn)文件.cpp文件) 在類的外部定義成員函數(shù)的語法形式為: 返回值類型 類名:成員函數(shù)名(參數(shù)表) 函數(shù)體 ,7.1.3 類的成員函數(shù),17,例: 時鐘類Clock的成員函數(shù)的實現(xiàn): void Clock:SetTime(int newH,int newM,int newS) Hour=newH; Minute=newM; Second=newS; void Clock:
9、ShowTime() coutHour:Minute:Secondendl; ,7.1.3 類的成員函數(shù),18,class Clock public: void SetTime(int NewH, int NewM, int NewS); void ShowTime( ); private: int Hour, Minute, Second; ;,void Clock:SetTime(int NewH, int NewM, int NewS) Hour=NewH; Minute=NewM; Second=NewS; void Clock:ShowTime() coutHour“:”Minute
10、“:”Secondendl; ,Clock類的聲明和實現(xiàn),19,成員函數(shù)描述類的行為(或服務(wù)、操作);實現(xiàn)程序的算法,是對類封裝的數(shù)據(jù)進(jìn)行操作的唯一途徑。 在類定義中說明原型(一般在.h文件中),在類的實現(xiàn)文件(.cpp)中定義函數(shù)體,并在函數(shù)名前使用類名加以限定,標(biāo)示它與類之間的關(guān)系。也可以直接在類中定義函數(shù)體,形成內(nèi)聯(lián)成員函數(shù)。 允許定義重載函數(shù)和帶缺省形參值的成員函數(shù)。 在聲明成員函數(shù)時,可以控制訪問權(quán)限;一般將成員函數(shù)設(shè)為公有型的。,7.1.3 類的成員函數(shù),20,/Tdate.h 類的聲明文件 class Tdate public: void Set(int m,int d,int
11、y); /置日期值 int IsLeapYear(); /判是否閏年 void Print(); /輸出日期值 private: int month; int day; int year; ;,21,/Tdate.cpp 類的實現(xiàn)文件 void Tdate:Set(int m,int d,int y) month=m; day=d; year=y; int Tdate: IsLeapYear() return (year%4=0 ,22,內(nèi)聯(lián)函數(shù): 如果在類的內(nèi)部定義成員函數(shù)的具體實現(xiàn),則該成員函數(shù)為內(nèi)聯(lián)成員函數(shù)。 函數(shù)定義時沒有任何的附加說明,所以稱為隱式聲明的內(nèi)聯(lián)成員。 顯示內(nèi)聯(lián)函數(shù) (用
12、 inline),7.1.3 類的成員函數(shù),23,class Point public: void SetXY(int x, int y) m_x=x; m_y=y; void GetXY(int ,7.1.3 類的成員函數(shù),24,class Clock public: void SetTime(int NewH, int NewM, int NewS); void ShowTime( ); private: int Hour, Minute, Second; ;,inline void Clock:SetTime(int NewH, int NewM, int NewS) Hour=NewH
13、; Minute=NewM; Second=NewS; inline void Clock:ShowTime() coutHour“:”Minute“:”Secondendl;,顯式聲明的內(nèi)聯(lián)函數(shù),7.1.3 類的成員函數(shù),25,帶默認(rèn)參數(shù)值的成員函數(shù) 類的成員函數(shù)也可以有默認(rèn)形參值,其調(diào)用規(guī)則同普通函數(shù)相同。 例如時鐘類的SetTime()函數(shù),使用默認(rèn)值: void Clock:SetTime(int newH=0,int newM=0, int newS=0) Hour=newH; Minute=newM; Second=newS; ,7.1.3 類的成員函數(shù),26,重載函數(shù) 成員函數(shù)可
14、以用與普通函數(shù)同樣的方法重載。 例:class Point public: void Set(int x, int y); void Set(int x, int y,int color); void Get(int ,7.1.3 類的成員函數(shù),27,注意,類名是成員函數(shù)名的一部分,所以一個類的成員函數(shù)與另一個類的成員函數(shù)即使同名,也不能認(rèn)為是重載。,class Clock public: void Set (int NewH, int NewM, int NewS); void Show ( ); private: int Hour, Minute, Second; ;,class Poin
15、t public: void Set(int x, int y); void Get(int ,7.1.3 類的成員函數(shù),28,對象是一類事物中的個體,從程序設(shè)計的角度來看,對象就相當(dāng)于變量。 定義一個對象和定義一個一般變量相同。 類名稱 對象名稱 例 Clock ck1; Point point1;,7.1.4 對象,29,定義變量時要分配存儲空間,同樣,定義一個對象時要分配存儲空間,一個對象所占的內(nèi)存空間是類的數(shù)據(jù)成員所占的空間總和。類的成員函數(shù)存放在代碼區(qū),不占內(nèi)存空間。 類的成員是抽象的,對象的成員才是具體的。類的數(shù)據(jù)成員都不會有具體的屬性值。只有對象的成員才會有具體的屬性值。,7.1
16、.4 對象,30,對象的使用:根據(jù)類的功能和接口函數(shù),定義對象,通過對象調(diào)用接口函數(shù)實現(xiàn)一定的功能。 聲明了類及其對象,在類的外部(即在類定義和成員函數(shù)的實現(xiàn)代碼之外),就可以訪問對象的公有成員(包括數(shù)據(jù)成員和函數(shù)成員)了。 語法形式為: 對象名. 公有數(shù)據(jù)成員 對象名.公有成員函數(shù)名(參數(shù)表),7.1.4 對象,31,使用對象的過程: 根據(jù)對象所需要完成的任務(wù),向?qū)ο蟀l(fā)送消息。 對象收到消息后,調(diào)用接口中的相應(yīng)的函數(shù),完成它的功能。 對象只需要知道“做什么”,具體工作由成員函數(shù)來完成。 例: class student stu1; 或 student stu1; stu1.GetData()
17、; stu1.PrintData();,7.1.4 對象,class Student /類的定義 private: int id; char name 20; float score; public: void GetData(); void PrintData(); ;,32,例如,在主函數(shù)中定義了Clock類的對象: void main() Clock myclock; myclock.SetTime(12, 5, 0); myclock.ShowTime(); ,執(zhí)行main()函數(shù)時的內(nèi)存分配情況,33,在類的外部,只能通過對象訪問類的公有成員;在類的成員函數(shù)內(nèi)部,可以直接訪問類的所有
18、成員,這就實現(xiàn)了對訪問范圍的有效控制。,void Clock:SetTime( int newH=0, int newM=0, int newS=0) Hour=newH; minute=newM; Second=newS; ,class Clock public: void Set (int NewH, int NewM, int NewS); void Show ( ); private: int Hour, Minute, Second; ;,void main() Clock myclock; myclock.SetTime(12,5, 0); myclock.ShowTime();
19、,7.1.4 對象,34,類作用域是指類定義和相應(yīng)的成員函數(shù)定義的范圍,通俗地稱為類的內(nèi)部。 一個類的全部成員都是一個整體的相關(guān)部分。 一個類的所有成員位于這個類的作用域內(nèi),在該范圍內(nèi),一個類的成員函數(shù)對本類的其它成員具有無限制的訪問權(quán)。,7.1.5 類的作用域與可見性,35,例7.2:編程測試類的作用域范圍。 #include using namespace std; class Sample private: int a; void fa();,protected: float b; void fb(); public: char c; void set(); void display()
20、; ;,7.1.5 類的作用域與可見性,36,void Sample:fa() cout In function faendl; couta b cendl; void Sample:fb() cout In function fbendl; couta b cendl; ,7.1.5 類的作用域與可見性,37,void Sample:set() a=10; b=5.5; c=K; void Sample:display() cout In function displayendl; fa(); ,在類的成員函數(shù)里,可以訪問類的任何成員,7.1.5 類的作用域與可見性,38,void main
21、() Sample s; /s.a=10; /編譯時會出錯,在類的外部不能訪問類的私有成員 /s.b=5.5;/編譯時會出錯,在類的外部不能訪問類的保護成員 s.c=K; s.set(); /s.fa();/編譯時會出錯,在類的外部不能訪問類的私有成員 /s.fb();/編譯時會出錯,在類的外部不能訪問類的保護成員 s.display(); ,7.1.5 類的作用域與可見性,39,類名實際是個類型名,允許類名與其它變量名或函數(shù)名相同。 在類的內(nèi)部,外部與類名同名的全局變量名或函數(shù)名不可見。 在一個函數(shù)內(nèi),同名的類名和變量名可以同時使用,都是可見的。,7.1.5 類的作用域與可見性,40,例:若
22、Sample類已定義,以下函數(shù)的定義是沒有問題的: void func( ) class Sample a; /定義對象時要用到類名,加前綴class int Sample=10; /變量名和類名相同 Sample+; /. 但是從程序可讀性考慮,一般還是不要讓類名和其他變量名、函數(shù)名用同樣的名字。,7.1.5 類的作用域與可見性,41,要聲明一個時鐘類,任何一個時鐘都應(yīng)該有時、分、秒的值,這就是時鐘的屬性特征;時鐘的操作應(yīng)該有設(shè)置時間、顯示時間等。,7.1.6 時鐘類舉例,42,/聲明時鐘類的頭文件:Clock.h #include using namespace std; class Cl
23、ock/類的聲明 public: void SetTime(int newH=0,int newM=0,int newS=0); void ShowTime(); void ShowTime(int n); private: int Hour; int Minute; int Second; ;,7.1.6 時鐘類舉例,43,/實現(xiàn)類成員函數(shù)的源文件:Clock.cpp #include Clock.h void Clock:SetTime(int newH,int newM,int newS)/SetTime()函數(shù)定義 Hour=newH; Minute=newM; Second=newS
24、; void Clock:ShowTime()/ShowTime()函數(shù)定義 coutHour:Minute:Secondendl; void Clock:ShowTime(int n)/重載函數(shù)的定義 coutHour點Minute分Second秒endl; ,7.1.6 時鐘類舉例,44,/測試應(yīng)用程序:7-1.cpp #include Clock.h void main() Clock myclock;/類的對象 myclock.SetTime(12, 5, 0);/設(shè)置時間 myclock.ShowTime();/第一種方式顯示時間 myclock.ShowTime(1);/第二種方式
25、顯示時間 ,7.1.6 時鐘類舉例,7.1 類和對象的定義 7.2 對象的使用 7.3 構(gòu)造函數(shù) 7.4 析構(gòu)函數(shù) 7.5 類的靜態(tài)成員 7.6 類成員的保護和使用 7.7 運算符重載 7.8 類的組合 7.9 面向?qū)ο蠓治龊驮O(shè)計,第7章 類與對象,46,對象是類的一個具體的實例,類和對象的關(guān)系相當(dāng)于普遍與特殊的關(guān)系。在C+中,類是一個自定義的數(shù)據(jù)類型,對象是該數(shù)據(jù)類型的一個變量。 在大型程序開發(fā)中,類的定義和實現(xiàn)可以作為一個完整的程序模塊,在其它的程序模塊中可以定義對象,通過對象訪問公有成員函數(shù),模塊與模塊之間的接口就是那些公有成員函數(shù)。,7.2 對象的使用,47,定義一個全局的對象 可以在
26、函數(shù)體中定義一個局部的對象 動態(tài)地從堆中申請空間來創(chuàng)建一個對象 可以定義對象數(shù)組 使用對象作為函數(shù)的參數(shù)與返回值。,7.2 對象的使用,48,聲明對象指針的一般語法形式為: 類名* 對象指針名; 使用對象指針訪問對象的成員,語法形式為: 對象指針名-公有成員; 例如: Clock c; /在棧中分配Clock型存儲空間 Clock* pc1=new Clock;/在堆中分配Clock型存儲空間 Clock* pc2=,1. 對象指針,49,void main() Clock* pmyclock=new Clock; pmyclock-SetTime(12, 5, 0); pmyclock-Sh
27、owTime(); delete pmyclock; ,1.對象指針,50,問:一個類中所有對象調(diào)用的成員函數(shù)都執(zhí)行同一段代碼。那么,成員函數(shù)又是怎么識別當(dāng)前是那個對象在訪問呢? 答:this指針指出了成員函數(shù)當(dāng)前所操作的數(shù)據(jù)所屬的對象。不同的對象調(diào)用成員函數(shù)時,this指針將指向不同的對象,也就可以訪問不同對象的數(shù)據(jù)成員。,2.this指針,51,如果通過某個對象調(diào)用其公有成員,則此時該對象被稱為當(dāng)前對象,系統(tǒng)用this指針指向當(dāng)前對象。 成員函數(shù)被調(diào)用時,它除了得到實際參數(shù)外,還得到了指向當(dāng)前對象的this指針。 例如: Clock c1,c2; c1.SetTime(12,5,0);/此
28、時this指向c1 c1.ShowTime(); c2.SetTime(11,4,2); /此時this指向c2 c2.ShowTime();,2.this指針,52,在成員函數(shù)內(nèi)部,所有對類成員的訪問都隱含地加上前綴this-。所以函數(shù)SetTime()的實現(xiàn)相當(dāng)于: void Clock:SetTime(Clock * this,int newH,int newM,int newS) this-Hour=newH; /但是不能在Hour前加對象名 this-Minute=newM; this-Second=newS; ,2.this指針,53,對象數(shù)組的元素是對象,不僅具有數(shù)據(jù)成員,而且還
29、有函數(shù)成員,可以通過數(shù)組元素調(diào)用成員函數(shù)。,3.對象數(shù)組,54,/例7.3 使用對象數(shù)組 #include using namespace std; class student private: int id; char name20; int age; float score; public: void set(int, char*, int, float); void printstu(); ;,3.對象數(shù)組,例 7.3: 定義學(xué)生類student, 數(shù)據(jù)成員包括:學(xué)號、姓名、年齡、成績; 函數(shù)成員有設(shè)置值和輸出顯示。 在主函數(shù)中定義學(xué)生數(shù)組,表示多個學(xué)生,給每個學(xué)生設(shè)置值,然后輸出顯示。
30、,55,void student:set(int i, char* c, int a, float s) id = i; strcpy(name, c); age = a; score = s; void student: printstu(); cout學(xué)號:id 姓名:name; cout 年齡:age 成績:scoreendl; ,3.對象數(shù)組,56,void main() student stu5;/對象數(shù)組 stu0.set(1,wang,18, 86); /設(shè)置數(shù)組中每個對象 stu1.set(2,Li,18, 72); stu2.set(3,zhao,18, 80); stu3.
31、set(4,guo,18, 85); stu4.set(5,meng,18, 75); for(int i=0; i5; i+) stui.printstu(); /顯示每個對象 ,3.對象數(shù)組,57,可以將對象作為參數(shù)傳遞給一個函數(shù) 直接用對象作為參數(shù),調(diào)用函數(shù)時,進(jìn)行值傳遞,實參的值要復(fù)制給形參; 如果類的數(shù)據(jù)成員較多時,需要一一復(fù)制,這種參數(shù)傳遞方式效率不高,可以使用對象指針或?qū)ο笠梅绞絹韨鬟f函數(shù)參數(shù)。 可以從函數(shù)返回一個對象。,4.對象用做函數(shù)的參數(shù)和返回值,58,/Tdate.h:Tdate類聲明 #include using namespace std; class Tdate
32、public: void Set(int,int,int); /成員函數(shù)的聲明 int IsLeapYear(); void Print(); private: int month; int day; int year; ;,例7.4 使用對象作為函數(shù)的參數(shù),59,/Tdate.cpp:Tdate類成員函數(shù)實現(xiàn) #include “Tdate.h” void Tdate:Set(int m,int d,int y) month=m; day=d; year=y; int Tdate:IsLeapYear() return (year%4=0 ,例7.4 使用對象作為函數(shù)的參數(shù),60,/例7.4
33、的應(yīng)用程序: 7_4.cpp #include using namespace std; #include Tdate.h void someFunc(Tdate someday) someday.Print(); if(someday.IsLeapYear() cout leap yearn; else cout not leap yearn; void main() Tdate s; s.Set(2,15,2003); someFunc(s); /對象作為函數(shù)參數(shù) ,例7.4 使用對象作為函數(shù)的參數(shù),61,例7.5:類的定義和例7.4相同。主程序把類對象的指針作為實參數(shù)來調(diào)用函數(shù)。,例7.
34、5 使用對象指針作為函數(shù)的參數(shù),62,/例7.5:使用對象指針傳遞函數(shù)參數(shù) #include using namespace std; #include Tdate.h void someFunc(Tdate* pS) /對象的指針作形參 pS-Print(); / ,pS是s對象的指針 if(pS-IsLeapYear() cout leap yearn; else cout not leap yearn; void main() Tdate s; s.Set(2,15,2003); someFunc( /對象的地址作實參 ,例7.5 使用對象指針作為函數(shù)的參數(shù),63,例7.6:類的定義和例
35、7.4相同。主程序把類對象的引用作為實參數(shù)來調(diào)用函數(shù)。,例7.6 使用對象引用作為函數(shù)的參數(shù),64,/例7.6:使用對象引用傳遞函數(shù)參數(shù) #include using namespace std; #include “Tdate.h” void someFunc(Tdate ,void main() Tdate s; s.Set(2,15,2003); someFunc(s); ,例7.6 使用對象引用作為函數(shù)的參數(shù),65,/例7-7:使用對象的引用作為函數(shù)的返回值 #include using namespace std; class Rectangle private: float wid
36、th,height; public: void SetRectangle(float newW, float newH) width = newW; height=newH; float Area() return width*height; ;,例7.7 使用對象引用作為函數(shù)的返回值,66,/例7-7:使用對象的引用作為函數(shù)的返回值 Rectangle ,例7.7 使用對象引用作為函數(shù)的返回值,67,例7.7 使用對象引用作為函數(shù)的參數(shù),7.1 類和對象的定義 7.2 對象的使用 7.3 構(gòu)造函數(shù) 7.4 析構(gòu)函數(shù) 7.5 類的靜態(tài)成員 7.6 類成員的保護和使用 7.7 運算符重載 7.8
37、 類的組合 7.9 面向?qū)ο蠓治龊驮O(shè)計,第7章 類與對象,69,每個對象區(qū)別于其他對象的地方主要有兩個, 外在的區(qū)別就是對象的標(biāo)識符,即對象的名稱, 而內(nèi)在的區(qū)別就是對象自身的屬性值,即數(shù)據(jù)成員的值。 在定義一個對象的時候要給它分配存儲空間,也可以同時給它的數(shù)據(jù)成員賦初值,稱為對象的初始化。,7.3 構(gòu)造函數(shù),70,C+程序中的對象初始化工作由一個特殊的成員函數(shù)來完成,就是構(gòu)造函數(shù)。 因為不同類型的對象的初始化工作是不一樣的,因此構(gòu)造函數(shù)從屬于某個類的,即每個類都要定義它自己的構(gòu)造函數(shù),它是類的成員函數(shù)。,7.3 構(gòu)造函數(shù),71,定義構(gòu)造函數(shù)的一般形式為: class 類名 public: 類
38、名(形參表); /構(gòu)造函數(shù)的原型 /類的其它成員 ; 類名:類名(形參表)/構(gòu)造函數(shù)的實現(xiàn) /函數(shù)體 ,7.3 構(gòu)造函數(shù),72,class Clock public: Clock(int H,int M,int S);/構(gòu)造函數(shù) void SetTime(int newH,int NewM,int newS); void ShowTime(); private: int Hour; int Minute; int Second; ;,7.3 構(gòu)造函數(shù),73,Clock:Clock(int H,int M,int S) /類的構(gòu)造函數(shù)在類外實現(xiàn) Hour=H; Minute=M; Second=
39、S; ,構(gòu)造函數(shù)可以在類的內(nèi)部實現(xiàn),也可以在類的外部實現(xiàn),7.3 構(gòu)造函數(shù),74,class Clock public: Clock(int H,int M,int S) /構(gòu)造函數(shù) Hour=H; Minute=M; Second=S; void SetTime(int newH,int NewM,int newS); void ShowTime(); private: int Hour; int Minute; int Second; ;,構(gòu)造函數(shù)可以在類的內(nèi)部實現(xiàn),也可以在類的外部實現(xiàn),7.3 構(gòu)造函數(shù),75,void main() /構(gòu)造對象MyClock,初始化為8點30分 Cloc
40、k MyClock(8,30,0); MyClock.ShowTime();/顯示時鐘 ,在main函數(shù)中,就可以通過Clock類的構(gòu)造函數(shù)來創(chuàng)建和初始化對象,7.3 構(gòu)造函數(shù),76,構(gòu)造函數(shù)的特點是: 構(gòu)造函數(shù)的函數(shù)名與類名相同;而且沒有返回值。 構(gòu)造函數(shù)一定是公有函數(shù)。 作為類的成員函數(shù),構(gòu)造函數(shù)可以直接訪問類的所有數(shù)據(jù)成員。 在類的內(nèi)部定義的構(gòu)造函數(shù)是內(nèi)聯(lián)函數(shù)。構(gòu)造函數(shù)可以帶默認(rèn)形參值,也可以重載。,7.3 構(gòu)造函數(shù),77,在聲明類時如果沒有定義類的構(gòu)造函數(shù),編譯系統(tǒng)就會在編譯時自動生成一個默認(rèn)形式的構(gòu)造函數(shù),默認(rèn)構(gòu)造函數(shù)的形式: 類名:類名() ,7.3 構(gòu)造函數(shù),78,默認(rèn)構(gòu)造函數(shù)是
41、構(gòu)造對象時不提供參數(shù)的構(gòu)造函數(shù)。 在以下情況下,系統(tǒng)將調(diào)用默認(rèn)構(gòu)造函數(shù)來構(gòu)造對象: 直接定義一個對象而沒有初始化,如: Clock myclock; 用new動態(tài)申請的對象而沒有初始化值,如: Clock * pclock = new Clock; 定義一個對象數(shù)組,如: student classA30;,7.3 構(gòu)造函數(shù),79,除了無參數(shù)構(gòu)造函數(shù)是默認(rèn)構(gòu)造函數(shù)外,帶有全部默認(rèn)參數(shù)值的構(gòu)造函數(shù)也是默認(rèn)構(gòu)造函數(shù)。 程序中,不能同時出現(xiàn)無參數(shù)構(gòu)造函數(shù)和帶有全部默認(rèn)形參值的構(gòu)造函數(shù)。否則,就會出現(xiàn)編譯錯誤。 如果類定義了帶參數(shù)的構(gòu)造函數(shù),這時系統(tǒng)不會再自動生成默認(rèn)構(gòu)造函數(shù)了,可又需要默認(rèn)構(gòu)造函數(shù),
42、如上面所列的三種情況,這時,需要為類另定義一個無參構(gòu)造函數(shù),出現(xiàn)了構(gòu)造函數(shù)的重載。,7.3 構(gòu)造函數(shù),80,構(gòu)造函數(shù)的重載 構(gòu)造函數(shù)可以像普通函數(shù)一樣重載,調(diào)用時根據(jù)參數(shù)的不同,選擇其中合適的一個。,7.3 構(gòu)造函數(shù),81,例7.8:為日期類定義4個構(gòu)造函數(shù),分別是: 帶一個參數(shù),僅初始化日; 帶二個參數(shù),初始化月、日; 帶三個參數(shù),初始化年、月、日; 不帶參數(shù)。,7.3 構(gòu)造函數(shù),82,#include using namespace std; class Tdate public: Tdate(); /第一個構(gòu)造函數(shù) Tdate(int d); /第二個構(gòu)造函數(shù) Tdate(int m,i
43、nt d); /第三個構(gòu)造函數(shù) Tdate(int m,int d,int y); /第四個構(gòu)造函數(shù) /其他公共成員 private: int month; int day; int year; ;,構(gòu)造函數(shù)的重載,83,Tdate:Tdate() month=4; day=15; year=1995; cout month / day / year endl; Tdate:Tdate(int d) month=4; day=d; year=1996; cout month / day / year endl; Tdate:Tdate(int m,int d) month=m; day=d;
44、year=1997; cout month / day / year endl;,7.3 構(gòu)造函數(shù),84,Tdate:Tdate(int m,int d,int y) month=m; day=d; year=y; cout month / day / year endl; void main() Tdate aday; /開始用4種方式構(gòu)造4個對象 Tdate bday(10); Tdate cday(2,12); Tdate dday(1,2,1998); ,7.3 構(gòu)造函數(shù),85,復(fù)制構(gòu)造函數(shù)用來復(fù)制一個對象; 生成一個對象的副本有兩種途徑: 第一種途徑是建立一個新對象,然后通過對象的賦
45、值運算來復(fù)制。 另一種途徑就是使用復(fù)制構(gòu)造函數(shù)。 例如: Clock ca(12, 5, 0);/先創(chuàng)建一個對象 Clock cb=ca; /用賦值運算將ca復(fù)制到cb; Clock cc(ca); /用復(fù)制構(gòu)造函數(shù)將ca復(fù)制到cc;,7.3 構(gòu)造函數(shù),86,圖7.6 Clock對象ca復(fù)制為cb的內(nèi)存示意圖,7.3 構(gòu)造函數(shù),87,復(fù)制構(gòu)造函數(shù)是形參是本類對象的引用的構(gòu)造函數(shù)。 定義一個復(fù)制構(gòu)造函數(shù)的一般形式為: class 類名 public: 類名(類名 類名:類名(類名 Y=yy; Location(Location ,7.3 構(gòu)造函數(shù),89,復(fù)制構(gòu)造函數(shù) 是一種特殊的構(gòu)造函數(shù),其形參
46、為本類的對象引用。 作用 用一個已有確定值的對象(復(fù)制構(gòu)造函數(shù)的形參所指的對象)去初始化一個新建的同類對象。 Location pos1(10,20); Location pos2(pos1); 實現(xiàn)同類對象間的數(shù)據(jù)傳遞。 pos2=pos1; 實質(zhì)是將對象的復(fù)制工作用一個函數(shù)來完成。 如果要完成復(fù)制任務(wù), pos2.X=pos1.x; pos2.Y=pos1.Y; 類外不行;這樣的訪問只能由類的成員函數(shù)實現(xiàn)-復(fù)制構(gòu)造函數(shù).,7.3 構(gòu)造函數(shù),90,缺省復(fù)制構(gòu)造函數(shù) 如果用戶未顯式地定義類的復(fù)制構(gòu)造函數(shù),則系統(tǒng)會自動生成一個默認(rèn)的復(fù)制構(gòu)造函數(shù),把成員值一一復(fù)制 通過賦值運算符初始化對象時,系統(tǒng)
47、會自動調(diào)用復(fù)制構(gòu)造函數(shù)。 復(fù)制構(gòu)造函數(shù)與原來的構(gòu)造函數(shù)實現(xiàn)了函數(shù)的重載。,7.3 構(gòu)造函數(shù),91,以下三種情況系統(tǒng)會自動調(diào)用復(fù)制構(gòu)造函數(shù): 當(dāng)用類的一個對象去初始化該類的另一個對象時; 如果函數(shù)的形參是類的對象,調(diào)用函數(shù)時,用實參的值初始化形參時; 如果函數(shù)的返回值是類的對象,函數(shù)執(zhí)行完成返回調(diào)用者時。,7.3 構(gòu)造函數(shù),92,當(dāng)用類的一個對象去初始化該類的另一個對象時系統(tǒng)自動調(diào)用它實現(xiàn)復(fù)制賦值。例: int main(void) Location A(1,2); Location B(A); /復(fù)制構(gòu)造函數(shù)被調(diào)用 coutB.GetX()endl; return 0; ,7.3 構(gòu)造函數(shù),9
48、3,若函數(shù)的形參為類對象,調(diào)用函數(shù)時,用實參初始化形參,系統(tǒng)自動調(diào)用復(fù)制構(gòu)造函數(shù)。例如: void f(Location p) coutp.GetX()endl; /調(diào)用析構(gòu)函數(shù) int main() Location A(1,2); f(A); /調(diào)用復(fù)制構(gòu)造函數(shù) return 0; ,7.3 構(gòu)造函數(shù),94,當(dāng)函數(shù)的返回值是類對象時,系統(tǒng)自動調(diào)用復(fù)制貝構(gòu)造函數(shù)。例如: Location g() Location A(1,2); return A; /調(diào)用復(fù)制構(gòu)造函數(shù) int main() Location B; B=g(); return 0; ,7.3 構(gòu)造函數(shù),7.1 類和對象的定義
49、7.2 對象的使用 7.3 構(gòu)造函數(shù) 7.4 析構(gòu)函數(shù) 7.5 類的靜態(tài)成員 7.6 類成員的保護和使用 7.7 運算符重載 7.8 類的組合 7.9 面向?qū)ο蠓治龊驮O(shè)計,第7章 類與對象,96,與構(gòu)造函數(shù)相反,當(dāng)對象生存期結(jié)束時,需要調(diào)用析構(gòu)函數(shù),釋放對象所占的內(nèi)存空間。 與構(gòu)造函數(shù)一樣,析構(gòu)函數(shù)也是類的一個公有成員函數(shù),它的名稱是在類名前加“”構(gòu)成,沒有返回值,和構(gòu)造函數(shù)不同的是析構(gòu)函數(shù)不接受任何參數(shù)。 析構(gòu)函數(shù)聲明的格式是: 類名();,7.4 析構(gòu)函數(shù),97,如果程序中不定義析構(gòu)函數(shù),系統(tǒng)也會提供一個默認(rèn)的析構(gòu)函數(shù): 類名() 這個析構(gòu)函數(shù)只能用來釋放對象的數(shù)據(jù)成員所占用的空間,但不包
50、括堆內(nèi)存空間。 析構(gòu)函數(shù)是在對象生存期即將結(jié)束的時刻由系統(tǒng)自動調(diào)用的。 類的析構(gòu)函數(shù)不能重載。,7.4 析構(gòu)函數(shù),98,7.4 析構(gòu)函數(shù),例7.10:定義學(xué)生類student,其中“姓名”用字符指針(char *)來保存,在構(gòu)造一個學(xué)生時,從堆中為“姓名”分配存儲空間,那么需要定義析構(gòu)函數(shù),在對象生存期結(jié)束時,把堆空間釋放,還給系統(tǒng)。這種情況下,不能使用默認(rèn)的析構(gòu)函數(shù)。,99,#include using namespace std; class student public: student(int, char*, int, float); /構(gòu)造函數(shù) student(student,7.4
51、 析構(gòu)函數(shù),100,student:student(int i, char* c, int a, float s) /構(gòu)造函數(shù) coutConstructing.endl; id = i; age = a; score = s; name = new charstrlen(c)+1; if (name != 0) strcpy(name, c); student:student(student/復(fù)制字符串 ,7.4 析構(gòu)函數(shù),101,student:student() /析構(gòu)函數(shù) coutDestructing.endl; if(name!=NULL) delete name; void st
52、udent:printstu() cout“學(xué)號:”id 姓名:name; cout年齡:age成績:scoreendl; void main() student stu(1,wang,18, 86); / student stu2(stu); stu.printstu(); ,7.4 析構(gòu)函數(shù),7.1 類和對象的定義 7.2 對象的使用 7.3 構(gòu)造函數(shù) 7.4 析構(gòu)函數(shù) 7.5 類的靜態(tài)成員 7.6 類成員的保護和使用 7.7 運算符重載 7.8 類的組合 7.9 面向?qū)ο蠓治龊驮O(shè)計,第7章 類與對象,103,靜態(tài)成員是類的特殊成員,采用static關(guān)鍵字來聲明。分為: 靜態(tài)數(shù)據(jù)成員 靜態(tài)
53、成員函數(shù),7.5 靜態(tài)成員,104,靜態(tài)數(shù)據(jù)成員是類的數(shù)據(jù)成員的一種特例,采用static關(guān)鍵字來聲明。 class Student public: Student(char* pName =no name); Student(); void PrintC() coutThe number of students is countendl; private: static int count; /若寫成count=0;則非法 char name20; ;,1.靜態(tài)數(shù)據(jù)成員,105,類的數(shù)據(jù)成員在類的每一個對象中分別存儲不同的數(shù)值,但是靜態(tài)數(shù)據(jù)成員則不同,它在整個類中只有一個拷貝,由該類的所有對
54、象共同維護和使用,從而實現(xiàn)了同一類的不同對象之間的數(shù)據(jù)共享。 Student a(“sun”),b(“l(fā)i”),c(“l(fā)iu”);,1.靜態(tài)數(shù)據(jù)成員,106,靜態(tài)數(shù)據(jù)成員具有靜態(tài)生存期。 在類的聲明中只能聲明靜態(tài)數(shù)據(jù)成員的存在。 由于類的聲明是抽象的,靜態(tài)數(shù)據(jù)成員的初始化需要在類的外部進(jìn)行,通過類名對它進(jìn)行訪問。 類名:標(biāo)識符 例:int Student:count =0;,1.靜態(tài)數(shù)據(jù)成員,107,例7.11:定義學(xué)生類,定義一個靜態(tài)數(shù)據(jù)成員count,用來統(tǒng)計學(xué)生的人數(shù)。,1.靜態(tài)數(shù)據(jù)成員,108,/例7.11:靜態(tài)數(shù)據(jù)成員的定義和使用 #include #include using na
55、mespace std; class Student public: Student(char* pName =no name); Student(); void PrintC() coutThe number of students is countendl; private: static int count; /若寫成count=0;則非法 char name20; ;,1.靜態(tài)數(shù)據(jù)成員,109,Student:Student(char* pName) cout create one studentn; strncpy(name, pName,20); name19=0; count+;
56、 /靜態(tài)成員:每創(chuàng)建一個對象,學(xué)生人數(shù)增1 Student:Student() cout destruct one studentn; count-; /每析構(gòu)一個對象,學(xué)生人數(shù)減1 coutThe number of students is countendl; ,1.靜態(tài)數(shù)據(jù)成員,110,int Student:count =0; /靜態(tài)數(shù)據(jù)成員在類外分配空間和初始化 void main() Student s1; s1.PrintC(); Student s2; s2.PrintC(); ,1.靜態(tài)數(shù)據(jù)成員,111,可以通過定義和使用靜態(tài)成員函數(shù)來訪問靜態(tài)數(shù)據(jù)成員。 所謂靜態(tài)成員函數(shù)就是
57、使用static關(guān)鍵字聲明函數(shù)成員。 同靜態(tài)數(shù)據(jù)成員一樣,靜態(tài)成員函數(shù)也屬整個類,由同一個類的所有對象共同維護,為這些對象所共享。,2.靜態(tài)成員函數(shù),112,靜態(tài)成員函數(shù)作為成員函數(shù),它的訪問屬性可以受到類的嚴(yán)格控制。 對公有靜態(tài)成員函數(shù),可以通過類名或?qū)ο竺麃碚{(diào)用; 而一般的非靜態(tài)公有成員函數(shù)只能通過對象名來調(diào)用。 靜態(tài)成員函數(shù)可以直接訪問該類的靜態(tài)數(shù)據(jù)成員和成員函數(shù);而訪問非靜態(tài)數(shù)據(jù)成員,必須通過參數(shù)傳遞方式得到對象名,然后通過對象名來訪問。,2.靜態(tài)成員函數(shù),113,可以將例7.11中的PrintC函數(shù)定義為靜態(tài)成員函數(shù): static void PrintC() coutThe num
58、ber of students is countendl; ,2.靜態(tài)成員函數(shù),114,在main函數(shù)中,就可以在創(chuàng)建任何對象前,訪問靜態(tài)數(shù)據(jù)成員count: void main() Student:PrintC(); /通過類名定義靜態(tài)成員函數(shù) Student s1; s1.PrintC(); Student s2; s2.PrintC(); ,2.靜態(tài)成員函數(shù),115,116,117,靜態(tài)成員函數(shù)與非靜態(tài)成員函數(shù)都是類的成員函數(shù),它們的區(qū)別為: 公有靜態(tài)成員函數(shù),可以通過類名或?qū)ο竺麃碚{(diào)用; 一般的非靜態(tài)公有成員函數(shù)只能通過對象名來調(diào)用。 靜態(tài)成員函數(shù)可以直接訪問該類的靜態(tài)數(shù)據(jù)成員和靜態(tài)函數(shù)成員;而訪問非靜態(tài)數(shù)據(jù)成員,必須通過參數(shù)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030葡萄酒釀造技術(shù)應(yīng)用行業(yè)供需現(xiàn)狀創(chuàng)新投入投資布局規(guī)劃
- 2025-2030葡萄牙酒莊行業(yè)市場需供矛盾分析投資發(fā)展?jié)摿σ?guī)劃分析研究
- 2025-2030葡萄牙葡萄酒產(chǎn)業(yè)發(fā)展現(xiàn)狀與品牌建設(shè)評估規(guī)劃分析報告
- 安川L7變頻器調(diào)試手冊
- ZR-3260自動煙塵煙氣綜合測試儀期間核查方案(試行)
- 2026年工商管理中級資格認(rèn)證筆試題目
- 2026年計算機專業(yè)從業(yè)考試復(fù)習(xí)資料信息技術(shù)安全與法規(guī)框架
- 2026年軟件測試工程師中級考試模擬題
- 2026年金融網(wǎng)絡(luò)安全攻防CISP認(rèn)證滲透測試要點精講
- ESG與央國企月度報告:11月純ESG策略超額收益5.01%
- 銀行資產(chǎn)池管理辦法
- 人音版七年級音樂上冊說課稿:2.4 藍(lán)色的探戈
- 武漢大學(xué)人民醫(yī)院心理援助熱線崗位招聘3人考試參考題庫附答案解析
- 2025職業(yè)暴露處理流程及應(yīng)急預(yù)案
- 知道智慧樹商業(yè)倫理與企業(yè)社會責(zé)任(山東財經(jīng)大學(xué))滿分測試答案
- 六年級語文上冊《1-8單元》課本重點句子附仿寫示范
- 2025中國鐵路濟南局集團有限公司招聘普通高校本科及以上學(xué)歷畢業(yè)筆試參考題庫附帶答案詳解(10套)
- 外場工地施工管理辦法
- 國家中醫(yī)藥管理局《中醫(yī)藥事業(yè)發(fā)展“十五五”規(guī)劃》全文
- 全屋智能銷售培訓(xùn)
- 英語詞根詞綴記憶大全(適合高中及大一英語)
評論
0/150
提交評論