第四章類與對象_第1頁
第四章類與對象_第2頁
第四章類與對象_第3頁
第四章類與對象_第4頁
第四章類與對象_第5頁
已閱讀5頁,還剩115頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第四章第四章 類與對象類與對象封裝(封裝(EncapsulationEncapsulation)是面向?qū)ο蟪绦蛟O(shè)是面向?qū)ο蟪绦蛟O(shè)計最基本的特性,也就是把數(shù)據(jù)(屬性)和函數(shù)計最基本的特性,也就是把數(shù)據(jù)(屬性)和函數(shù)(操作)合成一個整體,這是用類與對象實現(xiàn)的。(操作)合成一個整體,這是用類與對象實現(xiàn)的。 本章重點:本章重點:1.1.引入引入C+C+的類(的類(classclass)和對象()和對象(objectobject)的概)的概念,建立念,建立“函數(shù)也可以是數(shù)據(jù)類型的成員函數(shù)也可以是數(shù)據(jù)類型的成員”的思的思想。想。2.2.運算符重載。運算符重載。第四章第四章 類與對象類與對象4.1 類與對象

2、類與對象 4.5 運算符的重載運算符的重載 4.4 引用引用與復(fù)制構(gòu)造函數(shù)與復(fù)制構(gòu)造函數(shù) 4.2 從面向過程到面向?qū)ο髲拿嫦蜻^程到面向?qū)ο?4.9 名字空間域和類域(選讀)名字空間域和類域(選讀) 4.10面向?qū)ο蟮某绦蛟O(shè)計和面向?qū)ο蟮某绦蛟O(shè)計和Windows編程編程 4.8 結(jié)構(gòu)結(jié)構(gòu)4.7 靜態(tài)成員靜態(tài)成員 4.6 友元友元 4.3 構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)4.1 類與對象類與對象 .3對象的創(chuàng)建與使用對象的創(chuàng)建與使用 4.1.1 C+4.1.1 C+類的定義類的定義 .2 成員函數(shù)的定義成員函數(shù)的定義 4.1.1 C+類的定義類的定義 類的引入:

3、類的引入: 類是一種數(shù)據(jù)類型。類是一種數(shù)據(jù)類型。 描述客觀事物必須描述客觀事物必須用不同的數(shù)據(jù)類型用不同的數(shù)據(jù)類型來描述來描述不同不同的方面的方面。如商品:。如商品: 商品名稱(用字符串描述),該商品數(shù)量(用整商品名稱(用字符串描述),該商品數(shù)量(用整型數(shù)描述),該商品單價(用浮點數(shù)描述),該商品型數(shù)描述),該商品單價(用浮點數(shù)描述),該商品總價(用浮點數(shù)描述)??們r(用浮點數(shù)描述)。這里用了屬于三種不同數(shù)據(jù)類型的四個數(shù)據(jù)成員這里用了屬于三種不同數(shù)據(jù)類型的四個數(shù)據(jù)成員(data memberdata member)來描述一種商品。)來描述一種商品。4.1.1 C+類的定義類的定義類的表述:類的

4、表述:class CGoods public : char Name21 ; int Amount ; float Price ; float Total_value ; ; /最后的分號不可少,這是一條說明語句最后的分號不可少,這是一條說明語句關(guān)鍵字關(guān)鍵字class是是數(shù)據(jù)類型說明符數(shù)據(jù)類型說明符,指出下面說明的是,指出下面說明的是類。標識符類。標識符CGoods是商品這個類的是商品這個類的類型名類型名。花括號?;ɡㄌ栔惺菢?gòu)成類體的系列成員,關(guān)鍵字中是構(gòu)成類體的系列成員,關(guān)鍵字public是一種是一種訪問訪問限定符限定符。4.1.1 C+類的定義類的定義訪問限定符訪問限定符(access s

5、pecifier):):public(公共的)(公共的)說明的成員能從外部進行訪問。說明的成員能從外部進行訪問。private(私有的)(私有的)和和protected(保護的)(保護的)說明的說明的成員不能從外部進行訪問。成員不能從外部進行訪問。 每種說明符可在類體中使用多次。每種說明符可在類體中使用多次。 訪問限定符的訪問限定符的作用域作用域是從該說明符出現(xiàn)開始到是從該說明符出現(xiàn)開始到下一個說明符之前或類體結(jié)束之前結(jié)束。下一個說明符之前或類體結(jié)束之前結(jié)束。 如果在類體起始點無訪問說明符,系統(tǒng)如果在類體起始點無訪問說明符,系統(tǒng)默認定默認定義為私有義為私有(private)。)。 訪問限定符訪

6、問限定符private(私有的)和(私有的)和protected(保(保護的)體現(xiàn)了類具有護的)體現(xiàn)了類具有封裝性(封裝性(Encapsulation)。4.1.1 C+類的定義類的定義類的定義:類的定義:class 類名類名private: 成員表成員表1; public: 成員表成員表2; protected: 成員表成員表3; /注意:所有說明都以分號結(jié)束注意:所有說明都以分號結(jié)束其中其中“class 類名類名”稱為稱為類頭類頭(class head)。花括)。花括號中的部分稱為號中的部分稱為類體類體(class body),類體中定義了),類體中定義了類成員表類成員表(class me

7、mber list),包含包含數(shù)據(jù)數(shù)據(jù)和和函數(shù)函數(shù)。4.1.1 C+類的定義類的定義成員函數(shù)成員函數(shù)(member function) :class CGoodsprivate : char Name21 ; int Amount ; float Price ; float Total_value ;public : void RegisterGoods(char,int,float); /輸入數(shù)據(jù)輸入數(shù)據(jù) void CountTotal(void) ; /計算商品總價值計算商品總價值 void GetName(char) ; /讀取商品名讀取商品名 int GetAmount(void) ;

8、 /讀取商品數(shù)量讀取商品數(shù)量 float GetPrice(void) ; /讀取商品單價讀取商品單價 float GetTotal_value(void) ; ; /讀取商品總價值讀取商品總價值 4.1.1 C+類的定義類的定義封裝:封裝:類把類把數(shù)據(jù)數(shù)據(jù)(事物的屬性)和(事物的屬性)和函數(shù)函數(shù)(事物的行為(事物的行為操作)操作)封封裝裝為一個整體。為一個整體。 接口:接口: 通常通常數(shù)據(jù)成員被說明成私有的,函數(shù)成員被說明成公有數(shù)據(jù)成員被說明成私有的,函數(shù)成員被說明成公有的的;從外部對數(shù)據(jù)成員進行操作從外部對數(shù)據(jù)成員進行操作,只能通過公有函數(shù)來完成只能通過公有函數(shù)來完成,數(shù)數(shù)據(jù)受到了良好的保

9、護據(jù)受到了良好的保護,不易受副作用的影響。公有函數(shù)集定義不易受副作用的影響。公有函數(shù)集定義了類的了類的接口接口(interface)。)。 成員函數(shù)成員函數(shù)可以可以直接使用直接使用類定義中的類定義中的任一成員任一成員,可以,可以處理處理數(shù)據(jù)成員,數(shù)據(jù)成員,也可也可調(diào)用函數(shù)成員調(diào)用函數(shù)成員。注意:注意: 類是一種數(shù)據(jù)類型,定義時系統(tǒng)不為類分配存儲空間,所以類是一種數(shù)據(jù)類型,定義時系統(tǒng)不為類分配存儲空間,所以不能對類的數(shù)據(jù)成員初始化。類中的任何數(shù)據(jù)成員也不能使不能對類的數(shù)據(jù)成員初始化。類中的任何數(shù)據(jù)成員也不能使用關(guān)鍵字用關(guān)鍵字extern、auto或或register限定其存儲類型。限定其存儲類型

