




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、計(jì)算機(jī)學(xué)院 計(jì)算機(jī)網(wǎng)絡(luò)與信息安全研究室 張榮博 Shenyang Aerospace University1第四章第四章 類與對(duì)象類與對(duì)象4.1 面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn)面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn)4.2 類和對(duì)象類和對(duì)象( )4.3 構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)()4.4 類的組合類的組合()Shenyang Aerospace University2回顧:面向過程的設(shè)計(jì)方法 重點(diǎn):l如何實(shí)現(xiàn)細(xì)節(jié)過程,將數(shù)據(jù)與函數(shù)分開。 形式:l主模塊+若干個(gè)子模塊(main( )+子函數(shù))。 特點(diǎn):l自頂向下,逐步求精功能分解。 缺點(diǎn):l效率低,程序的可重用性差。Shenyang Aerospac
2、e University3面向?qū)ο蟮姆椒?目的:l實(shí)現(xiàn)軟件設(shè)計(jì)的產(chǎn)業(yè)化。 觀點(diǎn):l自然界是由實(shí)體(對(duì)象)所組成。 程序設(shè)計(jì)方法:l使用面向?qū)ο蟮挠^點(diǎn)來描述模仿并處理現(xiàn)實(shí)問題。 要求:l高度概括、分類、和抽象。Shenyang Aerospace University4抽象 先注意問題的本質(zhì)及描述,其次是實(shí)現(xiàn)過程或細(xì)節(jié)。先注意問題的本質(zhì)及描述,其次是實(shí)現(xiàn)過程或細(xì)節(jié)。l數(shù)據(jù)抽象:描述某類對(duì)象的屬性或狀態(tài)(對(duì)象相互區(qū)別的物理量)。l行為抽象:描述某類對(duì)象的共有的行為特征或具有的功能。 抽象的實(shí)現(xiàn):通過類的聲明抽象的實(shí)現(xiàn):通過類的聲明抽象是對(duì)具體對(duì)象(問題)進(jìn)行概括,抽出這一類對(duì)象的公共性質(zhì)并加以描述
3、的過程。Shenyang Aerospace University5抽象實(shí)例鐘表 數(shù)據(jù)抽象:int Hourint Minute int Second 行為抽象:SetTime( )ShowTime( )Shenyang Aerospace University6自行車抽象抽象Shenyang Aerospace University7 人事檔案屬性:姓名、身份證號(hào)、工作經(jīng)歷等。處理:分類、檢索、修改、插入記錄、刪除記錄等 數(shù)據(jù)結(jié)構(gòu)中的“圖”屬性:數(shù)據(jù)數(shù)組,有向圖或無向圖。處理:遍歷;求兩點(diǎn)之間的最短路徑;求關(guān)鍵路徑等Shenyang Aerospace University8抽象實(shí)例人數(shù)據(jù)抽
4、象:數(shù)據(jù)抽象:char *name, char *sex, int age, int id行為抽象:行為抽象:生物屬性角度:生物屬性角度:GetCloth( ), Eat( ), Step( ),社會(huì)屬性角度:社會(huì)屬性角度:Work( ), Promote( ) ,注意注意:同一問題可能有不同的抽象結(jié)果同一問題可能有不同的抽象結(jié)果根據(jù)解決問題的要求不根據(jù)解決問題的要求不同,產(chǎn)生的抽象成員可能不同。同,產(chǎn)生的抽象成員可能不同。Shenyang Aerospace University9簡(jiǎn)單的圖書館管理系統(tǒng)簡(jiǎn)單的圖書館管理系統(tǒng)系統(tǒng)功能需求系統(tǒng)功能需求l借閱者可以通過網(wǎng)絡(luò)查詢書籍信息和預(yù)訂書籍借閱者
5、可以通過網(wǎng)絡(luò)查詢書籍信息和預(yù)訂書籍l借閱者能夠借閱和還書借閱者能夠借閱和還書l圖書管理員能夠處理借閱者的借閱和還書請(qǐng)求圖書管理員能夠處理借閱者的借閱和還書請(qǐng)求l系統(tǒng)管理員可以對(duì)系統(tǒng)的數(shù)據(jù)進(jìn)行維護(hù),如增加、系統(tǒng)管理員可以對(duì)系統(tǒng)的數(shù)據(jù)進(jìn)行維護(hù),如增加、刪除、更改書目,增加、刪除和更新借閱者帳戶,刪除、更改書目,增加、刪除和更新借閱者帳戶,增加和刪除書籍。增加和刪除書籍。 Shenyang Aerospace University10 讀者(借閱者)l登錄系統(tǒng)l查詢自己的借閱信息l查詢書籍信息l預(yù)訂書籍l借閱書籍l歸還書籍 圖書管理員l處理書籍借閱l處理書籍歸還l刪除預(yù)訂信息 系統(tǒng)維護(hù)者l查詢讀者信
6、息l查詢書籍信息l增加數(shù)目l刪除或更新數(shù)目l增加書籍l刪除書籍l添加讀者帳號(hào)l刪除或更新讀者帳號(hào)Shenyang Aerospace University11 讀者屬性:借閱者帳號(hào)、姓名、班級(jí)、系別、所屬性:借閱者帳號(hào)、姓名、班級(jí)、系別、所借書目等借書目等操作:預(yù)訂書籍、借書操作:預(yù)訂書籍、借書 和還書。和還書。 圖書管理員、系統(tǒng)維護(hù)員帳號(hào)帳號(hào)姓名姓名權(quán)限權(quán)限Shenyang Aerospace University12 其它的類 l記錄書目信息的類(Title):包括書籍的名字(BookName)、作者(author)、ISSBN號(hào),此書籍的總數(shù)量(totle_number)、借出數(shù)量,是否
7、允許借出等屬性。l書籍類(Book):書號(hào)、操作包括預(yù)訂(reserve)、按數(shù)目查詢等。l借閱信息類(loan):包括所借圖書的ISBN編號(hào)、借閱時(shí)間等。l預(yù)訂信息類(Reservation):每個(gè)預(yù)訂信息的日期、書籍的ISBN、預(yù)訂用戶ID等。Shenyang Aerospace University13封裝l目的是曾強(qiáng)安全性和簡(jiǎn)化編程,使用者不必了解具體的實(shí)現(xiàn)細(xì)節(jié),而只需要通過外部接口,以特定的訪問權(quán)限,來使用類的成員。l實(shí)現(xiàn)封裝:類聲明中的 將抽象出的數(shù)據(jù)成員、函數(shù)成員相結(jié)合,將它們視將抽象出的數(shù)據(jù)成員、函數(shù)成員相結(jié)合,將它們視為一個(gè)整體。為一個(gè)整體。Shenyang Aerospac
8、e University14 實(shí)例: classclass ClockClock publicpublic: :void SetTime(int NewH,int NewM,int NewS );void SetTime(int NewH,int NewM,int NewS );void ShowTime( );void ShowTime( );privateprivate: : int Hour,Minute,Second; int Hour,Minute,Second;邊界邊界外部接口外部接口特定的訪問權(quán)限特定的訪問權(quán)限封裝實(shí)例鐘表類Shenyang Aerospace Universit
9、y15繼承與派生是C+中支持層次分類的一種機(jī)制,允許程序員在保持原有類特性的基礎(chǔ)上,進(jìn)行更具體的說明。實(shí)現(xiàn):聲明派生類見第7章Shenyang Aerospace University16多態(tài)性 多態(tài):同一名稱,不同的功能實(shí)現(xiàn)方式。 目的:達(dá)到行為標(biāo)識(shí)統(tǒng)一,減少程序中標(biāo)識(shí)符的個(gè)數(shù)。 實(shí)現(xiàn):重載函數(shù)和虛函數(shù)見第8章Shenyang Aerospace University17c+中的類 類是具有相同屬性和行為的一組對(duì)象的集合,它為屬于該類的全部對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個(gè)主要部分。 利用類可以實(shí)現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。 利用類易于編寫大型復(fù)雜程序,其模塊化程度比C中
10、采用函數(shù)更高。Shenyang Aerospace University18類的聲明形式 類是一種用戶自定義類型,聲明形式:類是一種用戶自定義類型,聲明形式:class 類名稱類名稱 public: 公有成員(外部接口)公有成員(外部接口) private: 私有成員私有成員 protected: 保護(hù)型成員保護(hù)型成員;Shenyang Aerospace University19類成員的訪問控制公有成員在關(guān)鍵字public后面聲明,它們是類與外部的接口,任何外部函數(shù)都可以訪問公有類型數(shù)據(jù)和函數(shù)。class 類名稱 public: 公有成員 private: 私有成員 protected: 保
11、護(hù)型成員;Shenyang Aerospace University20私有成員在關(guān)鍵字private后面聲明,只允許本類中的函數(shù)訪問,而類外部的任何函數(shù)都不能訪問。如果緊跟在類名稱的后面聲明私有成員,則關(guān)鍵字private可以省略。class 類名稱 public: 公有成員 private: 私有成員 protected: 保護(hù)型成員;Shenyang Aerospace University21保護(hù)類型與private類似,其差別表現(xiàn)在繼承與派生時(shí)對(duì)派生類的影響不同,第七章講。class 類名稱 public: 公有成員 private: 私有成員 protected: 保護(hù)型成員;Sh
12、enyang Aerospace University22類的成員class Clock public: void SetTime(int NewH, int NewM, int NewS); void ShowTime( ); private: int Hour, Minute, Second;成員數(shù)據(jù)成員數(shù)據(jù)成員函數(shù)成員函數(shù)Shenyang Aerospace University23類的成員數(shù)據(jù)成員 與一般的變量聲明相同,但需要將它放在類的聲與一般的變量聲明相同,但需要將它放在類的聲明體中。明體中。class Clock public: void SetTime(int H, int M
13、, int S); void ShowTime( ); private: int Hour, Minute, Second;Shenyang Aerospace University24類的成員成員函數(shù) 通常在類中說明原形,在類外給出函數(shù)體實(shí)現(xiàn),并在函數(shù)名前使用類名加以限定。 也可以直接在類中給出函數(shù)體,形成內(nèi)聯(lián)成員函數(shù)。 允許聲明重載函數(shù)和帶缺省形參值的函數(shù)Shenyang Aerospace University25class Clock public: void SetTime(int H, int M, int S); void ShowTime( ); private: int Ho
14、ur, Minute, Second;Shenyang Aerospace University26void Clock : SetTime(int NewH, int NewM, int NewS) Hour=NewH; Minute=NewM; Second=NewS;void Clock : ShowTime( ) coutHour:Minute:成員名”方式訪問public屬性的成員Shenyang Aerospace University38#includeusing namespace std;class Clock ./類的聲明略類的聲明略/.類的實(shí)現(xiàn)略類的實(shí)現(xiàn)略int main
15、() Clock myClock; myClock . SetTime(8,30,30); myClock . ShowTime();Shenyang Aerospace University39#includeclass Clock public: void SetTime(int H, int M, int S); void ShowTime( );private: int Hour, Minute, Second; ;void clock:SetTime(int H, int M, int S) Hour = H; Minute = m; Second = S; /類中成員互訪類中成員互
16、訪,直接使用成員名直接使用成員名void main(void) Clock myClock ,*pClock; myClock.SetTime(8,30,30);/使用使用“對(duì)象名對(duì)象名.成員名成員名”方式訪問方式訪問 public 屬屬性的成員性的成員 pClock = &myClock;myClock-ShowTime(); /使用使用“對(duì)象指針對(duì)象指針-成員名成員名”方式訪問方式訪問 public 屬性的成員屬性的成員類中成員的訪問舉例Shenyang Aerospace University40在成員函數(shù)中訪問成員與this指針# include Using namespace std
17、;class type public : void set ( int a , int b ) x = a ; y = b; ;/ 類中訪問成員不指定對(duì)象類中訪問成員不指定對(duì)象 void print ( ) cout x “,” y endl ; ; private : int x , y ; ;void main ( ) type t1 , t2 ; t1 . set (10 , 20 ) ; t1 . print ( ) ; t2 . set ( 30 , 40 ) ; t2 . print ( ) ;t1 的成員的成員?t2 的成員的成員?Shenyang Aerospace Unive
18、rsity41 C+為成員函數(shù)提供了一個(gè)隱含參數(shù)為成員函數(shù)提供了一個(gè)隱含參數(shù) this 指針指針 當(dāng)一個(gè)類的對(duì)象被創(chuàng)建時(shí),當(dāng)一個(gè)類的對(duì)象被創(chuàng)建時(shí),this 指針就被初始化指向該指針就被初始化指向該對(duì)象對(duì)象 this 是一個(gè)隱含指針,不能被顯式說明是一個(gè)隱含指針,不能被顯式說明 this 是一個(gè)局部量,局部于某一對(duì)象,在任何非靜態(tài)成是一個(gè)局部量,局部于某一對(duì)象,在任何非靜態(tài)成員內(nèi)可見員內(nèi)可見 this 是一個(gè)常指針,不能被修改和賦值是一個(gè)常指針,不能被修改和賦值Shenyang Aerospace University42# include Using namespace std;class t
19、ype public : void set ( int a , int b ) x = a ; y = b; ;/ 類中訪問成員不指定對(duì)象類中訪問成員不指定對(duì)象 void print ( ) cout x “,” y endl ; ; private : int x , y ; ;void main ( ) type t1 , t2 ; t1 . set (10 , 20 ) ; t1 . print ( ) ; t2 . set ( 30 , 40 ) ; t2 . print ( ) ;Shenyang Aerospace University43# include Using names
20、pace std;class type public : void set ( int a , int b ) x = a ; y = b; ;/ 類中訪問成員不指定對(duì)象類中訪問成員不指定對(duì)象 void print ( ) cout x “,” y x = a ; this - y = b ; ; void print ( ) cout x “ , ” y endl ; ; Shenyang Aerospace University45構(gòu)造函數(shù)與析構(gòu)函數(shù)構(gòu)造函數(shù)與析構(gòu)函數(shù)Shenyang Aerospace University46C+中對(duì)象成員賦值的方法class A private: in
21、t x, y; public: int z; void set( int xx, int yy ) x = xx ; y=yy ; ;void main() A a; a . z = 10; a . x = 1; a . y = 2; a . set(1,2); /ok , z為公有成員為公有成員/error, x 為私有成員為私有成員/error, x 為私有成員為私有成員/ok set 為公有成員。為公有成員。Shenyang Aerospace University47普通變量的初始化:普通變量的初始化:float pi = 3.1415;int a3 = 1, 2, 3 ;struct
22、 Saving int No; float Money;Saving A=1,20;Saving B=2,23.5類對(duì)象是否也能像普通變量一樣類對(duì)象是否也能像普通變量一樣賦值呢?例如:賦值呢?例如:class Point float x; float y; 可以通過下面的形式初始化:可以通過下面的形式初始化:Point A=1,20;或或 Point B=(1,2);由于類具有封裝性,不能對(duì)私有變量直接進(jìn)行賦值!由于類具有封裝性,不能對(duì)私有變量直接進(jìn)行賦值!構(gòu)造函數(shù)構(gòu)造函數(shù) 是在對(duì)象創(chuàng)建時(shí)使用特定的值構(gòu)造對(duì)象,或者說是是在對(duì)象創(chuàng)建時(shí)使用特定的值構(gòu)造對(duì)象,或者說是將對(duì)象將對(duì)象初始化初始化為一個(gè)特
23、定的狀態(tài)。為一個(gè)特定的狀態(tài)。class Point public: Point(); int GetX(); int GetY(); private: int X= 0, Y= 0 ; ;Shenyang Aerospace University48構(gòu)造函數(shù)n 構(gòu)造函數(shù)的作用是在對(duì)象被創(chuàng)建時(shí)使用特定的值構(gòu)構(gòu)造函數(shù)的作用是在對(duì)象被創(chuàng)建時(shí)使用特定的值構(gòu)造對(duì)象,或者說將對(duì)象造對(duì)象,或者說將對(duì)象初始化初始化為一個(gè)特定的狀態(tài)。為一個(gè)特定的狀態(tài)。n 在對(duì)象創(chuàng)建時(shí)在對(duì)象創(chuàng)建時(shí)由系統(tǒng)自動(dòng)調(diào)用由系統(tǒng)自動(dòng)調(diào)用。n 如果程序中未聲明,則系統(tǒng)自動(dòng)產(chǎn)生出一個(gè)如果程序中未聲明,則系統(tǒng)自動(dòng)產(chǎn)生出一個(gè)默認(rèn)形默認(rèn)形式式的構(gòu)造函
24、數(shù)。的構(gòu)造函數(shù)。n 允許為允許為內(nèi)聯(lián)內(nèi)聯(lián)函數(shù)、函數(shù)、重載重載函數(shù)、函數(shù)、帶默認(rèn)形參值帶默認(rèn)形參值的函數(shù)。的函數(shù)。Shenyang Aerospace University49說明 構(gòu)造函數(shù)名與類名相同。構(gòu)造函數(shù)名與類名相同。 一個(gè)類可以擁有多個(gè)構(gòu)造函數(shù)(重載)。一個(gè)類可以擁有多個(gè)構(gòu)造函數(shù)(重載)。Shenyang Aerospace University50class Clockclass Clock public:public:Clock();/Clock();/構(gòu)造函數(shù)構(gòu)造函數(shù)void SetTime(int NewH,int NewM,int NewS);void SetTime(int
25、 NewH,int NewM,int NewS);void ShowTime();void ShowTime();private:private:int Hour,Minute,Second;int Hour,Minute,Second;Shenyang Aerospace University51構(gòu)造函數(shù)的實(shí)現(xiàn):構(gòu)造函數(shù)的實(shí)現(xiàn):Clock:ClockClock:Clock() ) Hour= 0;Hour= 0;Minute= 0;Minute= 0;Second= 0;Second= 0; 建立對(duì)象時(shí)構(gòu)造函數(shù)的作用:建立對(duì)象時(shí)構(gòu)造函數(shù)的作用:int main()int main() Clo
26、ck c;Clock c; /隱含調(diào)用構(gòu)造函數(shù),將初始值作為實(shí)參。隱含調(diào)用構(gòu)造函數(shù),將初始值作為實(shí)參。 c.ShowTime();c.ShowTime(); Shenyang Aerospace University52#includeusing namespace std;class Point public: Point(int xx, int yy);/ 帶參數(shù)的帶參數(shù)的構(gòu)造函數(shù)構(gòu)造函數(shù) int GetX(); int GetY(); private: int X, Y;Point:Point(int xx, int yy) / 初始化數(shù)據(jù)成員初始化數(shù)據(jù)成員 X=xx; Y=yy; co
27、utConstructor called.endl; Point:Point() coutDestructor called.endl; int Point:GetX() return X; int Point:GetY() return Y; void main() Point A(10,20); / 構(gòu)造函數(shù)被調(diào)用構(gòu)造函數(shù)被調(diào)用 coutA.GetX(),A.GetY()endl; / 析構(gòu)函數(shù)被調(diào)用析構(gòu)函數(shù)被調(diào)用帶參數(shù)的構(gòu)造函數(shù)Shenyang Aerospace University53/exp#includeclass Point public: / 構(gòu)造函數(shù) Point();/ 析
28、構(gòu)函數(shù) int GetX(); int GetY(); private: int X, Y;Point:Point(int xx, int yy) X=xx; Y=yy; coutConstructor called.endl; Point:Point() coutDestructor called.endl; int Point:GetX() return X; int Point:GetY() return Y; void main() ;/ 構(gòu)造函數(shù)被調(diào)用 coutA.GetX(),A.GetY()endl;/ 析構(gòu)函數(shù)被調(diào)用注意:注意: 構(gòu)造函數(shù)的參數(shù)個(gè)數(shù)和類型規(guī)定了聲明一個(gè)對(duì)象時(shí),為
29、構(gòu)造函數(shù)的參數(shù)個(gè)數(shù)和類型規(guī)定了聲明一個(gè)對(duì)象時(shí),為對(duì)這個(gè)對(duì)象進(jìn)行初始化所需要的初始值的個(gè)數(shù)和類型。對(duì)這個(gè)對(duì)象進(jìn)行初始化所需要的初始值的個(gè)數(shù)和類型。例如:例如: Point A (100, 200) ;/ OKPoint B (10) ;/ errorPoint A ;/ error 若有多個(gè)重載構(gòu)造函數(shù),系統(tǒng)自動(dòng)尋找匹配若有多個(gè)重載構(gòu)造函數(shù),系統(tǒng)自動(dòng)尋找匹配Shenyang Aerospace University54 p 與一般函數(shù)一樣,與一般函數(shù)一樣,C+C+允許重載構(gòu)造函數(shù)。允許重載構(gòu)造函數(shù)。p 若類若類 X X 具有一個(gè)或多個(gè)構(gòu)造函數(shù),創(chuàng)建具有一個(gè)或多個(gè)構(gòu)造函數(shù),創(chuàng)建類類 X X 的對(duì)象
30、時(shí),的對(duì)象時(shí),C+C+會(huì)根據(jù)參數(shù)選擇調(diào)用會(huì)根據(jù)參數(shù)選擇調(diào)用其中一個(gè)。其中一個(gè)。Shenyang Aerospace University55/ 不同構(gòu)造函數(shù)的匹配不同構(gòu)造函數(shù)的匹配class Date public: Date(); Date(int d); Date(int m, int d); Date(int m, int d, int y); void print(); protected: int month; int day; int year;void Date:print() cout month / day / year endl ; Shenyang Aerospace U
31、niversity56Date : Date() month = 10 ; day = 1; year = 2000 ; print(); Date : Date ( int d ) month = 10 ; day = d ; year = 2000 ; print();Date : Date ( int m, int d ) month = m ; day = d; year = 2000 ; print();Date : Date ( int m, int d, int y ) month=m; day=d; year=y; print();void main ( ) Date aday
32、 ; Date bday ( 5 ) ; Date cday ( 2, 12 ) ; Date dday ( 1, 2, 1998 ) ; 10/1/2000 10/ 5/2000 2/12/2000 1/2/1998 Shenyang Aerospace University57默認(rèn)參數(shù)的構(gòu)造函數(shù)n在構(gòu)造函數(shù)中允許指定函數(shù)參數(shù)的默認(rèn)值,這在構(gòu)造函數(shù)中允許指定函數(shù)參數(shù)的默認(rèn)值,這些默認(rèn)值在函數(shù)調(diào)用者不確定參數(shù)時(shí)可以作為些默認(rèn)值在函數(shù)調(diào)用者不確定參數(shù)時(shí)可以作為參數(shù)來使用。參數(shù)來使用。n對(duì)于所有參數(shù)都定義了默認(rèn)值的構(gòu)造函數(shù),當(dāng)對(duì)于所有參數(shù)都定義了默認(rèn)值的構(gòu)造函數(shù),當(dāng)它被調(diào)用時(shí),允許改變傳遞參數(shù)的個(gè)
33、數(shù)。它被調(diào)用時(shí),允許改變傳遞參數(shù)的個(gè)數(shù)。如下如下例:例:Shenyang Aerospace University58 #include using namespace std; class Point private: int x,y; public:Point(int vx=0,int vy=0 ); /聲明缺省參數(shù)的構(gòu)造函數(shù)聲明缺省參數(shù)的構(gòu)造函數(shù) void print() coutx= x; y= yendl; ; Shenyang Aerospace University59Point:Point(int vx,int vy) x=vx ; y=vy; /用傳遞來的參數(shù)對(duì)私有變量用傳遞
34、來的參數(shù)對(duì)私有變量x,y賦初值賦初值 coutConstruct is called!endl;void main() Point p1(10,10);/傳兩參數(shù)傳兩參數(shù) p1.print(); Point p2; /不傳參數(shù)取缺省值不傳參數(shù)取缺省值 p2.print(); Point p3(5); /傳一個(gè)參數(shù),第二個(gè)用缺省值傳一個(gè)參數(shù),第二個(gè)用缺省值 p3.print(); Construct is called!x= 10; y= 10Construct is called!x= 0; y= 0Construct is called!x= 5; y= 0 50對(duì)象對(duì)象p31010對(duì)象對(duì)象
35、p100對(duì)象對(duì)象p2Shenyang Aerospace University60#includeusing namespace std;class Pointprivate: int x,y;public: Point(); /聲明無參數(shù)的構(gòu)造函聲明無參數(shù)的構(gòu)造函數(shù)數(shù) /聲明帶聲明帶2個(gè)參數(shù)的構(gòu)造函數(shù)個(gè)參數(shù)的構(gòu)造函數(shù) Point(int vx=2,int vy=2 ); void print() coutx= x ; y= yendl; ;Point:Point() x=0;y=0; coutConstruct0 is called! “ endl;Point:Point(int vx,in
36、t vy) /用傳遞來的參數(shù)對(duì)私有變量用傳遞來的參數(shù)對(duì)私有變量x,y賦初值賦初值 x=vx ; y=vy; coutConstruct2 is called!“ endl;void main() Point p; p.print();Shenyang Aerospace University61 對(duì)象對(duì)象p在定義過程中,沒有傳遞參數(shù),此時(shí)有兩在定義過程中,沒有傳遞參數(shù),此時(shí)有兩種可能:第一是在創(chuàng)建對(duì)象時(shí)調(diào)用不帶參數(shù)的構(gòu)種可能:第一是在創(chuàng)建對(duì)象時(shí)調(diào)用不帶參數(shù)的構(gòu)造函數(shù)造函數(shù)Point()來對(duì)對(duì)象初始化;另一種是在創(chuàng)建來對(duì)對(duì)象初始化;另一種是在創(chuàng)建對(duì)象時(shí)調(diào)用帶缺省參數(shù)的構(gòu)造函數(shù)對(duì)象時(shí)調(diào)用帶缺省參數(shù)
37、的構(gòu)造函數(shù)Point(int vx=2,int vy=2)來初始化對(duì)象。來初始化對(duì)象。這兩種情況的存這兩種情況的存在使系統(tǒng)無法確定到底調(diào)用哪個(gè)構(gòu)造函數(shù),這就在使系統(tǒng)無法確定到底調(diào)用哪個(gè)構(gòu)造函數(shù),這就出現(xiàn)了二義性。編譯將不能通過。出現(xiàn)了二義性。編譯將不能通過。Shenyang Aerospace University62拷貝構(gòu)造函數(shù) 拷貝初始化構(gòu)造函數(shù)是一種特殊的成員函數(shù)??截惓跏蓟瘶?gòu)造函數(shù)是一種特殊的成員函數(shù)。 功能:用一個(gè)已知的對(duì)象來初始化一個(gè)被創(chuàng)建的同類功能:用一個(gè)已知的對(duì)象來初始化一個(gè)被創(chuàng)建的同類的對(duì)象。拷貝初始化構(gòu)造函數(shù)實(shí)際上也是構(gòu)造函數(shù)。的對(duì)象??截惓跏蓟瘶?gòu)造函數(shù)實(shí)際上也是構(gòu)造函數(shù)。
38、 特點(diǎn):特點(diǎn): 1 1、函數(shù)名與類同名,該函數(shù)沒有返回類型;、函數(shù)名與類同名,該函數(shù)沒有返回類型; 2 2、函數(shù)只有一個(gè)參數(shù),且是對(duì)類對(duì)象的引用;、函數(shù)只有一個(gè)參數(shù),且是對(duì)類對(duì)象的引用; 3 3、每個(gè)類都必須有一個(gè)拷貝構(gòu)造函數(shù)。、每個(gè)類都必須有一個(gè)拷貝構(gòu)造函數(shù)。n如果類中沒有說明拷貝構(gòu)造函數(shù),則編譯系統(tǒng)自動(dòng)生如果類中沒有說明拷貝構(gòu)造函數(shù),則編譯系統(tǒng)自動(dòng)生成一個(gè)缺省拷貝構(gòu)造函數(shù)。作為該類的公有成員。成一個(gè)缺省拷貝構(gòu)造函數(shù)。作為該類的公有成員。Shenyang Aerospace University63q格式:格式: class 類名 public : 類名(形參);/構(gòu)造函數(shù) 類名(類名 &對(duì)
39、象名);/拷貝構(gòu)造函數(shù) .;類名:類(類名 &對(duì)象名)/拷貝構(gòu)造函數(shù)的實(shí)現(xiàn) 函數(shù)體 Shenyang Aerospace University64#includeusing namespace std;class Pointprivate: int x,y;public:Point(int vx,int vy)x=vx ; y=vy; Point(const Point & p) x = p.x; y = p.y; Point() ;void main() Point p1(10,20); Point p2(p1);1020對(duì)象對(duì)象p11020對(duì)象對(duì)象p2Shenyang Aerospace
40、University65調(diào)用拷貝構(gòu)造函數(shù)的時(shí)機(jī)-1當(dāng)用類的一個(gè)對(duì)象去初始化該類的另一個(gè)對(duì)象時(shí)系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù)實(shí)現(xiàn)拷貝賦值。int main()int main() Point A(1,2); Point A(1,2); Point B(A); / Point B(A); /拷貝構(gòu)造函數(shù)被調(diào)用拷貝構(gòu)造函數(shù)被調(diào)用 Point C=APoint C=A; /拷貝構(gòu)造函數(shù)被調(diào)用拷貝構(gòu)造函數(shù)被調(diào)用 coutB.GetX()endl;coutB.GetX()endl; Shenyang Aerospace University66調(diào)用拷貝構(gòu)造函數(shù)的時(shí)機(jī)-2 若函數(shù)的形參為類對(duì)象,調(diào)用函數(shù)時(shí),實(shí)參賦
41、值給形參,系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù)。void fun1(Point p)void fun1(Point p) coutp.GetX()endl; coutp.GetX()endl; int main()int main() Point A(1,2); Point A(1,2); fun1(A); / fun1(A); /調(diào)用拷貝構(gòu)造函數(shù)調(diào)用拷貝構(gòu)造函數(shù) Shenyang Aerospace University67調(diào)用拷貝構(gòu)造函數(shù)的時(shí)機(jī)-3 當(dāng)函數(shù)的返回值是類對(duì)象時(shí),系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù)。Point fun2()Point fun2() Point A(1,2); Point A(1,2)
42、; return A; / return A; /調(diào)用拷貝構(gòu)造函數(shù)調(diào)用拷貝構(gòu)造函數(shù) int main()int main() Point B; Point B; B=fun2(); B=fun2(); Shenyang Aerospace University68默認(rèn)的拷貝構(gòu)造函數(shù)q 如果程序員沒有為類聲明拷貝初始化構(gòu)造函數(shù),如果程序員沒有為類聲明拷貝初始化構(gòu)造函數(shù),則編譯器自己生成一個(gè)默認(rèn)的拷貝構(gòu)造函數(shù)。則編譯器自己生成一個(gè)默認(rèn)的拷貝構(gòu)造函數(shù)。q 這個(gè)構(gòu)造函數(shù)執(zhí)行的功能是:用作為初始值的這個(gè)構(gòu)造函數(shù)執(zhí)行的功能是:用作為初始值的對(duì)象的每個(gè)數(shù)據(jù)成員的值,初始化將要建立的對(duì)對(duì)象的每個(gè)數(shù)據(jù)成員的值,
43、初始化將要建立的對(duì)象的對(duì)應(yīng)數(shù)據(jù)成員。象的對(duì)應(yīng)數(shù)據(jù)成員。Shenyang Aerospace University69析構(gòu)函數(shù)Shenyang Aerospace University70#includeusing namespace std;class Pointprivate: int x,y;public: Point();/構(gòu)造函數(shù)聲明構(gòu)造函數(shù)聲明Point();/析構(gòu)函數(shù)聲明析構(gòu)函數(shù)聲明void print()coutx= x;y= yendl;Point:Point() /構(gòu)造函數(shù)定義構(gòu)造函數(shù)定義x=0;y=1;coutConstruct is called!endl;Point:P
44、oint() /析構(gòu)函數(shù)定義析構(gòu)函數(shù)定義 coutDestruct is called! endl;void fun()cout對(duì)象對(duì)象p1:;Point p1; p1.print();void main() fun();cout對(duì)象對(duì)象p2:;Point p2;p2.print(); 01對(duì)象對(duì)象p101對(duì)象對(duì)象p2對(duì)象對(duì)象p1:Construct is called!x= 0; y= 1Destruct is called!對(duì)象對(duì)象p2:Construct is called!x= 0; y= 1Destruct is called!Shenyang Aerospace Universit
45、y71組合的概念 描述的是一個(gè)類內(nèi)嵌其他類的對(duì)象作為成員的情況,描述的是一個(gè)類內(nèi)嵌其他類的對(duì)象作為成員的情況,它們之間的關(guān)系是一種包含與被包含的關(guān)系,常被稱它們之間的關(guān)系是一種包含與被包含的關(guān)系,常被稱作組合關(guān)系作組合關(guān)系計(jì)算機(jī)系統(tǒng)軟件系統(tǒng)硬件系統(tǒng)應(yīng)用軟件系統(tǒng)軟件cpu存儲(chǔ)器輸入輸出設(shè)備Shenyang Aerospace University72class Pointint x;int y;public:Point();Point();void print();class CirclePoint centre;double radius;public:Circle(double);Circl
46、e();void print();C+中組合關(guān)系的表示Shenyang Aerospace University73類組合的構(gòu)造函數(shù)設(shè)計(jì)當(dāng)創(chuàng)建類的對(duì)象時(shí),如果這個(gè)類具有內(nèi)嵌對(duì)當(dāng)創(chuàng)建類的對(duì)象時(shí),如果這個(gè)類具有內(nèi)嵌對(duì)象成員,那么各個(gè)內(nèi)嵌對(duì)象將首先被自動(dòng)創(chuàng)象成員,那么各個(gè)內(nèi)嵌對(duì)象將首先被自動(dòng)創(chuàng)建。建。在創(chuàng)建對(duì)象時(shí),既要對(duì)本類的數(shù)據(jù)成員進(jìn)行在創(chuàng)建對(duì)象時(shí),既要對(duì)本類的數(shù)據(jù)成員進(jìn)行初始化,又要對(duì)內(nèi)嵌對(duì)象成員進(jìn)行初始化。初始化,又要對(duì)內(nèi)嵌對(duì)象成員進(jìn)行初始化。Shenyang Aerospace University74#includeusing namespace std;class Pointint x;
47、int y;public:Point() x=10; y=12; cout構(gòu)造點(diǎn)構(gòu)造點(diǎn):10-12; ; Point() cout析構(gòu)點(diǎn)析構(gòu)點(diǎn):x-yendl; void print() cout坐標(biāo)坐標(biāo):x-yendl;內(nèi)嵌對(duì)象被自動(dòng)創(chuàng)建的過程Shenyang Aerospace University75class Circle Point centre; double radius;public: Circle(double vr) coutn構(gòu)造圓構(gòu)造圓:構(gòu)造半徑構(gòu)造半徑 vrn; radius=vr; Circle() cout析構(gòu)圓析構(gòu)圓:析構(gòu)半徑析構(gòu)半徑 radiusn; void
48、 print ()centre.print();cout半徑半徑=radiusendl; ;void main() Circle c(4.3); c.print();1020對(duì)象對(duì)象c類成員類成員4.3構(gòu)造點(diǎn)構(gòu)造點(diǎn):10-12;:10-12;構(gòu)造圓構(gòu)造圓: :構(gòu)造半徑構(gòu)造半徑 4.34.3坐標(biāo)坐標(biāo):10-12:10-12半徑半徑=4.3=4.3析構(gòu)圓析構(gòu)圓: :析構(gòu)半徑析構(gòu)半徑 4.34.3析構(gòu)點(diǎn)析構(gòu)點(diǎn):10-12:10-12Shenyang Aerospace University76在創(chuàng)建對(duì)象時(shí),既要對(duì)本類的數(shù)據(jù)成員進(jìn)行在創(chuàng)建對(duì)象時(shí),既要對(duì)本類的數(shù)據(jù)成員進(jìn)行初始化,又要對(duì)內(nèi)嵌對(duì)象成員進(jìn)行初
49、始化。初始化,又要對(duì)內(nèi)嵌對(duì)象成員進(jìn)行初始化。class CirclePoint centre;double radius;public:Circle(int,int,double);Circle();void print();class Pointint x;int y;public:Point(int ,int );Point();void print();Shenyang Aerospace University77class CirclePoint centre; double radius;public:Circle(int,int,double);Circle()cout析構(gòu)圓析構(gòu)圓
50、:析構(gòu)半徑析構(gòu)半徑 radiusn;void print();Circle:Circle(int vvx,int vvy,double vr) : centre(vvx,vvy)coutn構(gòu)造圓構(gòu)造圓:構(gòu)造半徑構(gòu)造半徑 vr; ;radius=vr;void Circle:print()centre.print();cout半徑半徑=radiusendl;void main()Circle c(2,2,4.3); c.print();22對(duì)象對(duì)象c類成員類成員4.3構(gòu)造點(diǎn)構(gòu)造點(diǎn):2-2;:2-2;構(gòu)造圓構(gòu)造圓: :構(gòu)造半徑構(gòu)造半徑 4.3; 4.3; 坐標(biāo)坐標(biāo):2-2:2-2半徑半徑=4.3=
51、4.3析構(gòu)圓析構(gòu)圓: :析構(gòu)半徑析構(gòu)半徑 4.34.3析構(gòu)點(diǎn)析構(gòu)點(diǎn):2-2:2-2內(nèi)嵌對(duì)象的初始化Shenyang Aerospace University78q冒號(hào)語(yǔ)法初始化常量成員和引用數(shù)據(jù)成員冒號(hào)語(yǔ)法初始化常量成員和引用數(shù)據(jù)成員class Expe public: Expe (int& i) : ten(10) , refI(i) protected:const int ten;int& refI;冒號(hào)語(yǔ)法應(yīng)用擴(kuò)展Shenyang Aerospace University79 構(gòu)造函數(shù)調(diào)用順序:構(gòu)造函數(shù)調(diào)用順序:l先先調(diào)用內(nèi)嵌對(duì)象的構(gòu)造函數(shù)(按內(nèi)嵌時(shí)的聲明順序,調(diào)用內(nèi)嵌對(duì)象的構(gòu)造函數(shù)(按
52、內(nèi)嵌時(shí)的聲明順序,先聲明者先構(gòu)造)。先聲明者先構(gòu)造)。l然后然后調(diào)用本類的構(gòu)造函數(shù)。調(diào)用本類的構(gòu)造函數(shù)。 析構(gòu)函數(shù)的調(diào)用順序相反析構(gòu)函數(shù)的調(diào)用順序相反對(duì)象構(gòu)造與析構(gòu)的順序Shenyang Aerospace University80class Window public:Window() cout “Window 對(duì)象被創(chuàng)建對(duì)象被創(chuàng)建”;Window() cout “Window 對(duì)象被析構(gòu)對(duì)象被析構(gòu)”; ;class Door public:Door() cout “ Door 對(duì)象被創(chuàng)建對(duì)象被創(chuàng)建”; Door()cout “Door 對(duì)象被析構(gòu)對(duì)象被析構(gòu)”; ;對(duì)象構(gòu)造與析構(gòu)的順序舉例S
53、henyang Aerospace University81class House Windows windows; Door door;public: House()() cout “House 對(duì)象被創(chuàng)建對(duì)象被創(chuàng)建”; House()() cout yabbaDabbaDo(); ; class Fred public: void yabbaDabbaDo(); private: Barney* y; ; /錯(cuò)誤:錯(cuò)誤:FredFred類的對(duì)象在定義之前被使用類的對(duì)象在定義之前被使用/正確,經(jīng)過前向引用聲明,可以聲明正確,經(jīng)過前向引用聲明,可以聲明Fred類的對(duì)象指針類的對(duì)象指針Shenyang Aerospace University86類的應(yīng)用舉例 一圓形游泳池如圖所示,現(xiàn)在需在其周圍建一圓形過道,一圓形游泳池如圖所示,現(xiàn)在需在其周圍建一圓形過道,并在其四周圍上柵欄。柵欄價(jià)格為并在其四周圍上柵欄。柵欄價(jià)格為3535元元/ /米,過道造價(jià)米,過道造價(jià)為為2020元元/ /平方米。過道寬度為平方米。過道寬度為3 3米,游泳池半徑由鍵盤輸米,游泳池半徑由鍵盤輸入。要求編程計(jì)算并輸出過道和柵欄的造價(jià)。入。要求編程計(jì)算并輸出過道和柵欄的造價(jià)。游泳池過道Shenyang Aero
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)考培訓(xùn)合同范本
- 優(yōu)化電力系統(tǒng)安全巡查工作的具體安排計(jì)劃
- 從基礎(chǔ)到進(jìn)階的理財(cái)知識(shí)計(jì)劃
- 班級(jí)主題探討與交流計(jì)劃
- 打造積極向上的班級(jí)氛圍計(jì)劃
- 如何建設(shè)高效的倉(cāng)庫(kù)決策體制計(jì)劃
- 應(yīng)對(duì)城市安全挑戰(zhàn)的保安新思路計(jì)劃
- 教學(xué)績(jī)效考核標(biāo)準(zhǔn)計(jì)劃
- 基于兒童興趣的教研工作計(jì)劃
- 青少年心理與藝術(shù)表現(xiàn)計(jì)劃
- 移動(dòng)商務(wù)基礎(chǔ)(吳洪貴)課件 第二章 探秘移動(dòng)技術(shù)
- 動(dòng)畫劇本創(chuàng)作課件
- 【企業(yè)會(huì)計(jì)信息化存在的問題及解決對(duì)策開題報(bào)告】
- 痘痘肌膚的各種類型
- (完整版)設(shè)計(jì)管理
- 中國(guó)嚴(yán)重膿毒癥膿毒性休克治療指南2023年
- 材料性能學(xué)(第2版)付華課件0-緒論-材料性能學(xué)
- GB/T 3403.2-2013塑料粉狀脲-甲醛和脲/三聚氰胺-甲醛模塑料(UF-和UF/MF-PMCs)第2部分:試樣制備和性能測(cè)定
- GB/T 21835-2008焊接鋼管尺寸及單位長(zhǎng)度重量
- 2023年湖南省普通高中學(xué)業(yè)水平考試數(shù)學(xué)版含答案
- 積極情緒的力量
評(píng)論
0/150
提交評(píng)論