一章C面向?qū)ο蟪绦蛟O(shè)計(jì)ppt課件_第1頁(yè)
一章C面向?qū)ο蟪绦蛟O(shè)計(jì)ppt課件_第2頁(yè)
一章C面向?qū)ο蟪绦蛟O(shè)計(jì)ppt課件_第3頁(yè)
一章C面向?qū)ο蟪绦蛟O(shè)計(jì)ppt課件_第4頁(yè)
一章C面向?qū)ο蟪绦蛟O(shè)計(jì)ppt課件_第5頁(yè)
已閱讀5頁(yè),還剩85頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 本章主要知識(shí)點(diǎn)本章主要知識(shí)點(diǎn) (1) C+面向?qū)ο蟮某绦驅(qū)嵗嫦驅(qū)ο蟮某绦驅(qū)嵗?(2) 類與對(duì)象類與對(duì)象 (3) 承繼與派生承繼與派生 (4) 運(yùn)算符重載運(yùn)算符重載 本章導(dǎo)讀本章導(dǎo)讀C言語(yǔ)是一種構(gòu)造化程序設(shè)計(jì)言語(yǔ),它是言語(yǔ)是一種構(gòu)造化程序設(shè)計(jì)言語(yǔ),它是面向過(guò)程的,在處置較小規(guī)模的程序時(shí)普面向過(guò)程的,在處置較小規(guī)模的程序時(shí)普通比較容易實(shí)現(xiàn),而當(dāng)程序規(guī)模較大時(shí),通比較容易實(shí)現(xiàn),而當(dāng)程序規(guī)模較大時(shí),C言語(yǔ)就顯示出了它的缺乏。在這種情況言語(yǔ)就顯示出了它的缺乏。在這種情況下下C+應(yīng)運(yùn)而生,應(yīng)運(yùn)而生,C+言語(yǔ)是從言語(yǔ)是從C言語(yǔ)演化言語(yǔ)演化而來(lái)的,它保管了而來(lái)的,它保管了C言語(yǔ)的一切優(yōu)點(diǎn),同言語(yǔ)的一切優(yōu)點(diǎn)

2、,同時(shí)也添加了面向?qū)ο蟮墓δ?。如今時(shí)也添加了面向?qū)ο蟮墓δ?。如今C+已已成為程序設(shè)計(jì)中運(yùn)用最廣泛的一種言語(yǔ)。成為程序設(shè)計(jì)中運(yùn)用最廣泛的一種言語(yǔ)。10.2 類與對(duì)象類與對(duì)象10.3 承繼與派生承繼與派生10.5 綜合實(shí)訓(xùn)綜合實(shí)訓(xùn)10.4 運(yùn)算符重載運(yùn)算符重載10.1 C+面向?qū)ο蟮某绦驅(qū)嵗嫦驅(qū)ο蟮某绦驅(qū)嵗?0.1.2 C+言語(yǔ)概述言語(yǔ)概述10.1.1 C+面向?qū)ο蟮某绦驅(qū)嵗嫦驅(qū)ο蟮某绦驅(qū)嵗?. C+程序?qū)嵗绦驅(qū)嵗?2)3. C+程序?qū)嵗绦驅(qū)嵗?3)1. C+程序?qū)嵗绦驅(qū)嵗?1)【例10.1】定義一個(gè)矩形類。程序名為l10_1.cpp。#includeclass rectangle /定

3、義一個(gè)矩形類 public: rectangle(float len,float wid) /構(gòu)造函數(shù) length=len; width=wid; float GetArea(); /聲明成員函數(shù),計(jì)算矩形面積 float GetPerimeter(); /聲明成員函數(shù),計(jì)算矩形周長(zhǎng) rectangle() /析構(gòu)函數(shù) private: float length; /私有數(shù)據(jù) float width;1.C+程序?qū)嵗?float rectangle:GetArea() /成員函數(shù)的詳細(xì)實(shí)現(xiàn)return length*width;float rectangle:GetPerimeter() /

4、成員函數(shù)的詳細(xì)實(shí)現(xiàn)return 2*(length+width);void main() float l,w; coutlw; rectangle x(l,w); /定義一個(gè)矩形類對(duì)象 coutx.GetArea()endl; coutx.GetPerimeter()endl; /調(diào)用成員函數(shù) 實(shí)例1的功能是定義一個(gè)矩形類,該類有長(zhǎng)和寬兩個(gè)數(shù)據(jù)成員,用來(lái)描畫(huà)矩形的靜態(tài)特征屬性,有構(gòu)造函數(shù)用來(lái)用初始化類對(duì)象,另外還有計(jì)算面積和周長(zhǎng)兩個(gè)成員函數(shù)作為該類的外部接口,供類外的程序訪問(wèn)。當(dāng)用戶輸入矩形的長(zhǎng)和寬之后,將構(gòu)造一個(gè)實(shí)例矩形,并輸出矩形的面積和周長(zhǎng)。例如用戶輸入5,6,那么輸出結(jié)果為:3022【

5、例10.2】類的派生。程序名為l10_2.cpp。 #includeclass rectangle /定義矩形類 public: void InitRect(float len,float wid) /定義類的成員函數(shù) length=len; width=wid; float GetArea(); float GetPerimeter(); private: /定義私有成員變量 float length; float width;float rectangle:GetArea() /成員函數(shù)實(shí)現(xiàn) return length*width;2.C+程序?qū)嵗?float rectangle:GetP

6、erimeter() /成員函數(shù)實(shí)現(xiàn)return 2*(length+width);class square:public rectangle /從矩形類中派生新類(正方形類)public: void InitSquare(float b)InitRect(b,b); /新增的成員函數(shù)(初始化; /正方形) void main()square x; /聲明正方形類對(duì)象x.InitSquare(8); /調(diào)用正方形類新增的成員函數(shù) coutx.GetArea()endl; /調(diào)用從矩形類中承繼下來(lái)的成員函數(shù)coutx.GetPerimeter()endl; /調(diào)用從矩形類中承繼下來(lái)的成員 /函數(shù)

7、(GetPerimeter)實(shí)例2的功能是先定義一個(gè)矩形類,然后從該矩形類中派生出一個(gè)新的正方形類正方形是矩形的一個(gè)特例。程序中先聲明一個(gè)正方形類對(duì)象,然后將其初始化為邊長(zhǎng)為8的正方形,再調(diào)用從矩形類中承繼下來(lái)的計(jì)算面積和周長(zhǎng)兩個(gè)函數(shù),計(jì)算出正方形的面積和周長(zhǎng)。該程序的輸出結(jié)果為:6432【例10.3】“+運(yùn)算符重載。程序名為l10_3.cpp。 #includeclass rectangle /定義一個(gè)矩形類public: rectangle(float len=0,float wid=0) /構(gòu)造函數(shù) length=len; width=wid; float GetArea()return

8、 length*width; /成員函數(shù)(計(jì)算面積) rectangle operator +(rectangle a2) /將+運(yùn)算符重載 rectangle a; /用于兩個(gè)矩形對(duì)象相加a.length=length;a.width=width+a2.GetArea()/length; return rectangle(a.length,a.width); 3.C+程序?qū)嵗?private: /私有成員變量 float length; float width;void main() rectangle x(5,9),y(5,6),z; /聲明類對(duì)象 cout第一個(gè)矩形面積為:x.GetAr