10、。 4.1.2成員函數(shù)的定義成員函數(shù)的定義 函數(shù)定義:函數(shù)定義:通常在類定義中,成員函數(shù)僅作通常在類定義中,成員函數(shù)僅作聲明聲明。函數(shù)。函數(shù)定義定義通常通常在類的說明之后進行,其格式如下:在類的說明之后進行,其格式如下:返回值類型返回值類型 類名類名:函數(shù)名函數(shù)名(參數(shù)表參數(shù)表) /函數(shù)體函數(shù)體其中運算符其中運算符“:”稱為稱為作用域解析運算符作用域解析運算符(scope resolution operator),它指出該函數(shù)是屬于,它指出該函數(shù)是屬于哪一個類的成員函數(shù)。哪一個類的成員函數(shù)。類類CGoods的函數(shù)定義的函數(shù)定義定義對象:定義對象: 對象是類的實例對象是類的實例(instance

11、)。定義一種數(shù)據(jù)類)。定義一種數(shù)據(jù)類型只是告訴編譯系統(tǒng)該數(shù)據(jù)類型的構(gòu)造,并沒有預(yù)定型只是告訴編譯系統(tǒng)該數(shù)據(jù)類型的構(gòu)造,并沒有預(yù)定內(nèi)存。內(nèi)存。類只是一個樣板類只是一個樣板,以此樣板可以在內(nèi)存中開辟以此樣板可以在內(nèi)存中開辟出同樣結(jié)構(gòu)的實例出同樣結(jié)構(gòu)的實例對象。格式如下:對象。格式如下:CGoods Car;這個定義創(chuàng)建了這個定義創(chuàng)建了CGoods類的一個對象類的一個對象Car,同時為它,同時為它分配分配了屬于它自己的了屬于它自己的存儲塊存儲塊,用來,用來存放數(shù)據(jù)存放數(shù)據(jù)和對這些和對這些數(shù)據(jù)實施操作的數(shù)據(jù)實施操作的成員函數(shù)成員函數(shù)(代碼代碼)。對象只在定義它)。對象只在定義它的域中有效。的域中有效。

12、4.1.3對象的創(chuàng)建與使用對象的創(chuàng)建與使用對象存儲對象存儲: : 圖圖4.1 各對象完全獨立地安排內(nèi)存的方案各對象完全獨立地安排內(nèi)存的方案 圖圖4.1是系統(tǒng)是系統(tǒng)為每一個對象分配了全套的內(nèi)存為每一個對象分配了全套的內(nèi)存。數(shù)據(jù)區(qū)數(shù)據(jù)區(qū)安放安放成員數(shù)據(jù),成員數(shù)據(jù),代碼區(qū)代碼區(qū)安放成員函數(shù)。安放成員函數(shù)。 注意:注意:區(qū)別同一個類的各個不同的對象的屬性是由數(shù)據(jù)成員決區(qū)別同一個類的各個不同的對象的屬性是由數(shù)據(jù)成員決定的,不同對象的數(shù)據(jù)成員的內(nèi)容是不一樣的;而行為(操作)定的,不同對象的數(shù)據(jù)成員的內(nèi)容是不一樣的;而行為(操作)是用函數(shù)來描述的,這些操作的代碼對所有對象都是一樣的。是用函數(shù)來描述的,這些操

13、作的代碼對所有對象都是一樣的。數(shù)據(jù)區(qū)數(shù)據(jù)區(qū)代碼區(qū)代碼區(qū)對象對象1對象對象數(shù)據(jù)區(qū)數(shù)據(jù)區(qū)代碼區(qū)代碼區(qū)對象對象數(shù)據(jù)區(qū)數(shù)據(jù)區(qū)代碼區(qū)代碼區(qū)圖圖4.2 各對象的代碼區(qū)共用的方案各對象的代碼區(qū)共用的方案數(shù)據(jù)區(qū)數(shù)據(jù)區(qū)對象對象1數(shù)據(jù)區(qū)數(shù)據(jù)區(qū)對象對象數(shù)據(jù)區(qū)數(shù)據(jù)區(qū)對象對象公共代碼區(qū)公共代碼區(qū) 圖圖4.2僅為每個對象分配一個數(shù)據(jù)區(qū),代碼區(qū)(放成員函僅為每個對象分配一個數(shù)據(jù)區(qū),代碼區(qū)(放成員函數(shù)的區(qū)域)為各對象類共用數(shù)的區(qū)域)為各對象類共用。 圖圖4.1對應(yīng)的是在對應(yīng)的是在類說明中類說明中定義函數(shù),而圖定義函數(shù),而圖4.2對應(yīng)的是在對應(yīng)的是在類說明外部類說明外部定義函數(shù)定義函數(shù) 。4.1.3對象的創(chuàng)建與使用對象的創(chuàng)建與

14、使用內(nèi)聯(lián)函數(shù):內(nèi)聯(lián)函數(shù):使用關(guān)鍵字使用關(guān)鍵字inline,系統(tǒng)自動采用內(nèi)聯(lián)擴展方法實現(xiàn),每個,系統(tǒng)自動采用內(nèi)聯(lián)擴展方法實現(xiàn),每個對象都有該函數(shù)一份獨立的代碼。對象都有該函數(shù)一份獨立的代碼。如如RegisterGoods()函數(shù)可定義為:函數(shù)可定義為:inline void CGoods:RegisterGoods(char name , int amount , float price)strcpy(Name,name) ; Amount=amount ; Price=price ; 則則每個對象每個對象都有都有RegisterGoods()函數(shù)一份函數(shù)一份獨立的代碼獨立的代碼。注意:注意:i

15、nline只是一個建議,最后由編譯器決定是否執(zhí)行。只是一個建議,最后由編譯器決定是否執(zhí)行。對象的存儲方式是物理的,這是由計算機來完成的,它并不對象的存儲方式是物理的,這是由計算機來完成的,它并不影響類在影響類在邏輯上邏輯上的封裝性。的封裝性。4.1.3對象的創(chuàng)建與使用對象的創(chuàng)建與使用對象使用規(guī)則:對象使用規(guī)則: 只要在對象名后加點號(只要在對象名后加點號(點操作符點操作符,成員訪問運算,成員訪問運算符符(member access oprator)之一),再加成員數(shù)據(jù)之一),再加成員數(shù)據(jù)或成員函數(shù)名就可以了。但是這些成員必須是公有的成或成員函數(shù)名就可以了。但是這些成員必須是公有的成員,只有員,