9、ea()endl; cout第二個(gè)矩形面積為:y.GetArea()endl; z=x+y; /對(duì)兩個(gè)矩形相加 cout兩個(gè)矩形面積之和為:z.GetArea()endl;實(shí)例3的功能是先定義一個(gè)矩形類,然后將“+運(yùn)算符重載為可以使兩個(gè)矩形類對(duì)象相加。該程序的輸出結(jié)果為:第一個(gè)矩形面積為:45第二個(gè)矩形面積為:30兩個(gè)矩形面積之和為:75 由于構(gòu)造化程序設(shè)計(jì)本身的缺乏,在20世紀(jì)80年代出現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計(jì)方法,C+言語(yǔ)也由此而產(chǎn)生。 面向?qū)ο蟪绦蛟O(shè)計(jì)Object-Oriented programming,簡(jiǎn)稱OOP設(shè)計(jì)的出發(fā)點(diǎn)就是為了能更直接的描畫(huà)客觀世界中存在的事物即對(duì)象以及它們之間的關(guān)

10、系。面向?qū)ο蟪绦蛟O(shè)計(jì)是對(duì)構(gòu)造化程序設(shè)計(jì)的承繼和開(kāi)展,它以為現(xiàn)實(shí)世界是由一系列彼此相關(guān)且能相互通訊的實(shí)體組成,這些實(shí)體就是面向?qū)ο蠓椒ㄖ械膶?duì)象,而對(duì)一些對(duì)象的共性的籠統(tǒng)描畫(huà),就是面向?qū)ο蠓椒ㄖ械念?。類是面向?qū)ο蟪绦蛟O(shè)計(jì)的中心。 C+是目前最流行的面向?qū)ο蟪绦蛟O(shè)計(jì)言語(yǔ)。它在C言語(yǔ)的根底上進(jìn)展了改良和擴(kuò)展,并添加了面向?qū)ο蟪绦蛟O(shè)計(jì)的功能,更適宜于開(kāi)發(fā)大型的軟件。C+是由貝爾實(shí)驗(yàn)室在C言語(yǔ)的根底開(kāi)發(fā)勝利的,C+保管了C言語(yǔ)原有的一切優(yōu)點(diǎn),同時(shí)與C言語(yǔ)又完全兼容。它既可以用于構(gòu)造化程序設(shè)計(jì),又可用于面向?qū)ο蟪绦蛟O(shè)計(jì),因此C+是一個(gè)功能強(qiáng)大的混合型程序設(shè)計(jì)言語(yǔ)。 C+最有意義的方面是支持面向?qū)ο蟪绦蛟O(shè)計(jì)的

11、特征。雖然與C言語(yǔ)的兼容性使得C+具有雙重特點(diǎn),但它在概念上和C言語(yǔ)是完全不同的,學(xué)習(xí)C+應(yīng)該按照面向?qū)ο蟪绦虻乃枷肴ゾ帉?xiě)程序。10.2.2 類的構(gòu)造與封裝類的構(gòu)造與封裝10.2.1 面向?qū)ο蟮母靖拍蠲嫦驅(qū)ο蟮母靖拍?0.2.3 創(chuàng)建對(duì)象創(chuàng)建對(duì)象10.2.4 友元友元10.2.5 模板模板10.2.6 程序?qū)嵱?xùn)程序?qū)嵱?xùn)1. 對(duì)象 從普通意義上講,客觀世界中任何一個(gè)事物都可以看成是一個(gè)對(duì)象。例如一本書(shū),一名學(xué)生等。對(duì)象具有本人的靜態(tài)特征和動(dòng)態(tài)特征。靜態(tài)特征可以用某種數(shù)據(jù)來(lái)描畫(huà),如一名學(xué)生的身高、年齡、性別等;動(dòng)態(tài)特征是對(duì)象所表現(xiàn)的行為或具有的功能,如學(xué)生學(xué)習(xí)、運(yùn)動(dòng)、休憩等。 面向?qū)ο蠓椒ㄖ械?/p>

12、對(duì)象是系統(tǒng)中用來(lái)描畫(huà)客觀事物的一個(gè)實(shí)體,它是用來(lái)構(gòu)成系統(tǒng)的一個(gè)根本單位,對(duì)象由一組屬性和一組行為構(gòu)成。屬性是用來(lái)描畫(huà)對(duì)象靜態(tài)特征的數(shù)據(jù)項(xiàng),行為是用來(lái)描畫(huà)對(duì)象動(dòng)態(tài)特征的操作序列。 許多對(duì)象具有一樣的構(gòu)造和特性,例如不論是數(shù)學(xué)書(shū)還是化學(xué)書(shū),它們都具有大小、定價(jià)、編者等特性。在現(xiàn)實(shí)生活中,我們通常將具有一樣性質(zhì)的事物歸納、劃分成一類,例如數(shù)學(xué)書(shū)和化學(xué)書(shū)都屬于書(shū)這一類。同樣在面向?qū)ο蟪绦蛟O(shè)計(jì)中也會(huì)采用這種方法。面向?qū)ο蠓椒ㄖ械念愂蔷哂幸粯訉傩院托袨榈囊唤M對(duì)象的集合。 類代表了一組對(duì)象的共性和特征,類是對(duì)象的籠統(tǒng),而對(duì)象是類的詳細(xì)實(shí)例。例如,家具設(shè)計(jì)師按照家具的設(shè)計(jì)圖做成一把椅子,那么設(shè)計(jì)圖就好比是一個(gè)

13、類,而做出來(lái)的椅子那么是該類的一個(gè)對(duì)象,一個(gè)詳細(xì)實(shí)例。拿【例10.1】中定義的矩形類來(lái)說(shuō),該類只是一切矩形的一個(gè)藍(lán)本,它只是代表了矩形的一些特征,而該類的實(shí)例那么是一個(gè)特定的矩形。2類1類的封裝類的封裝就是將對(duì)象的屬性和行為結(jié)合成一個(gè)獨(dú)立的實(shí)體,并盡能夠隱蔽對(duì)象的內(nèi)部細(xì)節(jié),對(duì)外構(gòu)成一道屏障,只保管有限的對(duì)外接口使之和外界發(fā)生聯(lián)絡(luò)。類的成員包括數(shù)據(jù)成員和成員函數(shù),分別描畫(huà)類所表達(dá)問(wèn)題的屬性和行為。對(duì)類成員的訪問(wèn)加以控制就構(gòu)成了類的封裝,這種控制是經(jīng)過(guò)設(shè)置成員的訪問(wèn)權(quán)限來(lái)實(shí)現(xiàn)的。在面向?qū)ο蟪绦蛟O(shè)計(jì)中,經(jīng)過(guò)封裝將一部分行為作為外部接口,而將數(shù)據(jù)和其它行為進(jìn)展有效的隱蔽,就可以到達(dá)對(duì)數(shù)據(jù)訪問(wèn)權(quán)限的合理

14、控制。把整個(gè)程序中不同部分的相互影響減少到最低限制。2類的定義類定義的普通格式為:class 類稱號(hào)public: 公有數(shù)據(jù)和成員函數(shù) /*外部接口*/protected: 維護(hù)數(shù)據(jù)的成員函數(shù)private: 私有數(shù)據(jù)和成員函數(shù);關(guān)鍵字class闡明了類定義的開(kāi)場(chǎng),類中一切的內(nèi)容用大括號(hào)括起來(lái)。類的成員可分為三種級(jí)別的訪問(wèn)權(quán)限:public公有的:闡明該成員是公有的,它不但可以被類的成員函數(shù)訪問(wèn),而且可以被外界訪問(wèn),所以說(shuō)公有類型定義了類的外部接口。Protected維護(hù)的:闡明該成員只能被該類的成員函數(shù)和該類的派生類的成員函數(shù)訪問(wèn)。Private私有的:闡明該成員只能被類的成員函數(shù)訪問(wèn),外界

15、不能直接訪問(wèn)它。類的數(shù)據(jù)成員普通都應(yīng)該聲明為私有成員。3類的成員函數(shù)類的成員函數(shù)描畫(huà)的是類的行為。定義類時(shí)在類定義體中給出函數(shù)的聲明,闡明函數(shù)的參數(shù)列表和前往值類型,而函數(shù)的詳細(xì)實(shí)現(xiàn)普通在類定義體之外給出。下面是類外定義成員函數(shù)的普通格式:前往值類型 類名:類成員函數(shù)名(參數(shù)列表) 函數(shù)體其中:稱為作用域分辨符。用它可以限制要訪問(wèn)的成員所在的類的稱號(hào)。在建立一個(gè)對(duì)象時(shí),經(jīng)常需求作一些初始化任務(wù),而當(dāng)對(duì)象運(yùn)用終了時(shí),又需求作一些清理任務(wù)。在C+中提供了兩個(gè)特殊的成員函數(shù)來(lái)完成這兩項(xiàng)任務(wù),那就是構(gòu)造函數(shù)和析構(gòu)函數(shù)。構(gòu)造函數(shù)的作用就是在對(duì)象在被創(chuàng)建時(shí)利用特定的值構(gòu)造對(duì)象,將對(duì)象初始化。構(gòu)造函數(shù)完成的

16、是一個(gè)從普通到詳細(xì)的過(guò)程。需求留意的是構(gòu)造函數(shù)同其它的成員函數(shù)不同,它不需求用戶觸發(fā),而是在創(chuàng)建對(duì)象時(shí)由系統(tǒng)自動(dòng)調(diào)用,其它任何過(guò)程都無(wú)法再調(diào)用構(gòu)造函數(shù)。構(gòu)造函數(shù)的函數(shù)名必需與類名一樣,而且不能有前往值,也不需加void類型聲明。構(gòu)造函數(shù)可以帶參數(shù)也可以不帶參數(shù)。構(gòu)造函數(shù)普通定義為公有類型。4構(gòu)造函數(shù)和析構(gòu)函數(shù)析構(gòu)函數(shù)也是類的一個(gè)公有成員函數(shù),其作用與構(gòu)造函數(shù)正好相反,它是用來(lái)在對(duì)象被刪除前進(jìn)展一些清理任務(wù)。析構(gòu)函數(shù)調(diào)用之后,對(duì)象被吊銷了,相應(yīng)的內(nèi)存空間也將被釋放。析構(gòu)函數(shù)名也應(yīng)與類名一樣,只是函數(shù)名前加一個(gè)波浪符“,以區(qū)別于構(gòu)造函數(shù)。析構(gòu)函數(shù)不能有任何參數(shù),且不能有前往值。假設(shè)不進(jìn)展顯式闡明,

17、系統(tǒng)會(huì)自動(dòng)生成缺省的析構(gòu)函數(shù),所以一些簡(jiǎn)單的類定義中沒(méi)有顯式的析構(gòu)函數(shù)。5構(gòu)造函數(shù)與析構(gòu)函數(shù)運(yùn)用實(shí)例【例10.4】程序名為l10_4.cpp。#includeclass A /定義類A public: A() cout“構(gòu)造函數(shù)被調(diào)用endl; /構(gòu)造函數(shù) void disp() /成員函數(shù) cout“構(gòu)造函數(shù)與析構(gòu)函數(shù)運(yùn)用舉例endl; A() /析構(gòu)函數(shù) cout析構(gòu)函數(shù)被調(diào)用endl; ;程序在聲明A類的對(duì)象時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù),因此先執(zhí)行構(gòu)造函數(shù)中的輸出語(yǔ)句,輸出“構(gòu)造函數(shù)被調(diào)用,接下來(lái)調(diào)用disp成員函數(shù),執(zhí)行disp成員函數(shù)中的輸出語(yǔ)句,輸出“構(gòu)造函數(shù)與析構(gòu)函數(shù)運(yùn)用舉例,最后

18、程序在退出前由系統(tǒng)自動(dòng)調(diào)用析構(gòu)函數(shù),執(zhí)行析構(gòu)函數(shù)中的輸出語(yǔ)句,輸出“析構(gòu)函數(shù)被調(diào)用,因此程序的輸出結(jié)果為:構(gòu)造函數(shù)被調(diào)用構(gòu)造函數(shù)與析構(gòu)函數(shù)運(yùn)用舉例析構(gòu)函數(shù)被調(diào)用void main() A a; /聲明類對(duì)象,自動(dòng)調(diào)用構(gòu)造函數(shù) a.disp(); /調(diào)用成員函數(shù),對(duì)象運(yùn)用終了時(shí) /自動(dòng)調(diào)用析構(gòu)函數(shù)6.實(shí)例分析 經(jīng)過(guò)運(yùn)用數(shù)組,我們可以對(duì)大量的數(shù)據(jù)和對(duì)象進(jìn)展有效的管理,但對(duì)于許多程序,在運(yùn)轉(zhuǎn)之前,我們并不能確切地知道數(shù)組中會(huì)有多少個(gè)元素。例如,一個(gè)網(wǎng)絡(luò)中有多少個(gè)可用節(jié)點(diǎn),一個(gè)CAD系統(tǒng)中會(huì)用到多少個(gè)外形等。假設(shè)數(shù)組開(kāi)的太大會(huì)呵斥很大的浪費(fèi),假設(shè)數(shù)組較小那么又影響大量數(shù)據(jù)的處置。在C+中,動(dòng)態(tài)內(nèi)存分配

19、技術(shù)可以保證我們?cè)诔绦蜻\(yùn)轉(zhuǎn)過(guò)程中按實(shí)踐需求懇求適量的內(nèi)存,運(yùn)用終了后再進(jìn)展釋放。這種在程序運(yùn)轉(zhuǎn)過(guò)程中懇求和釋放存儲(chǔ)單元的過(guò)程稱為創(chuàng)建對(duì)象和刪除對(duì)象。1new運(yùn)算符C+用new運(yùn)算符來(lái)創(chuàng)建對(duì)象。運(yùn)算符new的功能是動(dòng)態(tài)創(chuàng)建對(duì)象,其語(yǔ)法方式為: new 類型名(初值列表);該語(yǔ)句的功能是在程序運(yùn)轉(zhuǎn)過(guò)程中懇求用于存放指定類型的內(nèi)存空間,并用初值列表中給出的值進(jìn)展初始化。假設(shè)創(chuàng)建的對(duì)象是普通變量,初始化任務(wù)就是賦值,假設(shè)創(chuàng)建的對(duì)象是某一個(gè)類的實(shí)例對(duì)象,那么要根據(jù)實(shí)踐情況調(diào)用該類的構(gòu)造函數(shù)。例如:int *p; p=new int(100); /賦值給指針變量例如:rectangle *r; r=new