16、只有公有成員才能在對象的外面對它進行訪問公有成員才能在對象的外面對它進行訪問?!纠纠?.1】商品類對象應(yīng)用實例】商品類對象應(yīng)用實例【例【例4.1】中對象中對象car的的4個數(shù)據(jù)成員全是私有的個數(shù)據(jù)成員全是私有的,如寫:如寫:car.Name;car. Amount;car.Price;car.Total_value;是是錯誤錯誤的,必須用對象的,必須用對象car所帶的公有函數(shù)進行訪問。所帶的公有函數(shù)進行訪問。4.2 從面向過程到面向?qū)ο髲拿嫦蜻^程到面向?qū)ο?(閱讀)(閱讀)結(jié)構(gòu)化程序設(shè)計特點:結(jié)構(gòu)化程序設(shè)計特點:采用的是采用的是“自頂向下,逐步細化(自頂向下,逐步細化(divide and

17、divide and conquer,stepwise refinementconquer,stepwise refinement)”的思想。具體操作方法是的思想。具體操作方法是模塊化模塊化。模塊模塊是按功能來分的,所以也稱是按功能來分的,所以也稱功能塊功能塊。在。在C+C+中稱中稱為一個函數(shù),一個函數(shù)解決一個問題,即實現(xiàn)一個功能或一為一個函數(shù),一個函數(shù)解決一個問題,即實現(xiàn)一個功能或一個操作。個操作。 在模塊化的思想中已經(jīng)出現(xiàn)了在模塊化的思想中已經(jīng)出現(xiàn)了封裝封裝的概念,這個封裝是把的概念,這個封裝是把數(shù)據(jù)封裝到模塊中,即局部變量。這是很不徹底的,因為模塊數(shù)據(jù)封裝到模塊中,即局部變量。這是很不徹

18、底的,因為模塊是是功能的抽象功能的抽象,而數(shù)據(jù)則是具有其個性的,一但發(fā)生變化,抽,而數(shù)據(jù)則是具有其個性的,一但發(fā)生變化,抽象的功能模塊就不再適用了。象的功能模塊就不再適用了??删S護性差可維護性差成了制約結(jié)構(gòu)化程序成了制約結(jié)構(gòu)化程序設(shè)計的瓶頸。設(shè)計的瓶頸。 面向過程程序設(shè)計缺點的根源在于數(shù)據(jù)與數(shù)據(jù)處理分離。面向過程程序設(shè)計缺點的根源在于數(shù)據(jù)與數(shù)據(jù)處理分離。 4.2 從面向過程到面向?qū)ο螅ㄩ喿x)從面向過程到面向?qū)ο螅ㄩ喿x)結(jié)構(gòu)化程序設(shè)計弱點:結(jié)構(gòu)化程序設(shè)計弱點: 當軟件規(guī)模過大,采用結(jié)構(gòu)化程序設(shè)計,其開當軟件規(guī)模過大,采用結(jié)構(gòu)化程序設(shè)計,其開發(fā)和維護就越來越難控制。發(fā)和維護就越來越難控制。其根本的

19、原因其根本的原因就在于面就在于面向過程的結(jié)構(gòu)化程序設(shè)計的方法與現(xiàn)實世界(包括向過程的結(jié)構(gòu)化程序設(shè)計的方法與現(xiàn)實世界(包括主觀世界和客觀世界)往往都不一致,結(jié)構(gòu)化程序主觀世界和客觀世界)往往都不一致,結(jié)構(gòu)化程序設(shè)計的思想往往很難貫徹到底。設(shè)計的思想往往很難貫徹到底。 對象概念:對象概念:對象的概念是面向?qū)ο蠹夹g(shù)的核心所在。面向?qū)ο髮ο蟮母拍钍敲嫦驅(qū)ο蠹夹g(shù)的核心所在。面向?qū)ο蠹夹g(shù)中的技術(shù)中的對象對象就是就是現(xiàn)實世界現(xiàn)實世界中某個具體的中某個具體的物理實體物理實體在在計算機計算機邏輯中的邏輯中的映射和體現(xiàn)映射和體現(xiàn)。4.2 從面向過程到面向?qū)ο螅ㄩ喿x)從面向過程到面向?qū)ο螅ㄩ喿x)對象對象類類計 算

20、機計 算 機世界世界實體實體抽象類抽象類別別現(xiàn)實世界現(xiàn)實世界客觀世界客觀世界抽抽象象抽抽象象實實例例化化映映射射主觀世界主觀世界圖圖4.3對象、實體與類對象、實體與類現(xiàn)實世界中的實現(xiàn)實世界中的實體可以抽象出類別的體可以抽象出類別的概念。對應(yīng)于計算機概念。對應(yīng)于計算機世界就有一個類世界就有一個類(classclass)的概念。)的概念。面面向?qū)ο笫怯嬎銠C世界向?qū)ο笫怯嬎銠C世界模擬現(xiàn)實世界模擬現(xiàn)實世界。圖。圖4.34.3表達了計算機世界與表達了計算機世界與現(xiàn)實世界之間的對應(yīng)現(xiàn)實世界之間的對應(yīng)關(guān)系。關(guān)系。 4.2 從面向過程到面向?qū)ο螅ㄩ喿x)從面向過程到面向?qū)ο螅ㄩ喿x)對象、類與消息:對象、類與消息

21、:n面向?qū)ο蟪绦蛟O(shè)計模擬自然界認識和處理事物的方面向?qū)ο蟪绦蛟O(shè)計模擬自然界認識和處理事物的方法,將數(shù)據(jù)和對數(shù)據(jù)的操作方法放在一起,形成一法,將數(shù)據(jù)和對數(shù)據(jù)的操作方法放在一起,形成一個相對獨立的整體個相對獨立的整體對象(對象(object),同類對象),同類對象還可抽象出共性,形成類(還可抽象出共性,形成類(class )。一個類中的)。一個類中的數(shù)據(jù)通常只能通過本類提供的方法進行處理,這些數(shù)據(jù)通常只能通過本類提供的方法進行處理,這些方法成為該類與外部的接口。對象之間通過消息方法成為該類與外部的接口。對象之間通過消息(message)進行通訊。)進行通訊。4.2 從面向過程到面向?qū)ο螅ㄩ喿x)從面

22、向過程到面向?qū)ο螅ㄩ喿x)屬性屬性行為行為表針表針旋鈕旋鈕其他機械機構(gòu)其他機械機構(gòu)調(diào)節(jié)旋鈕調(diào)節(jié)旋鈕對 象4.2 從面向過程到面向?qū)ο螅ㄩ喿x)從面向過程到面向?qū)ο螅ㄩ喿x)是一個抽象的概念,用來描述某一類對象所共是一個抽象的概念,用來描述某一類對象所共有的、本質(zhì)的屬性和類行為。有的、本質(zhì)的屬性和類行為。 類類類的一個具體實現(xiàn),稱為實例類的一個具體實現(xiàn),稱為實例手表手表 一塊手一塊手表表類類 對象對象描述這類對象共有的、本質(zhì)的屬性和行為描述這類對象共有的、本質(zhì)的屬性和行為手表共有的屬性(表針、旋鈕、內(nèi)部結(jié)構(gòu))手表共有的屬性(表針、旋鈕、內(nèi)部結(jié)構(gòu))和行為(調(diào)節(jié)旋鈕)和行為(調(diào)節(jié)旋鈕)具體到一只圓形的或方

23、形的手表具體到一只圓形的或方形的手表4.2 從面向過程到面向?qū)ο螅ㄩ喿x)從面向過程到面向?qū)ο螅ㄩ喿x)我們把對象之間產(chǎn)生相互作用所傳遞的信我們把對象之間產(chǎn)生相互作用所傳遞的信息稱做息稱做消息消息。 消消 息息啟啟 動動發(fā)送消息發(fā)送消息接收并響應(yīng)消息接收并響應(yīng)消息轉(zhuǎn)轉(zhuǎn) 向向4.2 從面向過程到面向?qū)ο螅ㄩ喿x)從面向過程到面向?qū)ο螅ㄩ喿x)封裝性封裝性內(nèi)內(nèi)外外機械零件機械零件動作動作調(diào)節(jié)旋鈕調(diào)節(jié)旋鈕讀表盤讀表盤對象是一個對象是一個封裝體封裝體,在其中封裝了該,在其中封裝了該對象的屬性和操作。通過限制對屬性和操對象的屬性和操作。通過限制對屬性和操作的訪問權(quán)限,可以將屬性作的訪問權(quán)限,可以將屬性“隱藏隱藏