20、 rectangle(5,6); /調(diào)用矩形類的構(gòu)造函數(shù)假設(shè)創(chuàng)建的對(duì)象是數(shù)組類型,那么應(yīng)按照數(shù)組的構(gòu)造來(lái)創(chuàng)建,其語(yǔ)法方式為:一維數(shù)組:new 類型名下標(biāo);當(dāng)數(shù)組為一維數(shù)組時(shí),下標(biāo)為數(shù)組為元素的個(gè)數(shù),動(dòng)態(tài)分配內(nèi)存時(shí)不能指定數(shù)組元素的初值。假設(shè)內(nèi)存懇求勝利,前往一個(gè)指向新分配內(nèi)存的首地址的指定類型的指針,假設(shè)失敗前往0。例如:int *p; p=new int10;多維數(shù)組:new 類型名下標(biāo)1下標(biāo)2;當(dāng)數(shù)組為多維數(shù)組時(shí),前往一個(gè)指向新分配內(nèi)存的首地址的指針,但該指針的類型為指定類型的數(shù)組。數(shù)組元素的個(gè)數(shù)為除最左邊一維外下標(biāo)的乘積。例如:int (*p)5; p=new int105;2delet

21、e運(yùn)算符運(yùn)算符delete的功能是刪除由new運(yùn)算符創(chuàng)建的對(duì)象,釋放指針指向的內(nèi)存空間,其語(yǔ)法方式為:delete 指針名;例如:int *p; p=new int(100); delete p;假設(shè)new 運(yùn)算符創(chuàng)建的對(duì)象是數(shù)組,那么刪除對(duì)象時(shí)應(yīng)運(yùn)用的語(yǔ)法方式為:delete 指針名;例如:int *p; p=new int10; delete p;3C+程序?qū)嵗纠?0.5】類對(duì)象的創(chuàng)建與刪除。程序名為l10_5.cpp。#includeclass rectangle /定義一個(gè)矩形類 public: rectangle(float len,float wid) /構(gòu)造函數(shù) length=

22、len; width=wid; float GetArea(); /成員函數(shù)private: float length; float width;float rectangle:GetArea() /成員函數(shù)實(shí)現(xiàn) return length*width;void main() rectangle *r; /定義指向rectangle類的指針變量r r=new rectangle(10,5); /創(chuàng)建rectangle類對(duì)象 coutGetArea()endl; delete r; /刪除對(duì)象4C+程序?qū)嵗治龀绦蛑邢冉⒘艘粋€(gè)rectangle類,然后在主函數(shù)中定義了一個(gè)指向rectangle

23、類的指針變量r,用new在內(nèi)存中開(kāi)辟一段空間以存放rectangle類對(duì)象,這時(shí)會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù)來(lái)初始化該對(duì)象,接下來(lái)運(yùn)用指向rectangle類的指針變量r得到矩形的面積,最后用delete刪除對(duì)象,釋放該空間。2. 友元函數(shù)友元函數(shù)3. 友元類友元類1. 友元概述友元概述 在程序設(shè)計(jì)過(guò)程中,假設(shè)用戶建立了一個(gè)類,這個(gè)類的數(shù)據(jù)成員被定義為私有,這時(shí)假設(shè)想把該數(shù)據(jù)存取到某個(gè)函數(shù)非該類的成員函數(shù)中,那么這樣作一定是不被允許的。但是有時(shí)候一些非成員函數(shù)需求親身訪問(wèn)類中的某些私有數(shù)據(jù),那么這時(shí)候就需求用到友元。友元提供了不同類或?qū)ο蟮某蓡T函數(shù)之間、類的成員函數(shù)與普通函數(shù)之間進(jìn)展數(shù)據(jù)共享的機(jī)制。經(jīng)過(guò)

24、友元,一個(gè)普通函數(shù)或類的成員函數(shù)可以訪問(wèn)到封裝于其它類中的數(shù)據(jù)。友元的作用在于提高程序的運(yùn)轉(zhuǎn)效率,但同時(shí)它也破壞了類的封裝性和隱藏性,使得非成員函數(shù)可以訪問(wèn)類的私有成員。1友元概述 友元函數(shù)是在類定義中由關(guān)鍵字friend修飾的非成員函數(shù)。友元函數(shù)可以是一個(gè)普通函數(shù),也可以其它類中的一個(gè)成員函數(shù),它不是本類的成員函數(shù),但它可以訪問(wèn)本類的私有成員和維護(hù)成員。友元函數(shù)需求在類的內(nèi)部進(jìn)展聲明。其格式如下: class 類稱號(hào) 類的成員聲明 friend 前往類型 友元函數(shù)名(參數(shù)列表); 類的成員聲明 2友元函數(shù)【例10.6】運(yùn)用友元函數(shù)計(jì)算兩點(diǎn)間的間隔。程序名為l10_6.cpp。#include

25、 #include class Point /定義Point類(點(diǎn))public: Point(double xx,double yy) /構(gòu)造函數(shù) x=xx; y=yy; void Getxy(); /成員函數(shù)聲明 friend double Distance(Point &a,Point &b);/友元函數(shù)聲明private: double x,y; /私有成員(點(diǎn)的坐標(biāo));void Point:Getxy() /成員函數(shù)實(shí)現(xiàn)cout“(x“,y“); /輸出點(diǎn)的坐標(biāo)double Distance(Point &a, Point &b) /友元函數(shù)實(shí)現(xiàn) do

26、uble dx = a.x - b.x; /訪問(wèn)私有成員 double dy = a.y - b.y; return sqrt(dx*dx+dy*dy); /兩點(diǎn)間隔void main() Point p1(3.0, 4.0), p2(6.0, 8.0); /定義Point類對(duì)象 p1.Getxy(); /調(diào)用成員函數(shù) p2.Getxy(); cout“nThe istance is Distance(p1, p2)endl; /調(diào)用友元函數(shù) 實(shí)例闡明:程序在類定義體內(nèi)聲明了友元函數(shù)的原形,在聲明時(shí)函數(shù)名前加friend關(guān)鍵字進(jìn)展修飾,友元函數(shù)的詳細(xì)實(shí)如今類外給出,可以看出友元函數(shù)經(jīng)過(guò)對(duì)象名可

27、直接訪問(wèn)Point類的私有成員,而不需求借用外部接口Getxy。在調(diào)用友元函數(shù)時(shí)同調(diào)用普通函數(shù)一樣,采用直接調(diào)用方法,而不需求像調(diào)用類的成員函數(shù)那樣必需經(jīng)過(guò)對(duì)象。該程序的輸出結(jié)果為:(3,4)(6,8)The distance is 53友元類同函數(shù)一樣,類也可以聲明為另一個(gè)類的友元,這時(shí)稱為友元類。當(dāng)一個(gè)類作為另一個(gè)類的友元時(shí),這個(gè)類的一切成員函數(shù)都將是另一個(gè)類的友元函數(shù)。友元類的普通格式為:class 類A 類A的成員聲明 friend class 類B; 類A的成員聲明【例10.7】程序名為l10_7.cpp。#includeclass A /定義類A public:A(int xx,i

28、nt yy) /類A的構(gòu)造函數(shù)x=xx;y=yy;friend class B; /聲明類B為類A的友元類private:int x,y;class B /定義類Bpublic:void disp1(A s) coutdisp1調(diào)用了類A的私有成員x:s.xendl; /類B的成員函數(shù)訪問(wèn)類A的私有成員 程序中定義了A和B兩個(gè)類,其中類B為類A的友元類,定義時(shí)在類A的內(nèi)部聲明類B,而類B的詳細(xì)實(shí)現(xiàn)過(guò)程是在類A的外部。類B中有兩個(gè)成員函數(shù)disp1和disp2,根據(jù)友元類的概念,這兩個(gè)成員函數(shù)都成為類A的友元函數(shù),所以它們都可以訪問(wèn)類A的私有成員x和y。該程序的輸出結(jié)果為:disp1調(diào)用了類A的

29、私有成員x:5disp2調(diào)用了類A的私有成員y:9 void disp2(A s) coutdisp2調(diào)用了類A的私有成員y:s.yendl; /類B的成員函數(shù)訪問(wèn)類A的私有成員;void main() A a(5,9); /聲明A類對(duì)象 B b; /聲明B類對(duì)象 b.disp1(a); /調(diào)用B類的成員函數(shù) b.disp2(a);前面章節(jié)中我們學(xué)習(xí)了重載函數(shù),運(yùn)用重載函數(shù)可以處置多種數(shù)據(jù)類型,但是即使設(shè)計(jì)為重載函數(shù)也只是運(yùn)用一樣的函數(shù)名,函數(shù)體依然要分別定義。運(yùn)用函數(shù)模板那么不同了,函數(shù)模板可以用來(lái)創(chuàng)建一個(gè)通用功能的函數(shù),以支持多種不同的參數(shù),簡(jiǎn)化重載函數(shù)的函數(shù)體設(shè)計(jì)。函數(shù)模板的定義方式為:

30、 template 函數(shù)定義1函數(shù)模板【例10.8】運(yùn)用函數(shù)模板。程序名為l10_8.cpp。#include template T max(T x,T y) /定義模板函數(shù) return xy?x:y;void main() int a=6,b=8; coutmax(a,b)endl; double m=10.5,n=8.5; coutmax(m,n)endl;程序中首先定義模板函數(shù)max用來(lái)獲得兩個(gè)數(shù)中相對(duì)較大的一個(gè),然后主函數(shù)調(diào)用該函數(shù),此時(shí)編譯器將根據(jù)實(shí)參的類型推導(dǎo)出函數(shù)模板的類型參數(shù)。例如,當(dāng)調(diào)用max(a,b)時(shí),由于a,b為整型變量,所以模板中類型參數(shù)T為int,而調(diào)用max(m

31、,n)時(shí),由于m,n為double類型,所以模板中類型參數(shù)T為double。2類模板 運(yùn)用類模板運(yùn)用戶可以為類定義一種方式,使得類中的某些數(shù)據(jù)成員、某些成員函數(shù)的參數(shù)、某些成員函數(shù)的前往值能取恣意類型,包括用戶自定義的或系統(tǒng)預(yù)定義的。為了定義類模板,應(yīng)在類的聲明之前加上一個(gè)模板參數(shù)表,參數(shù)表里的方式類型名用來(lái)闡明成員數(shù)據(jù)和成員函數(shù)的類型。類模板的定義方式為: template 類定義 類模板本身不產(chǎn)生代碼,它指定類的一個(gè)家族,當(dāng)被其它代碼援用時(shí),類模板才根據(jù)援用的需求產(chǎn)生代碼。【例10.9】運(yùn)用類模板。程序名為l10_9.cpp。#includetemplate /類模板,實(shí)現(xiàn)對(duì)恣意數(shù)據(jù)類型的

32、存取class rectangle /定義一個(gè)矩形類rectanglepublic: rectangle(T len,T wid) /構(gòu)造函數(shù) length=len; width=wid; T GetArea(); /聲明成員函數(shù),計(jì)算矩形面積 T GetPerimeter(); /聲明成員函數(shù),計(jì)算矩形周長(zhǎng)private: T length; /私有數(shù)據(jù),用于恣意類型 T width; template T rectangle:GetArea() /成員函數(shù)的詳細(xì)實(shí)現(xiàn) return length*width;template T rectangle:GetPerimeter() /成員函數(shù)的

33、詳細(xì)實(shí)現(xiàn) return 2*(length+width);void main() rectangle x(4,6); /定義rectangle對(duì)象(成員函數(shù)前往值為int型) rectangle y(5.5,3.8); /定義rectangle對(duì)象(成員函數(shù)前往值為double型) cout“x的面積是:x.GetArea()endl; cout“x的周長(zhǎng)是:x.GetPerimeter()endl; cout“y的面積是:y.GetArea()endl; couty的周長(zhǎng)是:y.GetPerimeter()endl; 程序的執(zhí)行結(jié)果為:x的面積是:24x的周長(zhǎng)是:20y的面積是:20.9y的

34、周長(zhǎng)是:18.6【例10.10】 日期類運(yùn)用程序舉例。程序名為l10_10.cpp。#includeclass TDate /日期類的定義public: TDate(int y, int m, int d); /構(gòu)造函數(shù) int IsLeapYear(); /判別閏年 void show(); /顯示日期 friend int Getyear(TDate date); /友元函數(shù),前往年 private: int year,month,day; TDate:TDate(int y, int m, int d) /構(gòu)造函數(shù)實(shí)現(xiàn) year=y; month=m; day=d;1C+程序?qū)嵗齣nt

35、TDate:IsLeapYear() return(year%4=0 & year%100!=0) | (year%400=0);void TDate:show() coutyear“年month“月day“日show(); /調(diào)用成員函數(shù) if(date-IsLeapYear() coutGetyear(*date)“年是閏年endl; /調(diào)用友元函數(shù) else coutGetyear(*date)“年不是閏年endl; delete date; /刪除對(duì)象程序可以分為三個(gè)部分,第一部分是CDate類的定義,第二部分是成員函數(shù)的實(shí)現(xiàn),第三部分是主函數(shù)。類定義中依然是由成員數(shù)據(jù)和成員函

36、數(shù)組成,其中成員函數(shù)作為外部接口。程序中為了闡明友元的運(yùn)用,引入了友元函數(shù),這里可以換成類的成員函數(shù),讀者可以本人試一試。主函數(shù)中,在定義了指向TDate類型的指針變量之后,運(yùn)用new運(yùn)算符創(chuàng)建對(duì)象,程序終了時(shí)又運(yùn)用delete運(yùn)算符刪除了對(duì)象,釋放了內(nèi)存空間。這種編程方法在以后的程序設(shè)計(jì)中會(huì)經(jīng)常遇到,讀者應(yīng)該習(xí)慣于運(yùn)用new和delete 進(jìn)展動(dòng)態(tài)內(nèi)存管理。2C+程序?qū)嵗治?0.3.2 10.3.2 派生類派生類10.3.1 10.3.1 承繼與派生的概承繼與派生的概念念10.3.4 10.3.4 虛函數(shù)虛函數(shù)10.3.3 10.3.3 派生類的構(gòu)造函數(shù)與析構(gòu)函派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù)數(shù)

37、10.3.5 10.3.5 程序?qū)嵱?xùn)程序?qū)嵱?xùn) 面向?qū)ο蟪绦蛟O(shè)計(jì)過(guò)程中,一個(gè)很重要的特點(diǎn)就是代碼的可重用性。C+是經(jīng)過(guò)承繼這一機(jī)制來(lái)實(shí)現(xiàn)代碼重用的。所謂承繼指的是類的承繼,就是在原有類的根底上建立一個(gè)新類,新類將從原有類那里得到已有的特性。例如,現(xiàn)有一個(gè)學(xué)生類,定義了學(xué)號(hào)、姓名、性別、年齡四項(xiàng)內(nèi)容,假設(shè)我們除了用到以上四項(xiàng)內(nèi)容外,還需求用到和地址等信息,我們就可以在學(xué)生類的根底上再添加相關(guān)的內(nèi)容,而不用重頭再定義一個(gè)類。 換個(gè)角度來(lái)說(shuō),從已有類產(chǎn)生新類的過(guò)程就是類的派生。類的承繼與派生允許在原有類的根底上進(jìn)展更詳細(xì)、更詳細(xì)的修正和擴(kuò)展。新的類由原有的類產(chǎn)生,包含了原有類的關(guān)鍵特征,同時(shí)也參與了本