24、”在對在對象內(nèi)部,對外提供一定的象內(nèi)部,對外提供一定的接口接口,在對象之,在對象之外只能通過接口對對象進行操作。外只能通過接口對對象進行操作。C+C+通過建立數(shù)據(jù)類型通過建立數(shù)據(jù)類型類類來支持封來支持封裝和數(shù)據(jù)隱藏。封裝性增加了裝和數(shù)據(jù)隱藏。封裝性增加了對象的獨對象的獨立性立性,從而保證了,從而保證了數(shù)據(jù)的可靠性數(shù)據(jù)的可靠性。一個。一個定義完好的類可以作為定義完好的類可以作為獨立模塊獨立模塊使用。使用。面向?qū)ο蟪绦蛟O(shè)計的特點:面向?qū)ο蟪绦蛟O(shè)計的特點:汽車汽車客車客車貨車貨車小轎車小轎車大客車大客車載貨載貨載人載人小,速度快小,速度快大,速度慢大,速度慢4.2 從面向過程到面向?qū)ο螅ㄩ喿x)從面向

25、過程到面向?qū)ο螅ㄩ喿x)繼承與派生繼承與派生以汽車為例看客觀世界描述事物的方式:以汽車為例看客觀世界描述事物的方式:當定義了一個類后,又需定義當定義了一個類后,又需定義一個新類,這個新類與原來的類一個新類,這個新類與原來的類相比,只是增加或修改了部分屬相比,只是增加或修改了部分屬性和操作,這時可以用原來的類性和操作,這時可以用原來的類派生派生出新類,新類中只需描述自出新類,新類中只需描述自己所特有的屬性和操作。己所特有的屬性和操作。面向?qū)ο蟪绦蛟O(shè)計提供了類似的機制:面向?qū)ο蟪绦蛟O(shè)計提供了類似的機制:繼承性大大簡化了對問題的描述,大大提高了程序的可重繼承性大大簡化了對問題的描述,大大提高了程序的可

26、重用性,從而提高了程序設(shè)計、修改、擴充的效率。用性,從而提高了程序設(shè)計、修改、擴充的效率。新類稱為新類稱為子類子類或或派生類派生類,原來的類稱為,原來的類稱為基類基類。派生可以一直。派生可以一直進行下去,形成一個進行下去,形成一個派生樹派生樹。4.2 從面向過程到面向?qū)ο螅ㄩ喿x)從面向過程到面向?qū)ο螅ㄩ喿x)語文、數(shù)學(xué)、英語、政治、語文、數(shù)學(xué)、英語、政治、物理、化學(xué)、生物物理、化學(xué)、生物多態(tài)性多態(tài)性多態(tài)性指,同一個多態(tài)性指,同一個消息消息被被不同對象不同對象接收時,接收時,產(chǎn)生產(chǎn)生不同結(jié)果不同結(jié)果,即實現(xiàn),即實現(xiàn)同一接口,不同方法同一接口,不同方法。高中生高中生計計 算算平均成績平均成績大學(xué)生大

27、學(xué)生高數(shù)、英語、計算機、線高數(shù)、英語、計算機、線性代數(shù)性代數(shù)4.2 從面向過程到面向?qū)ο螅ㄩ喿x)從面向過程到面向?qū)ο螅ㄩ喿x)繼承繼承和和多態(tài)多態(tài)性組合,可以生成很多相似性組合,可以生成很多相似但又獨一無二的對象。但又獨一無二的對象。繼承繼承性使得這些對性使得這些對象可以共享許多相似特性,而象可以共享許多相似特性,而多態(tài)多態(tài)又使同又使同一個操作對不同對象產(chǎn)生不同表現(xiàn)形式。一個操作對不同對象產(chǎn)生不同表現(xiàn)形式。這樣不僅提高了程序設(shè)計的靈活性,而且這樣不僅提高了程序設(shè)計的靈活性,而且減輕了分別設(shè)計的負擔(dān)。減輕了分別設(shè)計的負擔(dān)。4.3 構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)數(shù)據(jù)成員多為私有的,要對它們進行

28、初始化,數(shù)據(jù)成員多為私有的,要對它們進行初始化,必須用一個公有函數(shù)來進行。同時這個函數(shù)應(yīng)該必須用一個公有函數(shù)來進行。同時這個函數(shù)應(yīng)該在且僅在定義對象時自動執(zhí)行一次。稱為:在且僅在定義對象時自動執(zhí)行一次。稱為:構(gòu)造函數(shù)構(gòu)造函數(shù)(constructor)4.3.1構(gòu)造函數(shù)的定義與使用構(gòu)造函數(shù)的定義與使用 4.3.2析構(gòu)函數(shù)的定義析構(gòu)函數(shù)的定義 構(gòu)造函數(shù)特征:構(gòu)造函數(shù)特征:1.函數(shù)名與類名相同。函數(shù)名與類名相同。2.構(gòu)造函數(shù)無函數(shù)返回類型說明構(gòu)造函數(shù)無函數(shù)返回類型說明。注意是什么也不。注意是什么也不寫,也寫,也不可寫不可寫void!3.在程序運行時,當新的對象被建立,該對象所屬在程序運行時,當新的對

29、象被建立,該對象所屬的類的構(gòu)造函數(shù)自動被調(diào)用,在該對象生存期中也的類的構(gòu)造函數(shù)自動被調(diào)用,在該對象生存期中也只調(diào)用這一次。只調(diào)用這一次。4.構(gòu)造函數(shù)可以重載。嚴格地講,說明中可以有多構(gòu)造函數(shù)可以重載。嚴格地講,說明中可以有多個構(gòu)造函數(shù),它們由不同的參數(shù)表區(qū)分,系統(tǒng)在自個構(gòu)造函數(shù),它們由不同的參數(shù)表區(qū)分,系統(tǒng)在自動調(diào)用時按一般函數(shù)重載的規(guī)則選一個執(zhí)行。動調(diào)用時按一般函數(shù)重載的規(guī)則選一個執(zhí)行。.1構(gòu)造函數(shù)的定義與使用構(gòu)造函數(shù)的定義與使用 4.3.1構(gòu)造函數(shù)的定義與使用構(gòu)造函數(shù)的定義與使用5.構(gòu)造函數(shù)可以在類中定義,也可以在類外定義。構(gòu)造函數(shù)可以在類中定義,也可以在類外定義。 6.

30、如果類說明中沒有給出構(gòu)造函數(shù),則如果類說明中沒有給出構(gòu)造函數(shù),則C+編譯器編譯器自動給出一個自動給出一個默認默認的構(gòu)造函數(shù)的構(gòu)造函數(shù): 類名類名(void) 但但只要我們定義了一個構(gòu)造函數(shù),系統(tǒng)就不會自動只要我們定義了一個構(gòu)造函數(shù),系統(tǒng)就不會自動生成默認的構(gòu)造函數(shù)生成默認的構(gòu)造函數(shù)。 只要只要構(gòu)造函數(shù)是無參的或各參數(shù)均有默認值的構(gòu)造函數(shù)是無參的或各參數(shù)均有默認值的,C+編譯器編譯器都都認為認為是默認的構(gòu)造函數(shù),是默認的構(gòu)造函數(shù),并且并且默認的默認的構(gòu)造函數(shù)只能有一個構(gòu)造函數(shù)只能有一個 。 4.3.1構(gòu)造函數(shù)的定義與使用構(gòu)造函數(shù)的定義與使用 CGoods的構(gòu)造函數(shù):的構(gòu)造函數(shù):三參數(shù):三參數(shù):C