38、人所特有的性質(zhì)。新類承繼了原有類,原有類派生出新類。原有的類我們稱為基類或父類,而派生出的類我們稱為派生類或子類。比如:一切的windows運(yùn)用程序都有一個(gè)窗口,可以說(shuō)它們都是從一個(gè)窗口類中派生出來(lái)的,只不過(guò)有的運(yùn)用程序用于文字處置,有的那么運(yùn)用于圖像顯示。 類的承繼與派生的層次構(gòu)造是人們對(duì)自然界中事物進(jìn)展分類分析認(rèn)識(shí)過(guò)程在程序設(shè)計(jì)中的表達(dá)?,F(xiàn)實(shí)世界中的事物都是相互聯(lián)絡(luò)、相互作用的,人們?cè)谡J(rèn)識(shí)過(guò)程中,根據(jù)它們的實(shí)踐特征,抓住其共同特性和細(xì)小差別,利用分類的方法進(jìn)展分析和描畫(huà)。 如以下圖是生物類的一種承繼圖,最高層次的生物類是籠統(tǒng)程度最高的,是最具有普遍意義的概念,下層具有上層的特性,同時(shí)也參與

39、了本人新的特性,而最下層是最詳細(xì)的。這個(gè)層次構(gòu)造中,由上到下,是一個(gè)詳細(xì)化、特殊化的過(guò)程,由下到上,是一個(gè)籠統(tǒng)化的過(guò)程。上下層之間就可以看作是基類與派生類的關(guān)系。定義派生類的普通方式為: class 派生類名:承繼方式 基類名 派生類成員定義 ; 承繼方式指派生類的訪問(wèn)控制方式,可以是public公有承繼,protected維護(hù)承繼和private私有承繼。承繼方式可以省略不寫(xiě),缺省值為private。 派生類在派生過(guò)程中,需求閱歷吸收基類成員、改造基類成員和添加新成員三個(gè)步驟。其中,吸收基類成員主要目的是實(shí)現(xiàn)代碼重用,但應(yīng)該留意的是基類的構(gòu)造函數(shù)和析構(gòu)函數(shù)是不能被承繼下來(lái)的;改造基類成員那么

40、主要是對(duì)基類數(shù)據(jù)成員或成員函數(shù)的覆蓋,就是在派生時(shí)定義一個(gè)和基類數(shù)據(jù)或函數(shù)同名的成員,這樣基類中的成員就被交換為派生類中的同名成員;添加新成員是對(duì)類功能的擴(kuò)展,添加必要的數(shù)據(jù)成員和成員函數(shù)來(lái)實(shí)現(xiàn)新增功能。 在承繼中,派生類承繼了除構(gòu)造函數(shù)和析構(gòu)函數(shù)以外的全部成員。對(duì)于從基類承繼過(guò)來(lái)的成員的訪問(wèn)并不是簡(jiǎn)單的把基類的私有成員、維護(hù)成員和公有成員直接作為私有成員、維護(hù)成員和公有成員,而是要根據(jù)基類成員的訪問(wèn)權(quán)限和派生類的承繼方式共同決議。1公有承繼當(dāng)類的承繼方式為public時(shí),基類的公有public成員和維護(hù)protected成員依然成為派生類的公有成員和維護(hù)成員,而基類的私有成員不能被派生類訪問(wèn)

41、。2維護(hù)承繼當(dāng)類的承繼方式為protected時(shí),基類的公有public成員和維護(hù)protected成員將成為派生類的維護(hù)成員,而基類的私有成員不能被派生類訪問(wèn)。3私有承繼當(dāng)類的承繼方式為private時(shí),基類的公有public成員和維護(hù)protected成員將成為派生類的私有成員,而基類的私有成員不能被派生類訪問(wèn)。(看以下圖:)如10.1.1中實(shí)例2先定義了一個(gè)矩形類,然后又從矩形類中派生出正方形類,正方形是矩形的一個(gè)特例,矩形類實(shí)例化一個(gè)矩形對(duì)象時(shí)需求用到長(zhǎng)和寬兩個(gè)參數(shù),而正方形那么只需求用到邊長(zhǎng)一個(gè)參數(shù),所以在派生過(guò)程中新增了成員函數(shù)InitSquare用來(lái)完成初始化任務(wù)。InitSqu

42、are函數(shù)實(shí)現(xiàn)過(guò)程中用到了基類的成員函數(shù)InitRect,由于InitRect函數(shù)為基類的公有成員,所以在派生類中可以被訪問(wèn)。假設(shè)InitSquare函數(shù)的實(shí)現(xiàn)過(guò)程改為如下語(yǔ)句:void InitSquare (float b) length=b; width=b; 該程序是不能被編譯經(jīng)過(guò)的,由于派生類是不能訪問(wèn)基類的私有成員的。另外,該程序運(yùn)用的承繼方式為公有承繼,因此基類中的公有成員都被派生類吸收并成為公有成員。 承繼的目的是為了開(kāi)展,派生類承繼了基類的成員,實(shí)現(xiàn)了代碼重用,這只是一部分,而代碼的擴(kuò)展才是最主要的,只需添加新的成員,參與新的功能,類的派生才有實(shí)踐意義。我們知道,基類的構(gòu)造函

43、數(shù)和析構(gòu)函數(shù)是不能被承繼的,因此假設(shè)要對(duì)新增成員進(jìn)展初始化,就必需參與新的構(gòu)造函數(shù)。同樣,對(duì)派生類對(duì)象的掃尾、清理任務(wù)也需求引入新的析構(gòu)函數(shù)。1派生類的構(gòu)造函數(shù)假設(shè)基類的對(duì)象包含對(duì)成員的初始化,而在建立派生類對(duì)象時(shí),由于基類的構(gòu)造函數(shù)不能被承繼而無(wú)法執(zhí)行,因此會(huì)使基類的成員未初始化,所以在設(shè)計(jì)派生類的構(gòu)造函數(shù)時(shí),不僅要思索派生類新增的數(shù)據(jù)成員的初始化,還該當(dāng)思索基類數(shù)據(jù)成員的初始化。 派生類構(gòu)造函數(shù)的普通格式為: 派生類構(gòu)造函數(shù)名參數(shù)列表:基類構(gòu)造函數(shù)名參數(shù)列表 派生類新增成員初始化語(yǔ)句; 將【例10.2】改為運(yùn)用構(gòu)造函數(shù)進(jìn)展初始化:【例10.11】程序名為l10_11.cpp。#includ

44、eclass rectangle /定義矩形類(基類) public: rectangle(float len,float wid) /基類的構(gòu)造函數(shù) length=len; width=wid; float GetArea(); float GetPerimeter(); private: /定義私有成員變量 float length; float width;float rectangle:GetArea() /基類成員函數(shù)實(shí)現(xiàn) return length*width;float rectangle:GetPerimeter() /基類成員函數(shù)實(shí)現(xiàn) return 2*(length+wid

45、th);class rect:public rectangle /從矩形類中派生新類(正方形類)public: rect(float b):rectangle(b,b) /派生類的構(gòu)造函數(shù) ;void main() rect x(8); /聲明正方形類對(duì)象 coutx.GetArea()endl; /調(diào)用從矩形類中承繼 /下來(lái)的成員函數(shù)(GetArea) coutx.GetPerimeter()endl; /調(diào)用從矩形類中承繼下來(lái) /的成員函數(shù)(GetPerimeter) 程序的輸出結(jié)果為:64322派生類的析構(gòu)函數(shù)在派生過(guò)程中,基類的析構(gòu)函數(shù)也不能被承繼下來(lái),這就需求在派生類中自行定義。派生

46、類析構(gòu)函數(shù)的定義與沒(méi)有承繼關(guān)系的類的析構(gòu)函數(shù)完全一樣,只需擔(dān)任把派生類新增的成員的清理任務(wù)做好就夠了,系統(tǒng)會(huì)自動(dòng)調(diào)用基類的析構(gòu)函數(shù)對(duì)基類對(duì)象成員進(jìn)展清理。同構(gòu)造函數(shù)一樣,析構(gòu)函數(shù)在執(zhí)行過(guò)程中也要對(duì)基類進(jìn)展操作,它首先對(duì)派生類新增成員進(jìn)展清理,然后對(duì)基類進(jìn)展清理。這些清理任務(wù)分別是調(diào)用派生類析構(gòu)函數(shù)和調(diào)用基類析構(gòu)函數(shù)來(lái)完成的。 【例10.12】程序名為l10_12.cpp。#include class color /定義color類public: void paint()cout“No color.endl;class green:public color /由color派生出green類pub

47、lic: void paint()coutThe color is green.paint();程序執(zhí)行結(jié)果如右圖:程序中對(duì)象c和對(duì)象g的輸出結(jié)果都不難了解,但指針p曾經(jīng)指向了green類的對(duì)象,然而從輸出結(jié)果看調(diào)用的卻是color類的paint()函數(shù)。處理這個(gè)問(wèn)題的方法就是運(yùn)用虛函數(shù)。將上例color類改為如下運(yùn)用虛函數(shù)的方法:class color /定義color類public: virtual void paint()coutNo color.endl; /定義虛函數(shù);輸出結(jié)果如右圖: 以上實(shí)例闡明在C+中,假設(shè)一個(gè)函數(shù)被定義成虛函數(shù),那么,即使是運(yùn)用指向基類對(duì)象的指針來(lái)調(diào)用該成員函

48、數(shù),C+也能保證所調(diào)用的是正確的特定于實(shí)踐對(duì)象的成員函數(shù)。 運(yùn)用類的派生編程實(shí)如今屏幕上顯示某學(xué)生的選課信息。學(xué)生包括姓名和學(xué)號(hào)兩個(gè)屬性,選課信息包括課程稱號(hào)、任課教師和上課時(shí)間三個(gè)屬性,每名學(xué)生最多可選三門(mén)課。 由于學(xué)生包括兩個(gè)屬性,選課信息包括三個(gè)屬性,而這些屬性都可以用字符數(shù)組表示,那么抓住這個(gè)共性我們就可以思索建立一個(gè)基類base,使其具有兩個(gè)字符數(shù)組類型的成員變量,接下來(lái)我們就可以由該基類派生出學(xué)生類student和選課信息類classes。為了顯示相關(guān)信息,在派生的過(guò)程中,需求添加相應(yīng)的外部接口。程序的詳細(xì)實(shí)現(xiàn)代碼如下:【例10.14】程序名為l10_14.cpp。#include

49、#includeclass base /定義基類base private: char str120; char str210;public: base() base(char s1,char s2) strcpy(str1,s1); strcpy(str2,s2); void show1() coutstr1; void show2() coutstr2; ;class classes:public base /從基類派生課程類 private: char cname20; /課程稱號(hào) public: classes() classes(char cna,char cweek,char cte

50、a):base(cweek,ctea) /課程稱號(hào)、上課時(shí)間、任課教師strcpy(cname,cna);void show() coutcname“(; show1(); /課程稱號(hào)(任課教師,上課時(shí)間) cout“,; show2(); cout“); ;class student:public base /從基類派生學(xué)生類 private: classes cls3; /每名學(xué)生最多項(xiàng)選擇修3門(mén)課 int max; public: student() student(char sname,char sno):base(sname,sno)max=0; void selectcls(cla

51、sses c) /選課 clsmax=c; max+; void showcls() /顯示選課信息 cout“學(xué)生:; show1(); cout(; show2(); cout)endl選修課程:endl; for(int i=0;imax;i+) couti+1:; clsi.show(); coutendl; ;void main() student stu(黃雪菲,12345678); classes cls1(數(shù)據(jù)庫(kù)運(yùn)用,曲子研,星期三); classes cls2(C+程序設(shè)計(jì),胡小燕,星期二); classes cls3(數(shù)據(jù)構(gòu)造,江山,星期五); stu.selectcls(

52、cls1); stu.selectcls(cls2); stu.selectcls(cls3); stu.showcls();程序的執(zhí)行結(jié)果如右圖:10.4.2 運(yùn)算符重載規(guī)那么運(yùn)算符重載規(guī)那么10.4.1 重載運(yùn)算符重載運(yùn)算符10.4.3 類型轉(zhuǎn)換與轉(zhuǎn)換函數(shù)類型轉(zhuǎn)換與轉(zhuǎn)換函數(shù) 運(yùn)算符重載加強(qiáng)了C+ 言語(yǔ)的可擴(kuò)展性。在C+ 中,定義一個(gè)類就是定義了一個(gè)新類型。因此,類對(duì)象和變量一樣,可以作為參數(shù)傳送,也可以作為前往類型。在根本數(shù)據(jù)類型中,系統(tǒng)提供了許多預(yù)定義的運(yùn)算符,而實(shí)踐上,對(duì)于用戶自定義的類型比如類,也需求有類似的運(yùn)算操作,這就提出了對(duì)運(yùn)算符進(jìn)展重新定義,賦于已有符號(hào)以新的功能要求。 運(yùn)算

53、符重載的本質(zhì)是函數(shù)重載。所謂函數(shù)重載簡(jiǎn)單地說(shuō)就是賦給同一個(gè)函數(shù)名多個(gè)含義,C+中允許在一樣的作用域內(nèi)以一樣的名字定義幾個(gè)不同的函數(shù),可以是成員函數(shù),也可以是非成員函數(shù),定義重載函數(shù)時(shí)要求函數(shù)的參數(shù)或者至少有一個(gè)類型不同,或者個(gè)數(shù)不同,而對(duì)于前往值的類型可以一樣,也可以不同。對(duì)于每一個(gè)運(yùn)算符,都對(duì)應(yīng)于一個(gè)運(yùn)算符函數(shù)operator,例如“+對(duì)應(yīng)的運(yùn)算符函數(shù)是operator+。運(yùn)算符重載在實(shí)現(xiàn)過(guò)程中首先把指定的運(yùn)算符轉(zhuǎn)化為對(duì)運(yùn)算符函數(shù)的調(diào)用,再把運(yùn)算對(duì)象轉(zhuǎn)化為運(yùn)算符函數(shù)的實(shí)參,然后根據(jù)實(shí)參的類型來(lái)確定需求調(diào)用的運(yùn)算符函數(shù)。 例如在10.1.1實(shí)例3中,我們把“+重載為矩形類的成員函數(shù),那么就可直