31、goods (char* name , int amount , float price) strcpy(Name,name) ;Amount=amount ;Price=price ; Total_value=price*amount ;兩參數(shù):兩參數(shù):貨名和單價,貨名和單價,Cgoods (char* name , float price) strcpy(Name,name) ;Price=price ;Amount=0 ; Total_value=0.0 ;默認的構(gòu)造函數(shù):默認的構(gòu)造函數(shù):CGoods()Name0=0 ; Price=0.0 ; Amount=0 ; Total_val

32、ue=0.0 ;這三個構(gòu)造函數(shù)同時這三個構(gòu)造函數(shù)同時被說明(被說明(重載重載)。)。4.3.1構(gòu)造函數(shù)的定義與使用構(gòu)造函數(shù)的定義與使用 構(gòu)造函數(shù)應(yīng)用:構(gòu)造函數(shù)應(yīng)用:CGoods Car1(“夏利夏利2000”,30,98000.0);調(diào)用了調(diào)用了CGoods中的第一個構(gòu)造函數(shù),等效于:中的第一個構(gòu)造函數(shù),等效于:CGoods Car1= CGoods(“夏利夏利2000”,30,98000.0);CGoods Car2(“桑塔那桑塔那2000”,164000.0) ;調(diào)用的是第二個構(gòu)造函數(shù),參數(shù)為兩個。調(diào)用的是第二個構(gòu)造函數(shù),參數(shù)為兩個。CGoods Car3; 定義時調(diào)用不帶參數(shù)的構(gòu)造函數(shù)定

33、義時調(diào)用不帶參數(shù)的構(gòu)造函數(shù)但是定義對象時不能加括號。例如:但是定義對象時不能加括號。例如:CGoods Car4();Car4()是不帶參數(shù)的函數(shù),它的返回值是類是不帶參數(shù)的函數(shù),它的返回值是類CGoods的對象。的對象?!纠纠?.1_1】完整商品類對象應(yīng)用實例】完整商品類對象應(yīng)用實例4.3.2析構(gòu)函數(shù)的定義析構(gòu)函數(shù)的定義 析構(gòu)函數(shù)(析構(gòu)函數(shù)(destructor)特征:)特征: 當一個對象的生命周期結(jié)束時,當一個對象的生命周期結(jié)束時,C+C+會自動調(diào)用會自動調(diào)用析構(gòu)函析構(gòu)函數(shù)數(shù)(destructordestructor)對該對象并進行善后工作,)對該對象并進行善后工作,1.1. 構(gòu)函數(shù)名與

34、類名相同,但在前面加上字符構(gòu)函數(shù)名與類名相同,但在前面加上字符 ,如,如CGoodsCGoods()()。2.2. 析構(gòu)函數(shù)無函數(shù)返回類型,與構(gòu)造函數(shù)在這方面是一樣析構(gòu)函數(shù)無函數(shù)返回類型,與構(gòu)造函數(shù)在這方面是一樣的。但析構(gòu)函數(shù)不帶任何參數(shù)。的。但析構(gòu)函數(shù)不帶任何參數(shù)。3. 3. 一個類有一個也只有一個析構(gòu)函數(shù),這與構(gòu)造函數(shù)不同。一個類有一個也只有一個析構(gòu)函數(shù),這與構(gòu)造函數(shù)不同。析構(gòu)函數(shù)可以默認。析構(gòu)函數(shù)可以默認。4. 4. 對象注銷時,系統(tǒng)自動調(diào)用析構(gòu)函數(shù)。對象注銷時,系統(tǒng)自動調(diào)用析構(gòu)函數(shù)?!纠纠?.2】定義一個矩形類】定義一個矩形類4.4引用與復(fù)制構(gòu)造函數(shù)引用與復(fù)制構(gòu)造函數(shù) 4.4.1 引

35、用引用 4.4.2 復(fù)制構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù) 4.4.3 成員對象與構(gòu)造函數(shù)成員對象與構(gòu)造函數(shù) 4. 4.1引用引用 引用的導(dǎo)入:引用的導(dǎo)入: 參數(shù)傳遞的參數(shù)傳遞的傳值傳值方式在方式在函數(shù)域中為參數(shù)重新分函數(shù)域中為參數(shù)重新分配內(nèi)存配內(nèi)存,而把實參的數(shù)值傳遞到新分配的內(nèi)存中。,而把實參的數(shù)值傳遞到新分配的內(nèi)存中。它的優(yōu)點是它的優(yōu)點是有效避免函數(shù)的副作用有效避免函數(shù)的副作用。 問題:問題:如果要求改變實參的值,怎么辦呢?如如果要求改變實參的值,怎么辦呢?如果實參是一個復(fù)雜的對象,重新分配內(nèi)存會引起程果實參是一個復(fù)雜的對象,重新分配內(nèi)存會引起程序執(zhí)行效率大大下降,怎么辦呢序執(zhí)行效率大大下降,怎么辦呢

36、? ? 有一種導(dǎo)出型數(shù)據(jù)類型有一種導(dǎo)出型數(shù)據(jù)類型引用引用(referencereference)可)可以解決上面的難題。引用又稱以解決上面的難題。引用又稱別名別名(aliasalias)。)。4.4.1引用引用 引用的定義:引用的定義: 引用是給一個已經(jīng)定義的變量重新起一個引用是給一個已經(jīng)定義的變量重新起一個別名別名,而不是定義一個新的變量,定義的格式為:而不是定義一個新的變量,定義的格式為:類型類型 &引用變量名引用變量名=已定義過的變量名;已定義過的變量名;例如:例如:double number ;double &newnum=number ;newnum是新定義的引用類型變量,它是變量是

37、新定義的引用類型變量,它是變量number的的別名別名。 引用主要用于函數(shù)之間的數(shù)據(jù)傳遞。引用主要用于函數(shù)之間的數(shù)據(jù)傳遞。4.4.1引用引用 newnum是變量是變量number的的別名別名,C+系統(tǒng)不為引用系統(tǒng)不為引用類型變量分配內(nèi)存空間。類型變量分配內(nèi)存空間。內(nèi)存分配見下圖內(nèi)存分配見下圖:number稱為引用稱為引用newnum的 關(guān) 聯(lián) 變 量 。的 關(guān) 聯(lián) 變 量 。 “ & ” ( 讀 作讀 作ampersand)在這里是引用的在這里是引用的說明符。必須注意說明符。必須注意number和和newnum都是都是double類型。類型。如在程序中修改了如在程序中修改了newnum也就是修

38、改了也就是修改了number,兩位,兩位一體。一體。注意:注意:對數(shù)組只能引用對數(shù)組只能引用數(shù)組元素數(shù)組元素,不能引用,不能引用數(shù)組數(shù)組(數(shù)組(數(shù)組名本身為地址)。名本身為地址)。4.4.1引用引用 【例【例4.4】引用作為函數(shù)的返回值】引用作為函數(shù)的返回值一般函數(shù)返回值時,要生成一個臨時變量作為返回值的副一般函數(shù)返回值時,要生成一個臨時變量作為返回值的副本,而用引用作為返回值時,不生成值的副本。本,而用引用作為返回值時,不生成值的副本。【例【例4.5】 返回值為引用的函數(shù)作為左值(選讀)返回值為引用的函數(shù)作為左值(選讀)【例【例4.3】引用作為函數(shù)的參數(shù)?!恳米鳛楹瘮?shù)的參數(shù)。采用引用調(diào)用時

39、,將對實參進行操作。采用引用調(diào)用時,將對實參進行操作。注意:注意:采用引用返回方式時,返回的不能是函數(shù)中的局采用引用返回方式時,返回的不能是函數(shù)中的局部變量,這時返回的局部變量地址已經(jīng)失效。引用方式返部變量,這時返回的局部變量地址已經(jīng)失效。引用方式返回最常用的是由引用參數(shù)傳遞過來的變量(見例回最常用的是由引用參數(shù)傳遞過來的變量(見例4.5),其),其次是全局變量,這樣返回的變量地址是有效的。次是全局變量,這樣返回的變量地址是有效的。4.4.2 復(fù)制構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù) 復(fù)制構(gòu)造函數(shù)引入:復(fù)制構(gòu)造函數(shù)引入:同一個類的對象在內(nèi)存中有完全相同的結(jié)構(gòu),如果作為同一個類的對象在內(nèi)存中有完全相同的結(jié)構(gòu),如

40、果作為一個一個整體進行復(fù)制整體進行復(fù)制是完全可行的。這個是完全可行的。這個復(fù)制復(fù)制過程過程只需要只需要復(fù)復(fù)制制數(shù)據(jù)成員數(shù)據(jù)成員,而,而函數(shù)成員是共用的函數(shù)成員是共用的(只有一份代碼)。在(只有一份代碼)。在建立對象時可用同一類的另一個對象來初始化該對象,這建立對象時可用同一類的另一個對象來初始化該對象,這時 所 用 的 構(gòu) 造 函 數(shù) 稱 為時 所 用 的 構(gòu) 造 函 數(shù) 稱 為 復(fù) 制 構(gòu) 造 函 數(shù) (復(fù) 制 構(gòu) 造 函 數(shù) ( C o p y Constructor)。CGoods類,復(fù)制構(gòu)造函數(shù)為類,復(fù)制構(gòu)造函數(shù)為:CGoods (CGoods & cgd) Strcpy (Name

41、, cgd.Name); Price= cgd.price; Amount=cgd.Amount; Total_value=cgd.Total_value;4.4.2 復(fù)制構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù) 復(fù)制構(gòu)造函數(shù)特征:復(fù)制構(gòu)造函數(shù)特征:1.復(fù)制構(gòu)造函數(shù)的參數(shù)必須采用復(fù)制構(gòu)造函數(shù)的參數(shù)必須采用引用引用。* 在在C+中按值傳遞一個參數(shù)時,會在函數(shù)中重新分配一中按值傳遞一個參數(shù)時,會在函數(shù)中重新分配一塊內(nèi)存建立與參數(shù)同類型的變量或?qū)ο螅侔褏?shù)的數(shù)據(jù)塊內(nèi)存建立與參數(shù)同類型的變量或?qū)ο?,再把參?shù)的數(shù)據(jù)成員賦給新的變量或?qū)ο?。在建立這個對象時,編譯器就成員賦給新的變量或?qū)ο?。在建立這個對象時,編譯器就會自動為

42、這個對象調(diào)用復(fù)制構(gòu)造函數(shù)。如果其參數(shù)是真實會自動為這個對象調(diào)用復(fù)制構(gòu)造函數(shù)。如果其參數(shù)是真實的對象而不是引用,則又會引入新的一輪調(diào)用復(fù)制構(gòu)造函的對象而不是引用,則又會引入新的一輪調(diào)用復(fù)制構(gòu)造函數(shù)的過程,出現(xiàn)了無窮遞歸。數(shù)的過程,出現(xiàn)了無窮遞歸。4.4.2 復(fù)制構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù) 2.系統(tǒng)會自動提供稱為系統(tǒng)會自動提供稱為默認的按成員語義支持的默認的按成員語義支持的復(fù)制構(gòu)復(fù)制構(gòu)造函數(shù)造函數(shù),亦稱為,亦稱為默認的按成員默認的按成員初始化初始化。按成員作復(fù)制是通。按成員作復(fù)制是通過依次復(fù)制每個數(shù)據(jù)成員實現(xiàn)的。過依次復(fù)制每個數(shù)據(jù)成員實現(xiàn)的。賦值運算符賦值運算符“=”=”稱默認的按成員復(fù)制賦值操作符稱默

43、認的按成員復(fù)制賦值操作符(Copy Assignment Operator) ,同類對象之間可以用,同類對象之間可以用“=”=”直直接復(fù)制接復(fù)制 。3. 通常按成員語義支持已經(jīng)足夠。但在某些情況下,它通常按成員語義支持已經(jīng)足夠。但在某些情況下,它對類與對象的安全性和處理的正確性還不夠,這時就要求對類與對象的安全性和處理的正確性還不夠,這時就要求提供特殊的提供特殊的復(fù)制構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)和和復(fù)制賦值操作符復(fù)制賦值操作符的定義。的定義。4.4.2 復(fù)制構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù) 實例:實例:CGood Car1(“夏利夏利2000”,30,98000.00);/調(diào)用三個參數(shù)的構(gòu)造函數(shù)調(diào)用三個參數(shù)的構(gòu)造

44、函數(shù)CGood Car2= Car1; /調(diào)用復(fù)制構(gòu)造函數(shù)調(diào)用復(fù)制構(gòu)造函數(shù)CGood Car3 ( Car1); /調(diào)用復(fù)制構(gòu)造函數(shù),調(diào)用復(fù)制構(gòu)造函數(shù),Car1為實參為實參這樣三個對象的初始化結(jié)果完全一樣。這樣三個對象的初始化結(jié)果完全一樣。注意:注意: 在類定義中如果沒有顯式給出構(gòu)造函數(shù)時,并不是不在類定義中如果沒有顯式給出構(gòu)造函數(shù)時,并不是不用構(gòu)造函數(shù),而是由系統(tǒng)自動調(diào)用默認的構(gòu)造函數(shù)或默認用構(gòu)造函數(shù),而是由系統(tǒng)自動調(diào)用默認的構(gòu)造函數(shù)或默認的復(fù)制構(gòu)造函數(shù)。如果有程序設(shè)計者定義的構(gòu)造函數(shù)(包的復(fù)制構(gòu)造函數(shù)。如果有程序設(shè)計者定義的構(gòu)造函數(shù)(包括復(fù)制構(gòu)造函數(shù)),則按函數(shù)重載的規(guī)律,調(diào)用合適的構(gòu)括復(fù)

45、制構(gòu)造函數(shù)),則按函數(shù)重載的規(guī)律,調(diào)用合適的構(gòu)造函數(shù)。造函數(shù)。4.4.2 復(fù)制構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)隱含的復(fù)制構(gòu)造函數(shù)使用:隱含的復(fù)制構(gòu)造函數(shù)使用: 當函數(shù)的當函數(shù)的形參形參是是類對象類對象,調(diào)用函數(shù)時,進行形參,調(diào)用函數(shù)時,進行形參與實參結(jié)合時使用。這時要在內(nèi)存新建立一個局與實參結(jié)合時使用。這時要在內(nèi)存新建立一個局部對象,并把實參復(fù)制到新的對象中。部對象,并把實參復(fù)制到新的對象中。2.2.當函數(shù)的當函數(shù)的返回值返回值是是類對象類對象,函數(shù)執(zhí)行完成返回調(diào),函數(shù)執(zhí)行完成返回調(diào)用者時使用。理由也是要建立一個臨時對象,再用者時使用。理由也是要建立一個臨時對象,再返回調(diào)用者。返回調(diào)用者。 因為因為局部對