54、接進(jìn)展兩個(gè)矩形類對(duì)象相加了??梢钥闯觯\(yùn)算符重載除了在函數(shù)聲明時(shí)運(yùn)用了關(guān)鍵字operatore之外,其它地方與類的普通成員函數(shù)沒(méi)什么區(qū)別,只不過(guò)它可以直接經(jīng)過(guò)運(yùn)算符和操作數(shù)的方式來(lái)完成函數(shù)的調(diào)用。 運(yùn)算符重載擴(kuò)展了運(yùn)算符原有的功能,如10.1.1實(shí)例3中對(duì)“+進(jìn)展了運(yùn)算符重載之后,“+的原有功能不變,對(duì)整型、浮點(diǎn)型數(shù)據(jù)的運(yùn)算依然遵照C+預(yù)定義的規(guī)那么,同時(shí)又添加了針對(duì)矩形類運(yùn)算的功能。“+作用于不同的對(duì)象上,就會(huì)導(dǎo)致不同的操作行為,具有了更廣泛的功能。運(yùn)算符重載的規(guī)那么如下: 1) C+中的運(yùn)算符除了少數(shù)幾個(gè)外,全部可以重載,而且只能重載已有的這些運(yùn)算符。 2) 重載之后運(yùn)算符的優(yōu)先級(jí)和結(jié)合性

55、堅(jiān)持不變。 3) 運(yùn)算符重載是針對(duì)新類型數(shù)據(jù)的實(shí)踐需求,對(duì)原有運(yùn)算符進(jìn)展適當(dāng)?shù)母脑臁F胀▉?lái)講,重載的功能應(yīng)與原有的功能相類似,不能改動(dòng)原有運(yùn)算符的操作對(duì)象個(gè)數(shù),同時(shí)至少有一個(gè)操作對(duì)象是自定義類型。不能重載的運(yùn)算符有五個(gè),它們是是類屬關(guān)系運(yùn)算符“.、指針運(yùn)算符“*、作用域運(yùn)算符“:、三目運(yùn)算符“?:和sizeof運(yùn)算符。運(yùn)算符的重載方式有兩種,重載為類的成員函數(shù)和重載為友元函數(shù)。重載為類的成員函數(shù)的普通方式為: 類稱號(hào) operator 運(yùn)算符(參數(shù)表) 函數(shù)體 重載為友元函數(shù)的普通方式為: friend 函數(shù)類型 operator 運(yùn)算符(參數(shù)表) 函數(shù)體 函數(shù)類型指定了重載運(yùn)算符的前往值類型

56、,operator是定義運(yùn)算符重載函數(shù)的關(guān)鍵字,運(yùn)算符是C+中可重載的運(yùn)算符。當(dāng)運(yùn)算符重載為類的成員函數(shù)時(shí),雙目運(yùn)算符僅有一個(gè)參數(shù),而單目運(yùn)算符那么不能顯式的闡明參數(shù)。 普通情況下,單目運(yùn)算符最好重載為成員函數(shù),雙目運(yùn)算符最好重載為友元函數(shù),雙目運(yùn)算符重載為友元函數(shù)比重載為成員函數(shù)更方便操作,但是,有的雙目運(yùn)算符重載為成員函數(shù)為好,例如,賦值運(yùn)算符。假設(shè)被重載為友元函數(shù),將會(huì)出現(xiàn)與賦值語(yǔ)義不一致的地方。 在C+中,假設(shè)編譯器遇到一個(gè)表達(dá)式或函數(shù)的調(diào)用運(yùn)用了一個(gè)不適宜的數(shù)據(jù)類型,它經(jīng)常會(huì)類型轉(zhuǎn)換。類型轉(zhuǎn)換是將一種類型的值映射為另一種類型的值。類型轉(zhuǎn)換可分為隱式轉(zhuǎn)換和顯式轉(zhuǎn)換兩種。C+編譯系統(tǒng)提供

57、的數(shù)據(jù)類型的隱式轉(zhuǎn)換規(guī)那么如下:1程序在執(zhí)行算術(shù)運(yùn)算時(shí),低類型可以轉(zhuǎn)換為高類型。2在賦值表達(dá)式中,右邊表達(dá)式的值自動(dòng)轉(zhuǎn)換為左邊變量的類型,并賦值給它。3在函數(shù)調(diào)用時(shí),將實(shí)參值賦給形參,系統(tǒng)隱式地將實(shí)參轉(zhuǎn)換為形參的類型后賦給形參。4函數(shù)有前往值時(shí),系統(tǒng)將自動(dòng)地將前往的表達(dá)式類型轉(zhuǎn)換為函數(shù)前往值類型并賦值給該函數(shù)。 1類型轉(zhuǎn)換 當(dāng)在程序中發(fā)現(xiàn)兩個(gè)數(shù)據(jù)類型不相容時(shí),又不能自動(dòng)完成隱式轉(zhuǎn)換,那么將出現(xiàn)編譯錯(cuò)誤。如:int *p = 10;在這種情況下,為了消除錯(cuò)誤,可以進(jìn)展如下所示的顯示類型轉(zhuǎn)換:int *p = (int*)10; /將整型數(shù)10顯式地轉(zhuǎn)換成指針類型2轉(zhuǎn)換函數(shù)在C+中,可以經(jīng)過(guò)定義類

58、型轉(zhuǎn)換函數(shù)來(lái)為用戶定義類型到達(dá)一樣的效果。這些函數(shù)有特殊類型的構(gòu)造函數(shù)和重載的運(yùn)算符。1構(gòu)造函數(shù)轉(zhuǎn)換構(gòu)造函數(shù)轉(zhuǎn)換在實(shí)踐運(yùn)用中,當(dāng)類定義中提供了單個(gè)參數(shù)的構(gòu)造函數(shù)時(shí),該類便提供了一種將其他數(shù)據(jù)類型的數(shù)值或變量轉(zhuǎn)換為用戶所定義數(shù)據(jù)類型的方法。因此,可以說(shuō)單個(gè)參數(shù)的構(gòu)造函數(shù)提供了數(shù)據(jù)轉(zhuǎn)換的功能。請(qǐng)看下面的例子:【例10.15】程序名為l10_15.cpp。#include class A /定義類Apublic: A(double x)m=x; void print()coutmendl;private: double m;void main() A a(5); a=100; /給A類類型的對(duì)象賦值

59、 a.print();在該程序中,賦值語(yǔ)句a=100,賦值號(hào)兩邊分別是數(shù)值100和對(duì)象a,兩者是不相容的數(shù)據(jù)類型,可是它卻能順利經(jīng)過(guò)編譯程序,并且輸出顯示正確結(jié)果,其主要緣由是由于單參數(shù)的構(gòu)造函數(shù)。編譯系統(tǒng)首先將整型數(shù)據(jù)100轉(zhuǎn)換成double型,然后,再經(jīng)過(guò)類中定義的單參數(shù)構(gòu)造函數(shù)將double型數(shù)值轉(zhuǎn)換為A類類型,最后把它賦值給a。這些轉(zhuǎn)換都是自動(dòng)隱式完成的。2運(yùn)算符轉(zhuǎn)換函數(shù)運(yùn)算符轉(zhuǎn)換函數(shù) 運(yùn)算符轉(zhuǎn)換方法是經(jīng)過(guò)運(yùn)算符重載實(shí)現(xiàn)的。用戶可以創(chuàng)建一個(gè)成員函數(shù),這個(gè)函數(shù)經(jīng)過(guò)在關(guān)鍵字operatore后跟隨想要轉(zhuǎn)換的類型,將當(dāng)前類型轉(zhuǎn)換為希望的類型。運(yùn)算符轉(zhuǎn)換函數(shù)又稱類型強(qiáng)迫轉(zhuǎn)換成員函數(shù),它是類中的一個(gè)非靜態(tài)成員函數(shù)。它的定義格式如下:class 類稱號(hào)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論