46、象在離開建立它的函數(shù)時就消亡了局部對象在離開建立它的函數(shù)時就消亡了,不可,不可能在返回調(diào)用函數(shù)后繼續(xù)生存,所以編譯系統(tǒng)會在調(diào)用函能在返回調(diào)用函數(shù)后繼續(xù)生存,所以編譯系統(tǒng)會在調(diào)用函數(shù)的表達式中創(chuàng)建一個數(shù)的表達式中創(chuàng)建一個無名臨時對象,無名臨時對象,該臨時對象的該臨時對象的生存生存周期周期只在函數(shù)調(diào)用處的只在函數(shù)調(diào)用處的表達式表達式中。中。所謂所謂return return 對象對象,實,實際上是際上是調(diào)用復(fù)制構(gòu)造函數(shù)把該對象的值拷入臨時對象。調(diào)用復(fù)制構(gòu)造函數(shù)把該對象的值拷入臨時對象。如如果返回的是變量,處理過程類似,只是不調(diào)用構(gòu)造函數(shù)。果返回的是變量,處理過程類似,只是不調(diào)用構(gòu)造函數(shù)。4.4.3

47、 成員對象與構(gòu)造函數(shù)成員對象與構(gòu)造函數(shù)聚合(聚合(aggregation aggregation ) : 類中的成員,除了成員數(shù)據(jù)和成員函數(shù)外,還類中的成員,除了成員數(shù)據(jù)和成員函數(shù)外,還有成員對象,即用其他類的對象作為類的成員。有成員對象,即用其他類的對象作為類的成員。使使用成員對象的技術(shù)稱為聚合用成員對象的技術(shù)稱為聚合。成員對象是實體,系。成員對象是實體,系統(tǒng)不僅為它分配內(nèi)存,而且要進行初始化統(tǒng)不僅為它分配內(nèi)存,而且要進行初始化。4.4.3 成員對象與構(gòu)造函數(shù)成員對象與構(gòu)造函數(shù)含對象成員的構(gòu)造函數(shù):含對象成員的構(gòu)造函數(shù):類名類名:構(gòu)造函數(shù)名構(gòu)造函數(shù)名(參數(shù)總表參數(shù)總表):對象成員對象成員1(

48、參數(shù)名表參數(shù)名表1),對象成員對象成員2(參數(shù)名表參數(shù)名表2),對象成員對象成員n(參數(shù)名表參數(shù)名表n)冒號后用逗號隔開的為要初始化的對象成員,附在后面的參數(shù)冒號后用逗號隔開的為要初始化的對象成員,附在后面的參數(shù)名表名表1,參數(shù)名表,參數(shù)名表n依次為調(diào)用相應(yīng)對象成員所屬的構(gòu)造依次為調(diào)用相應(yīng)對象成員所屬的構(gòu)造函數(shù)時的函數(shù)時的實參表實參表。這些表中的參數(shù)通常來自冒號前的參數(shù)總表。這些表中的參數(shù)通常來自冒號前的參數(shù)總表,但沒有類型說明但沒有類型說明 。 含對象成員的類對象的初始化時,含對象成員的類對象的初始化時,首先依次自動調(diào)用各首先依次自動調(diào)用各成員對象的構(gòu)造函數(shù),再執(zhí)行該類對象自己的構(gòu)造函數(shù)的函

49、成員對象的構(gòu)造函數(shù),再執(zhí)行該類對象自己的構(gòu)造函數(shù)的函數(shù)體部分數(shù)體部分。各成員對象的構(gòu)造函數(shù)調(diào)用的次序與類定義中說。各成員對象的構(gòu)造函數(shù)調(diào)用的次序與類定義中說明的順序一致,而與它們在構(gòu)造函數(shù)成員初始化列表中的順明的順序一致,而與它們在構(gòu)造函數(shù)成員初始化列表中的順序無關(guān)。序無關(guān)。4.4.3 成員對象與構(gòu)造函數(shù)成員對象與構(gòu)造函數(shù)【例【例4.6】含有成員對象的類的構(gòu)造函數(shù)】含有成員對象的類的構(gòu)造函數(shù) 含對象成員的析構(gòu)函數(shù):含對象成員的析構(gòu)函數(shù): 因為析構(gòu)函數(shù)沒有參數(shù),所以包含成員因為析構(gòu)函數(shù)沒有參數(shù),所以包含成員對象的類的析構(gòu)函數(shù)形式上并無特殊之處。對象的類的析構(gòu)函數(shù)形式上并無特殊之處。但是撤銷該類對

50、象時,會首先調(diào)用自己的析但是撤銷該類對象時,會首先調(diào)用自己的析構(gòu)函數(shù),再調(diào)用成員對象的析構(gòu)函數(shù),調(diào)用構(gòu)函數(shù),再調(diào)用成員對象的析構(gòu)函數(shù),調(diào)用次序與初始化時的次序相反。次序與初始化時的次序相反。4.4.3 成員對象與構(gòu)造函數(shù)成員對象與構(gòu)造函數(shù)構(gòu)造函數(shù)另一格式:構(gòu)造函數(shù)另一格式:對于不含對象成員的類對象的初始化,也可以套用以上對于不含對象成員的類對象的初始化,也可以套用以上的格式,把部分需要直接賦初值的變量初始化寫在冒號的格式,把部分需要直接賦初值的變量初始化寫在冒號的右邊:的右邊:類名類名:構(gòu)造函數(shù)名構(gòu)造函數(shù)名(參數(shù)表參數(shù)表):變量變量1(初值初值1),變量變量n(初值初值n)當然也可以把一部分變

51、量重新放回花括號中的函數(shù)體。當然也可以把一部分變量重新放回花括號中的函數(shù)體。冒號以后部分實際是函數(shù)體的一部分冒號以后部分實際是函數(shù)體的一部分,所以在構(gòu)造函數(shù),所以在構(gòu)造函數(shù)的聲明中,冒號及冒號以后部分必須略去。的聲明中,冒號及冒號以后部分必須略去。4.4.3 成員對象與構(gòu)造函數(shù)成員對象與構(gòu)造函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用規(guī)則:構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用規(guī)則:1. 對全局定義的對象,當程序進入入口函數(shù)對全局定義的對象,當程序進入入口函數(shù)main之前之前對象就已經(jīng)定義,那時要調(diào)用構(gòu)造函數(shù)。整個程序結(jié)束時對象就已經(jīng)定義,那時要調(diào)用構(gòu)造函數(shù)。整個程序結(jié)束時調(diào)用析構(gòu)函數(shù)。調(diào)用析構(gòu)函數(shù)。2. 對于局部定義的對

52、象,每當程序控制流到達該對象對于局部定義的對象,每當程序控制流到達該對象定義處時,調(diào)用構(gòu)造函數(shù)。當程序控制走出該局部域定義處時,調(diào)用構(gòu)造函數(shù)。當程序控制走出該局部域時,則調(diào)用析構(gòu)函數(shù)。時,則調(diào)用析構(gòu)函數(shù)。3. 對于靜態(tài)局部定義的對象,在程序控制首次到達該對于靜態(tài)局部定義的對象,在程序控制首次到達該對象定義處時,調(diào)用構(gòu)造函數(shù)。當整個程序結(jié)束時調(diào)對象定義處時,調(diào)用構(gòu)造函數(shù)。當整個程序結(jié)束時調(diào)用析構(gòu)函數(shù)。用析構(gòu)函數(shù)。4.4.3 成員對象與構(gòu)造函數(shù)成員對象與構(gòu)造函數(shù) 在正確定義了構(gòu)造函數(shù)和析構(gòu)函數(shù)的前提下,在一在正確定義了構(gòu)造函數(shù)和析構(gòu)函數(shù)的前提下,在一個健康的程序中,個健康的程序中,每個創(chuàng)建的對象必

53、然有一個而且每個創(chuàng)建的對象必然有一個而且只有一個撤消動作只有一個撤消動作。注意:注意:先建立的對象后撤銷先建立的對象后撤銷?!纠纠?.7】演示對象創(chuàng)建和撤消的對應(yīng)關(guān)系】演示對象創(chuàng)建和撤消的對應(yīng)關(guān)系 4.5 運算符的重載運算符的重載運算符重載的概念:運算符重載的概念:運算符的重載是特殊的函數(shù)重載,必須定義一個函數(shù),運算符的重載是特殊的函數(shù)重載,必須定義一個函數(shù),并通知并通知C+編譯器,當遇到該重載的運算符時調(diào)用此函數(shù)。編譯器,當遇到該重載的運算符時調(diào)用此函數(shù)。這個函數(shù)叫做運算符重載函數(shù),通常為類的成員函數(shù)。這個函數(shù)叫做運算符重載函數(shù),通常為類的成員函數(shù)。運算符重載函數(shù)定義:運算符重載函數(shù)定義:

54、返回值類型返回值類型 類名類名:operator重載的運算符重載的運算符(參數(shù)表參數(shù)表) operator是關(guān)鍵字,它與重載的運算符一起構(gòu)成函數(shù)名。是關(guān)鍵字,它與重載的運算符一起構(gòu)成函數(shù)名。因函數(shù)名的特殊性,因函數(shù)名的特殊性,C+編譯器可以將這類函數(shù)識別出來。編譯器可以將這類函數(shù)識別出來。細解運算符重載:細解運算符重載:復(fù)數(shù)類復(fù)數(shù)類+的重載:的重載:Complex Complex:operator+(Complex c) /顯式說明局部對象顯式說明局部對象 Complex Temp(Real+c.Real , Image+c.Image) ; /注意:直接寫對象注意:直接寫對象c的私有成員,不

55、用調(diào)的私有成員,不用調(diào)c的公有函數(shù)處理的公有函數(shù)處理 return Temp ;編譯器把表達式編譯器把表達式c2+c3解釋為:解釋為:c2.operator+(c3) ;函數(shù)函數(shù)c2.operator創(chuàng)建一個創(chuàng)建一個局部的局部的Complex對象對象Temp,把出,把出現(xiàn)在表達式中的兩個現(xiàn)在表達式中的兩個Complex類對象類對象c2和和c3的實部之和及虛的實部之和及虛部之和暫存其內(nèi),然后把這個局部對象返回,賦給部之和暫存其內(nèi),然后把這個局部對象返回,賦給Complex類對象類對象c(注意這里調(diào)用了復(fù)制構(gòu)造函數(shù)生成一個無名臨時對(注意這里調(diào)用了復(fù)制構(gòu)造函數(shù)生成一個無名臨時對象過渡)。參見圖象過

56、渡)。參見圖4.8。4.5 運算符的重載運算符的重載Temp.Real=Real+ c2.Real;Temp.Image=Image+ c3.Image;c=return(Temp);RealImagec3.Realc3.Image=+局部對象局部對象Temp當前對象當前對象c2對象對象c3圖圖4.8 顯式說明臨時對象的顯式說明臨時對象的“+”運算符執(zhí)行過程運算符執(zhí)行過程隱式返回計算結(jié)果:隱式返回計算結(jié)果: 省略省略局部的局部的Complex對象對象TempComplex Complex:operator+(double d) return Complex(Real+d , Image);/隱

57、式說明局部對象隱式說明局部對象在在return后面跟的表達式中調(diào)用的是后面跟的表達式中調(diào)用的是類的構(gòu)造函數(shù)類的構(gòu)造函數(shù),它為,它為無無名對象名對象賦值(初始化),返回值就是該無名對象。賦值(初始化),返回值就是該無名對象。 4.5 運算符的重載運算符的重載說明:說明:Complex Complex:operator+(Complex c) Complex Temp(Real+c.Real , Image+c.Image) ; return Temp ;當成員函數(shù)的參數(shù)為同一類(當成員函數(shù)的參數(shù)為同一類(class)的對象或它的引用,在函數(shù)體內(nèi)使)的對象或它的引用,在函數(shù)體內(nèi)使用參數(shù)對象的私有數(shù)

58、據(jù)成員時,可用對象名加成員訪問操作符點號進用參數(shù)對象的私有數(shù)據(jù)成員時,可用對象名加成員訪問操作符點號進行。行。從邏輯上講,每個對象有自己的成員函數(shù),訪問同類其他對象的私有數(shù)從邏輯上講,每個對象有自己的成員函數(shù),訪問同類其他對象的私有數(shù)據(jù)成員應(yīng)通過該對象的公有函數(shù),不能直接訪問。但在物理上只有一據(jù)成員應(yīng)通過該對象的公有函數(shù),不能直接訪問。但在物理上只有一個成員函數(shù)代碼,所以直接訪問是合理的。個成員函數(shù)代碼,所以直接訪問是合理的。僅在成員函數(shù)中可以這樣僅在成員函數(shù)中可以這樣做做?!纠纠?.8】復(fù)數(shù)類,應(yīng)用它進行復(fù)數(shù)運算復(fù)數(shù)類,應(yīng)用它進行復(fù)數(shù)運算4.5 運算符的重載運算符的重載引用作為參數(shù):引用作

59、為參數(shù):Complex Complex:operator+(const Complex &c) return Complex(real+c.real , Image+c.Image) ;注意:參數(shù)注意:參數(shù)采用對象的采用對象的引用引用而不是對象本身,調(diào)用時不再重而不是對象本身,調(diào)用時不再重新分配內(nèi)存建立一個復(fù)制的對象,函數(shù)效率會更高。而在引新分配內(nèi)存建立一個復(fù)制的對象,函數(shù)效率會更高。而在引用形式參數(shù)類型說明前加用形式參數(shù)類型說明前加const關(guān)鍵字,關(guān)鍵字,表示被引用的實參表示被引用的實參是不可改變的是不可改變的,如程序員不當心在函數(shù)體中重新賦值了被引如程序員不當心在函數(shù)體中重新賦值了被引用

60、的實參用的實參, C+編譯器會認為出錯編譯器會認為出錯。4.5 運算符的重載運算符的重載const引用進一步說明引用進一步說明:引用在內(nèi)部存放的是被引用對象的地址,不可尋址的值是不引用在內(nèi)部存放的是被引用對象的地址,不可尋址的值是不能引用的;當引用作為形參時,實參也不能使用不可尋址能引用的;當引用作為形參時,實參也不能使用不可尋址的值,更不可能進行類型轉(zhuǎn)換(如:實數(shù)轉(zhuǎn)換為整數(shù))。的值,更不可能進行類型轉(zhuǎn)換(如:實數(shù)轉(zhuǎn)換為整數(shù))。但是但是const引用引用不同,它是只讀的,為了絕對保證不會發(fā)生不同,它是只讀的,為了絕對保證不會發(fā)生誤改,編譯器實現(xiàn)誤改,編譯器實現(xiàn)const引用引用時,生成一個臨時

溫馨提示

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

評論

0/150

提交評論