C++語(yǔ)言程序設(shè)計(jì)教程_第1頁(yè)
C++語(yǔ)言程序設(shè)計(jì)教程_第2頁(yè)
C++語(yǔ)言程序設(shè)計(jì)教程_第3頁(yè)
C++語(yǔ)言程序設(shè)計(jì)教程_第4頁(yè)
C++語(yǔ)言程序設(shè)計(jì)教程_第5頁(yè)
已閱讀5頁(yè),還剩171頁(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、C+語(yǔ)言程序設(shè)計(jì)教程(第6-10章)編輯課件 第6章 類與對(duì)象6.1 從面向過(guò)程到面向?qū)ο?.2 類與對(duì)象的定義6.3 對(duì)象的初始化6.4 對(duì)象數(shù)組與對(duì)象指針6.5 靜態(tài)成員6.6 友元6.7 常對(duì)象和常成員6.8 程序?qū)嵗庉嬚n件6.1 從面向過(guò)程到面向?qū)ο?.1.1 面向?qū)ο蟪绦蛟O(shè)計(jì)的基本概念1對(duì)象與方法對(duì)象是指現(xiàn)實(shí)世界中具體存在的實(shí)體。每一個(gè)對(duì)象都有自己的屬性(包括自己特有的屬性和同類對(duì)象的共同屬性)。屬性反映對(duì)象自身狀態(tài)變化,表現(xiàn)為當(dāng)前的屬性值。方法是用來(lái)描述對(duì)象動(dòng)態(tài)特征的一個(gè)操作序列。消息是用來(lái)請(qǐng)求對(duì)象執(zhí)行某一操作或回答某些信息的要求。實(shí)際上是一個(gè)對(duì)象對(duì)另一個(gè)對(duì)象的調(diào)用。編輯課件2類

2、類是具有相同屬性和方法的一組對(duì)象的集合,它為屬于該類的全部對(duì)象提供了統(tǒng)一的抽象描述。將相似的對(duì)象分組形成一個(gè)類,每個(gè)這樣的對(duì)象被稱為類的一個(gè)實(shí)例,一個(gè)類中的所有對(duì)象共享一個(gè)公共的定義,盡管它們對(duì)屬性所賦予的值不同。編輯課件3封裝封裝(Encapsulation)是指把對(duì)象屬性和操作結(jié)合在一起,構(gòu)成獨(dú)立的單元,它的內(nèi)部信息對(duì)外界是隱蔽的,不允許外界直接存取對(duì)象的屬性,只能通過(guò)有限的接口與對(duì)象發(fā)生聯(lián)系。編輯課件4繼承繼承(Inheritance)反映的是類與類之間抽象級(jí)別的不同,根據(jù)繼承與被繼承的關(guān)系,可分為基類和衍類,基類也稱為父類,衍類也稱為子類。子類將從父類那里獲得所有的屬性和方法,并且可以

3、對(duì)這些獲得的屬性和方法加以改造,使之具有自己的特點(diǎn)。一個(gè)父類可以派生出若干子類,每個(gè)子類都可以通過(guò)繼承和改造獲得自己的一套屬性和方法,由此,父類表現(xiàn)出的是共性和一般性,子類表現(xiàn)出的是個(gè)性和特性,父類的抽象級(jí)別高于子類。繼承具有傳遞性。繼承使得程序設(shè)計(jì)人員可以在已有的類的基礎(chǔ)上定義和實(shí)現(xiàn)新類,所以有效地支持了軟件構(gòu)件的復(fù)用。編輯課件5多態(tài)性不同的對(duì)象收到相同的消息產(chǎn)生不同的動(dòng)作,這種功能稱為多態(tài)性(Polymorphism)。將多態(tài)的概念應(yīng)用于面向?qū)ο蟪绦蛟O(shè)計(jì),增強(qiáng)了程序?qū)陀^世界的模擬性,使得對(duì)象程序具有了更好的可讀性,更易于理解,而且顯著提高了軟件的可復(fù)用性和可擴(kuò)充性。編輯課件6.1.2 C

4、+面向?qū)ο蟪绦虻慕Y(jié)構(gòu)一個(gè)面向?qū)ο蟮腃+程序一般由類的聲明和類的使用兩部分組成。類的使用部分一般由主函數(shù)和有關(guān)子函數(shù)組成。編輯課件以下是一個(gè)典型的C+程序結(jié)構(gòu)。#include /類的定義部分class C int x,y,z; /類C的數(shù)據(jù)成員聲明f(); /類C的成員函數(shù)聲明;/類的使用部分void main() C a; /建立一個(gè)類C的對(duì)象aa.f(); /給對(duì)象a發(fā)消息,調(diào)用成員函數(shù)f()編輯課件在C+程序中,程序設(shè)計(jì)始終圍繞“類”展開(kāi)。通過(guò)聲明類,構(gòu)建了程序所要完成的功能,體現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計(jì)的思想。下面看一個(gè)具體的例子,直觀地了解一下面向?qū)ο蟪绦蛟O(shè)計(jì)方法與結(jié)構(gòu)化程序設(shè)計(jì)方法的區(qū)別

5、。【例6.1】 類的應(yīng)用示例。編輯課件6.2 類與對(duì)象的定義6.2.1 類的定義在C+中,一個(gè)類指定一個(gè)獨(dú)立的對(duì)象集合,該對(duì)象集合由組成該類的對(duì)象以及這些對(duì)象所允許的操作組成。編輯課件1類的定義形式類定義的一般形式如下:class 類名 public:數(shù)據(jù)成員或成員函數(shù)的定義private:數(shù)據(jù)成員或成員函數(shù)的定義protected:數(shù)據(jù)成員或成員函數(shù)的定義;編輯課件2類成員函數(shù)的定義對(duì)類的成員函數(shù)的定義通常有兩種形式,一種是在類的定義中直接定義函數(shù),一種是在類外定義。前面的例6.1就是在類內(nèi)部實(shí)現(xiàn)成員函數(shù),下面再看一個(gè)例子?!纠?.2】 已知y,當(dāng)f(n)122334n(n1)時(shí),求y的值。

6、編輯課件按照類的定義形式,可以在類定義中只給出成員函數(shù)的原型,而在類外部定義具體的成員函數(shù)。這種成員函數(shù)在類外定義的一般形式如下:函數(shù)返回值的類型 類名:函數(shù)名(形參表)(函數(shù)體)其中雙冒號(hào):是作用域運(yùn)算符,它指出該函數(shù)是屬于哪一個(gè)類的成員函數(shù)。編輯課件6.2.2 對(duì)象的定義與使用1對(duì)象的定義對(duì)象的定義形式如下:類名 對(duì)象名表;其中對(duì)象名表代表有多個(gè)對(duì)象名,各對(duì)象名之間以逗號(hào)分隔。編輯課件2對(duì)象成員引用具體引用形式為:對(duì)象名.數(shù)據(jù)成員名對(duì)象名.成員函數(shù)名(實(shí)參表)【例6.3】 定義一個(gè)時(shí)鐘類,類中有3個(gè)私有數(shù)據(jù)成員(Hour、Minute和Second)和兩個(gè)公有成員函數(shù)(SetTime和Sh

7、owTime)。SetTime根據(jù)傳遞的3個(gè)參數(shù)為對(duì)象設(shè)置時(shí)間,ShowTime負(fù)責(zé)將對(duì)象表示的時(shí)間顯示輸出。在主函數(shù)中,建立一個(gè)時(shí)間類的對(duì)象,先利用默認(rèn)時(shí)間設(shè)置,再設(shè)置時(shí)間為10時(shí)23分45秒并顯示該時(shí)間。編輯課件6.2.3 類與結(jié)構(gòu)體的區(qū)別在C+語(yǔ)言中,結(jié)構(gòu)體除了具有原先C語(yǔ)言定義的功能外,還具有類似于類的功能,即也可以在其中定義函數(shù)。它們之間的區(qū)別是:在結(jié)構(gòu)體中,成員的默認(rèn)訪問(wèn)權(quán)限是public,而類成員的默認(rèn)訪問(wèn)權(quán)限是private?!纠?.4】 用結(jié)構(gòu)體定義類的示例。編輯課件6.3 對(duì)象的初始化在類的定義中不能給數(shù)據(jù)成員賦初值。從封裝的目的出發(fā),類的數(shù)據(jù)成員應(yīng)該多為私有的,對(duì)私有數(shù)據(jù)

8、成員的訪問(wèn)只能通過(guò)成員函數(shù),而不能通過(guò)成員引用的方式來(lái)賦值。C+中定義了一種特殊的初始化函數(shù),稱之為構(gòu)造函數(shù)(Constructor)。在特定對(duì)象使用結(jié)束時(shí),還將進(jìn)行一些清除工作。對(duì)象清除工作由析構(gòu)函數(shù)(Destructor)來(lái)完成。編輯課件6.3.1 構(gòu)造函數(shù)1構(gòu)造函數(shù)的特點(diǎn)(1)構(gòu)造函數(shù)名與類名相同,且沒(méi)有返回值,不能指定函數(shù)類型。(2)構(gòu)造函數(shù)必須使具有公有屬性,但它不能像其它成員函數(shù)那樣被顯式地調(diào)用,它是在定義對(duì)象的同時(shí)被系統(tǒng)自動(dòng)調(diào)用的。(3)構(gòu)造函數(shù)是特殊的成員函數(shù),函數(shù)體可以寫(xiě)在類體內(nèi),也可以寫(xiě)在類體外。(4)構(gòu)造函數(shù)可以重載,即一個(gè)類中可以定義多個(gè)參數(shù)個(gè)數(shù)或參數(shù)類型不同的構(gòu)造函數(shù)

9、。編輯課件【例6.5】 使用構(gòu)造函數(shù)替代例6.3中SetTime()成員函數(shù),并在主函數(shù)中,使用構(gòu)造函數(shù)設(shè)置時(shí)間為15時(shí)19分56秒并顯示該時(shí)間。構(gòu)造函數(shù)也可以重載。關(guān)于重載的概念將在第7章詳細(xì)介紹,這里先看一個(gè)例子?!纠?.6】 構(gòu)造函數(shù)重載定義示例。編輯課件綜上所述,構(gòu)造函數(shù)是一個(gè)有著特殊名字,在對(duì)象創(chuàng)建時(shí)被自動(dòng)調(diào)用的一種函數(shù),它的功能就是完成對(duì)象的初始化。編輯課件2默認(rèn)的構(gòu)造函數(shù)如果類定義中沒(méi)有給出構(gòu)造函數(shù),則C+編譯器自動(dòng)給出一個(gè)默認(rèn)的構(gòu)造函數(shù),而且默認(rèn)的構(gòu)造函數(shù)只能有一個(gè),形式如下:類名:默認(rèn)構(gòu)造函數(shù)名() 若沒(méi)有定義過(guò)任何形式的構(gòu)造函數(shù),系統(tǒng)會(huì)自動(dòng)生成默認(rèn)的構(gòu)造函數(shù)。若已經(jīng)定義過(guò)構(gòu)

10、造函數(shù),則系統(tǒng)不會(huì)自動(dòng)生成默認(rèn)的構(gòu)造函數(shù),一旦需要,則要求顯式地定義這種形式的構(gòu)造函數(shù)。在程序中,若定義一個(gè)靜態(tài)對(duì)象而沒(méi)有指明初始值時(shí),編譯器會(huì)按默認(rèn)的構(gòu)造函數(shù)對(duì)對(duì)象的數(shù)據(jù)成員初始化為0或空。【例6.7】 默認(rèn)構(gòu)造函數(shù)示例?!纠?.8】 構(gòu)造函數(shù)的調(diào)用。編輯課件6.3.2 析構(gòu)函數(shù)1析構(gòu)函數(shù)的特點(diǎn)當(dāng)對(duì)象創(chuàng)建時(shí),會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù)進(jìn)行初始化。當(dāng)對(duì)象撤消時(shí),也會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)進(jìn)行一些清理工作,如釋放分配給對(duì)象的內(nèi)存空間等。與構(gòu)造函數(shù)類似的是:析構(gòu)函數(shù)也與類同名,但在名字前有一個(gè)“”符號(hào),析構(gòu)函數(shù)也具有公有屬性,也沒(méi)有返回類型和返回值,但析構(gòu)函數(shù)不帶參數(shù),不能重載,所以析構(gòu)函數(shù)只有一個(gè)?!纠?.9

11、】 析構(gòu)函數(shù)程序舉例。編輯課件2默認(rèn)的析構(gòu)函數(shù)和默認(rèn)構(gòu)造函數(shù)一樣,如果類定義中沒(méi)有給出析構(gòu)函數(shù),系統(tǒng)也會(huì)自動(dòng)生成一個(gè)默認(rèn)的析構(gòu)函數(shù),其格式如下:類名稱:默認(rèn)析構(gòu)函數(shù)名() 例如,編譯系統(tǒng)為類Point生成默認(rèn)的析構(gòu)函數(shù)如下:Point:Point() 對(duì)于大多數(shù)類而言,默認(rèn)的析構(gòu)函數(shù)就能滿足要求。只有在一個(gè)對(duì)象完成其操作之前需要做一些內(nèi)部處理時(shí),才顯式地定義析構(gòu)函數(shù)。編輯課件6.3.3 復(fù)制構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)的作用是使用一個(gè)已存在的對(duì)象去初始化另一個(gè)同類對(duì)象,它也是一種構(gòu)造函數(shù),除了具有一般構(gòu)造函數(shù)的特征外,它還具有如下特點(diǎn):(1)其形參必須是本類的對(duì)象的引用。(2)某函數(shù)的形參是類的對(duì)象,

12、調(diào)用該函數(shù)需要復(fù)制構(gòu)造函數(shù)進(jìn)行形參和實(shí)參結(jié)合。(3)函數(shù)的返值是類的對(duì)象,函數(shù)調(diào)用返回的時(shí)候需要調(diào)用復(fù)制構(gòu)造函數(shù)實(shí)現(xiàn)類對(duì)象的賦值。編輯課件復(fù)制構(gòu)造函數(shù)的定義格式如下:類名:復(fù)制構(gòu)造函數(shù)名(const 類名 &對(duì)象名)(函數(shù)體)復(fù)制構(gòu)造函數(shù)與類同名,const是類型修飾符,被其修飾的對(duì)象是個(gè)不能被更新的常量?!纠?.10】 默認(rèn)復(fù)制構(gòu)造函數(shù)示例?!纠?.11】 復(fù)制構(gòu)造函數(shù)示例。編輯課件普通構(gòu)造函數(shù)在建立對(duì)象時(shí)被調(diào)用,而復(fù)制構(gòu)造函數(shù)在用已有對(duì)象初始化一個(gè)新對(duì)象時(shí)被調(diào)用。復(fù)制構(gòu)造函數(shù)被調(diào)用通常發(fā)生在以下3種情況:(1)程序中需要新建一個(gè)對(duì)象,并用一個(gè)類的對(duì)象去初始化類的另一個(gè)對(duì)象的時(shí)候。(2)當(dāng)對(duì)

13、象作函數(shù)參數(shù)時(shí),調(diào)用該函數(shù)時(shí)需要將實(shí)參對(duì)象完整地傳遞給形參,這就需要按實(shí)參復(fù)制一個(gè)形參,系統(tǒng)是通過(guò)調(diào)用復(fù)制構(gòu)造函數(shù)來(lái)實(shí)現(xiàn)的,這樣能保證形參具有和實(shí)參完全相同的值。(3)當(dāng)函數(shù)的返回值是類的對(duì)象。在函數(shù)調(diào)用完畢需要將返回值帶回函數(shù)調(diào)用處時(shí),此時(shí)需要將函數(shù)中的對(duì)象復(fù)制一個(gè)臨時(shí)對(duì)象并傳給該函數(shù)的調(diào)用處。以上3種調(diào)用復(fù)制構(gòu)造函數(shù)都是由編譯系統(tǒng)自動(dòng)完成的,不必由用戶自己去調(diào)用。編輯課件6.4 對(duì)象數(shù)組與對(duì)象指針6.4.1 對(duì)象數(shù)組對(duì)象數(shù)組是指數(shù)組的每一個(gè)元素都是相同類型對(duì)象的數(shù)組,也就是說(shuō),若一個(gè)類有若干個(gè)對(duì)象,把這一系列的對(duì)象用一個(gè)數(shù)組來(lái)表示。對(duì)象數(shù)組的元素是對(duì)象,不僅具有數(shù)據(jù)成員,而且還有成員函數(shù)。

14、對(duì)象數(shù)組的定義和普通數(shù)組的定義類似,一般格式如下:類名 數(shù)組名第一維大小第二維數(shù)組大小其中,類名是指該數(shù)組元素屬于該類的對(duì)象,方括號(hào)內(nèi)的數(shù)組大小給出了某一維元素的個(gè)數(shù)。一維對(duì)象數(shù)組只有一對(duì)方括號(hào),二維對(duì)象數(shù)組要有兩個(gè)方括號(hào)對(duì),等等。編輯課件與普通數(shù)組一樣,在使用對(duì)象數(shù)組時(shí)也只能訪問(wèn)單個(gè)數(shù)組元素,也就是一個(gè)對(duì)象,通過(guò)這個(gè)對(duì)象,可以訪問(wèn)它的公有成員,一般形式如下:數(shù)組名下標(biāo).成員名和普通數(shù)組一樣,對(duì)象數(shù)組既可以在定義時(shí)初始化,也可以在定義后賦值?!纠?.12】 對(duì)象數(shù)組應(yīng)用示例。編輯課件6.4.2 對(duì)象指針對(duì)象指針就是指向?qū)ο蟮闹羔槪涠x的格式如下:類名 *對(duì)象指針名;對(duì)象成員也可以通過(guò)指向?qū)ο?/p>

15、的指針來(lái)引用,引用數(shù)據(jù)成員的具體形式如下:指向?qū)ο蟮闹羔?數(shù)據(jù)成員名或:(*指向?qū)ο蟮闹羔?.數(shù)據(jù)成員名引用成員函數(shù)的具體形式如下:指向?qū)ο蟮闹羔?成員函數(shù)名(實(shí)參表)或:(*指向?qū)ο蟮闹羔?.成員函數(shù)名(實(shí)參表)【例6.13】 對(duì)象指針應(yīng)用示例。編輯課件6.4.3 指向類成員的指針1指向數(shù)據(jù)成員的指針指向數(shù)據(jù)成員的指針定義格式如下:類型說(shuō)明符 類名:*數(shù)據(jù)成員指針名;定義了指向數(shù)據(jù)成員的指針后,需要對(duì)其進(jìn)行賦值,也就是要確定指向類的哪一個(gè)成員。對(duì)數(shù)據(jù)成員指針賦值的一般格式如下:數(shù)據(jù)成員指針名=&類名:數(shù)據(jù)成員名;將指針指向類的數(shù)據(jù)成員后,就可以通過(guò)類的對(duì)象引用指針?biāo)赶虻臄?shù)據(jù)成員,其格式有兩

16、種:對(duì)象名.*數(shù)據(jù)成員指針名;或:對(duì)象指針名-*數(shù)據(jù)成員指針名;【例6.14】 指向數(shù)據(jù)成員指針應(yīng)用舉例。編輯課件2指向成員函數(shù)的指針指向成員函數(shù)的指針定義格式如下:函數(shù)返回值類型 (類名:* 成員函數(shù)指針名)(參數(shù)表);定義成員函數(shù)指針后要對(duì)其賦值,也就是確定指向類的哪一個(gè)成員函數(shù)。給指向成員函數(shù)指針賦值的一般格式如下:成員函數(shù)指針名=&類名:成員函數(shù)名;調(diào)用成員函數(shù)指針?biāo)赶蚝瘮?shù)的格式如下:(對(duì)象名.*成員函數(shù)指針名)(實(shí)參表)或:(對(duì)象指針名-*成員函數(shù)指針名)(實(shí)參表)【例6.15】 指向類成員函數(shù)指針應(yīng)用舉例。編輯課件6.4.4 this指針類的每一個(gè)成員函數(shù)都有一個(gè)隱含的常量指針,

17、通常稱為this指針。this指針的類型就是成員函數(shù)所屬類的類型。當(dāng)調(diào)用成員函數(shù)時(shí),它被初始化為被調(diào)用函數(shù)的對(duì)象的地址。this指針在系統(tǒng)中是隱含地存在的,也可以顯式地使用?!纠?.16】 this指針應(yīng)用舉例。需要注意的是,this指針是一個(gè)const指針,不能在程序中修改它,而且this指針的作用域僅在一個(gè)對(duì)象的內(nèi)部。編輯課件6.5 靜態(tài)成員6.5.1 靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員的定義格式如下:static 數(shù)據(jù)類型 變量名;靜態(tài)數(shù)據(jù)成員初始化的方式也與一般的數(shù)據(jù)成員不同。靜態(tài)數(shù)據(jù)成員初始化應(yīng)在類外進(jìn)行,而且應(yīng)在對(duì)象定義之前。一般在main()函數(shù)之前,類定義之后的位置對(duì)它進(jìn)行初始化,格式如

18、下:數(shù)據(jù)類型 類名:靜態(tài)數(shù)據(jù)成員名初始值;引用靜態(tài)數(shù)據(jù)成員的格式如下:類名:靜態(tài)數(shù)據(jù)成員名【例6.17】 靜態(tài)數(shù)據(jù)成員應(yīng)用舉例。編輯課件6.5.2 靜態(tài)成員函數(shù)定義靜態(tài)成員函數(shù)的格式如下:static 函數(shù)返回值的類型 靜態(tài)成員函數(shù)名(形參表)(函數(shù)體)編輯課件靜態(tài)成員函數(shù)僅能訪問(wèn)靜態(tài)的數(shù)據(jù)成員,不能訪問(wèn)非靜態(tài)的數(shù)據(jù)成員,也不能訪問(wèn)非靜態(tài)的成員函數(shù),這是由于靜態(tài)的成員函數(shù)沒(méi)有this指針。靜態(tài)成員函數(shù)的調(diào)用不需要對(duì)象名。類似于靜態(tài)的數(shù)據(jù)成員,公有的、靜態(tài)的成員函數(shù)在類外的調(diào)用方式如下:類名:靜態(tài)成員函數(shù)名(實(shí)參表)也允許用對(duì)象或指向?qū)ο蟮闹羔樥{(diào)用靜態(tài)成員函數(shù),一般格式如下:對(duì)象名.靜態(tài)成員函數(shù)

19、名(實(shí)參表)對(duì)象指針-靜態(tài)成員函數(shù)名(實(shí)參表)【例6.18】 靜態(tài)成員函數(shù)應(yīng)用舉例。編輯課件6.6 友元6.6.1 友元函數(shù)友元函數(shù)是類定義中由關(guān)鍵字friend修飾的非成員函數(shù)。友元函數(shù)可以是一個(gè)普通函數(shù),也可以是其它類的成員函數(shù),它不是本類的成員函數(shù),但是在它的函數(shù)體中可以通過(guò)“對(duì)象.成員名”訪問(wèn)類的私有成員和保護(hù)成員。友元函數(shù)聲明的格式為:friend 函數(shù)返回值類型 友元函數(shù)名(參數(shù)表);【例6.19】 友元函數(shù)應(yīng)用舉例。編輯課件6.6.2 友元類和函數(shù)一樣,類也可以說(shuō)明為另一個(gè)類的友元,這時(shí)稱該類為友元類。如果A類是B類的友元類,則A類中的私有成員函數(shù)都是B類的友元函數(shù),都可以訪問(wèn)B

20、類的私有和保護(hù)成員。友元類說(shuō)明的格式為:friend class 類名;類說(shuō)明語(yǔ)句可以放在公有部分,也可以放在私有部分或保護(hù)部分?!纠?.20】 友元類應(yīng)用舉例。編輯課件友元提供了一種非成員函數(shù)訪問(wèn)類的私有成員的方法,這在某些情況下為程序設(shè)計(jì)提供了一定的方便性。但是面向?qū)ο蟮某绦蛟O(shè)計(jì)要求類的接口與類的實(shí)現(xiàn)分開(kāi),對(duì)對(duì)象的訪問(wèn)通過(guò)其接口函數(shù)進(jìn)行。如果直接訪問(wèn)對(duì)象的私有成員,就破壞了面向?qū)ο蟪绦虻臄?shù)據(jù)隱藏和封裝特性,雖然提供了一些方便,但有可能是得不償失的,所以,需要慎用友元。編輯課件此外,還有兩點(diǎn)需要注意:(1)友元關(guān)系不能傳遞。例如,B類是A類的友元,C類是B類的友元,如果C類和A類之間沒(méi)有顯式

21、說(shuō)明,C類和A類之間不是友元關(guān)系。(2)友元關(guān)系的單向性。例如,如果B類是A類的友元,則B類的成員函數(shù)都是A類的友元函數(shù),可以訪問(wèn)A類的所有數(shù)據(jù)成員,但A類的成員函數(shù)就不是B類的友元函數(shù),也就不能訪問(wèn)B類的所有數(shù)據(jù)成員。編輯課件6.7 常對(duì)象和常成員6.7.1 常對(duì)象和常成員函數(shù)如果在定義對(duì)象時(shí)用const修飾,則被定義的對(duì)象為常對(duì)象。常對(duì)象的數(shù)據(jù)成員值在對(duì)象的整個(gè)生存期內(nèi)不能被改變,常對(duì)象的定義形式如下:類名 const 對(duì)象名(參數(shù)表);或:const 類名 對(duì)象名(參數(shù)表);在定義常對(duì)象時(shí)必須進(jìn)行初始化,而且不能被更新。編輯課件常成員函數(shù)的聲明格式如下:函數(shù)返回值的類型 函數(shù)名(參數(shù)表)

22、 const;const是函數(shù)類型的組成部分,因此在函數(shù)的實(shí)現(xiàn)部分也要帶const關(guān)鍵字。常成員函數(shù)表示該成員函數(shù)只能讀類數(shù)據(jù)成員,而不能修改類的數(shù)據(jù)成員。定義常成員函數(shù)時(shí),把const關(guān)鍵字放在函數(shù)的參數(shù)表和函數(shù)體之間?!纠?.21】 常對(duì)象和常成員函數(shù)應(yīng)用舉例。編輯課件6.7.2 常數(shù)據(jù)成員帶有成員初始化列表的構(gòu)造函數(shù)的一般形式如下:類名:構(gòu)造函數(shù)名(參數(shù)表):(成員初始化列表) /構(gòu)造函數(shù)體成員初始化列表的一般形式如下:數(shù)據(jù)成員名1(初始值1),數(shù)據(jù)成員名2(初始值2),【例6.22】 常數(shù)據(jù)成員應(yīng)用舉例。編輯課件6.8 程序?qū)嵗纠?.23】 已知,求:(1)yy) ? x: y);

23、double max (double x , double y) return ( (xy) ?x: y); #include void main( ) coutmax(10,20)endl; coutmax(1.23,2.34)endl; 重載方式靠將實(shí)參的個(gè)數(shù)及類型和所被調(diào)用的f()函數(shù)的形參的個(gè)數(shù)及類型一一比較來(lái)判斷。編輯課件()作為重載函數(shù)至少在參數(shù)個(gè)數(shù)、參數(shù)類型上有所不同。若僅在返回類型上不同,編譯器是無(wú)法區(qū)別的。如:void func(int); int func(int); /錯(cuò)誤 int min(int ,int); int min(int,int,int); /正確 int

24、add(int,int); double add(double,double); /正確()typedef定義的類型只是給已有類型取另外一個(gè)名字,編譯器不能將其同原類型區(qū)分。如: typedef INT int; void func(int x) . void func (INT x) (3)重載函數(shù)一般應(yīng)具有相同的功能,否則會(huì)破壞程序的可讀性。注意事項(xiàng)編輯課件問(wèn)題的提出1、基本數(shù)據(jù)類型系統(tǒng)提供了大量運(yùn)算符。如:int x,y; x=x+y; 表達(dá)簡(jiǎn)潔,使用方便。2、問(wèn)題的提出: 對(duì)于串類的對(duì)象合并: string x, y; strcat(x,y);不如上述運(yùn)算那樣簡(jiǎn)單,希望能改造為:x=x

25、+y;更加簡(jiǎn)單和直觀! 因此,需要對(duì)“+”進(jìn)行不同的解釋,即:重載7.1.2 運(yùn)算符重載編輯課件一、C+中的運(yùn)算符1、大多數(shù)系統(tǒng)預(yù)定義運(yùn)算符都能重載,除開(kāi)以下: . : ?: # *(當(dāng)乘法運(yùn)算符時(shí)可重載) “.” “:” “*”在C+中有特定定義 “?:”不值得重載 “#”不能被重載2、重載時(shí)的注意事項(xiàng):(1)不能改變優(yōu)先級(jí);(2)不能改變結(jié)合性;(3)不能改變運(yùn)算符所需操作數(shù)的個(gè)數(shù);(4)重載后,可按這些運(yùn)算符的表達(dá)方式使用。 編輯課件一、通過(guò)運(yùn)算符重載函數(shù)進(jìn)行重載1、運(yùn)算符重載函數(shù)是成員函數(shù) 語(yǔ)法形式:Type X:operator(參數(shù)表) /相對(duì)于該類而定義的操作 運(yùn)算符重載的語(yǔ)法形

26、式返回類型重載該運(yùn)算符的類名要重載的運(yùn)算符符號(hào)編輯課件2、運(yùn)算符重載函數(shù)是友元函數(shù) 語(yǔ)法形式:Type operator(參數(shù)表) /相對(duì)于該類而定義的操作 羅列運(yùn)算符所需要的操作數(shù)3、實(shí)例void operator+( ) void operator-( ) void counter:operator+( ) if (value0) value-;編輯課件注意:重載中注意的問(wèn)題1、運(yùn)算符重載函數(shù)是友元函數(shù)、成員函數(shù)的區(qū)別;2、運(yùn)算符被重載時(shí),只是相對(duì)一特定類被重載,在特定的環(huán)境下作出特定的解釋。當(dāng)離開(kāi)這個(gè)特定環(huán)境后,具有原來(lái)的意義(系統(tǒng)定義);3、當(dāng)重載運(yùn)算符解釋失敗時(shí),用該運(yùn)算符的預(yù)定義版

27、本(系統(tǒng))進(jìn)行解釋;4、用此方法重載時(shí),只能對(duì)一個(gè)系統(tǒng)已有運(yùn)算符進(jìn)行特定環(huán)境下的新的解釋,而不能創(chuàng)造新的運(yùn)算符。當(dāng)運(yùn)算符不夠用時(shí),用函數(shù)調(diào)用來(lái)實(shí)現(xiàn);5、除“=”以外,重載的運(yùn)算符可以被任何派生類所繼承,“=”需要每個(gè)類明確定義自己的解釋;6、 重載可能讓程序的可讀性下降,在使用時(shí)應(yīng)模仿運(yùn)算符的習(xí)慣用法 。編輯課件一、運(yùn)算符重載函數(shù)定義的兩種方式1、成員函數(shù)和友元函數(shù)2、差別的關(guān)鍵原因:this指針二、一元運(yùn)算符1、不論前綴還是后綴,需要一個(gè)操作數(shù)2、對(duì)于任意一元運(yùn)算符:(1)成員函數(shù)重載運(yùn)算符 定義 type x:operator ( ) 顯式調(diào)用 objX.operator ( ) 隱式調(diào)用

28、 objX 或:ojbX(2)友元函數(shù)重載運(yùn)算符 定義 type operator (Xobj) 顯式調(diào)用 operator(obj X) 隱式調(diào)用 ojbX 或:objX 一元和二元運(yùn)算符編輯課件方式 定義顯式調(diào)用隱式調(diào)用備注成員函數(shù)Type X:operator ( )objX.operator () objX或:objX 操作數(shù)通過(guò)THIS指針隱含傳遞,因此參數(shù)表為空。友元函數(shù)Type operator ( X ojb)operator(objX)objX或:objX ()所需要的一個(gè)操作數(shù)在參數(shù)表中,由對(duì)象顯式地提供。一元運(yùn)算符的重載編輯課件三、二元運(yùn)算符1、需要兩個(gè)操作數(shù);2、對(duì)于任

29、意二元運(yùn)算符:方式 定義顯式調(diào)用隱式調(diào)用備注成員函數(shù)Type X:operator (X obj)objX1.operator (objX2)objX1 (objX2)第一個(gè)操作數(shù)通過(guò)THIS指針隱含傳遞,第二個(gè)操作數(shù)通過(guò)參數(shù)提供,只有一個(gè)參數(shù)。友元函數(shù)Type operator ( X ojb)operator (objX1, objX2)objX1 (objX2)所需要的兩個(gè)操作數(shù)在參數(shù)表中,由對(duì)象顯式地提供。編輯課件用成員函數(shù)重載運(yùn)算符例7-61、重載“+”、“=”、“+”;讀懂幾個(gè)成員函數(shù);2、成員函數(shù)重載運(yùn)算符,激活運(yùn)算符的對(duì)象都是由THIS指針隱含傳遞的。用友元函數(shù)重載運(yùn)算符1、成

30、員函數(shù)重載可能造成的麻煩:成員函數(shù)重載的運(yùn)算符不具有交換性。 原因:成員函數(shù)僅能被一個(gè)“實(shí)際對(duì)象”所調(diào)用,如果引起成員函數(shù)調(diào)用的是一個(gè)值(非一個(gè)對(duì)象),成員函數(shù)將不能正確工作。2、可用友元函數(shù)解決這一問(wèn)題:友元函數(shù)重載運(yùn)算符時(shí),需要明確給出參數(shù),不會(huì)出錯(cuò)。3、不能用友元函數(shù)重載的運(yùn)算符: = 、 ( )、- 4、注意:(1)對(duì)THIS所指向的數(shù)據(jù)的任何改變都會(huì)影響到激活運(yùn)算數(shù)函數(shù)的對(duì)象。(2)可使用引用參數(shù)(指針)來(lái)解決重載時(shí)的二義性。編輯課件重載+和-一、關(guān)于+和- - 1、C中的+和- -的兩種形式:前綴:+i; 后綴:i-;2、在C+中的約定 (顯式地區(qū)分前綴和后綴)(1)對(duì)于前綴方式+

31、i: 成員函數(shù):XX:operator + (); 友元函數(shù):X operator + (X&);(2)對(duì)于后綴方式i+: 成員函數(shù):XX:operator + (int); 友元函數(shù):X operator +(X&, int); 第二個(gè)參數(shù)INT一般設(shè)置為0,如:i+ 等價(jià)于:i+(0) 或:i+=0編輯課件二、實(shí)例 Class X X operator +() a+; b+; return *this; X operator +(int x) X temp; a+; b+; return temp;Class X friend operator +(Y &a) a.x+; b.y+; re

32、turn a; friend operator +(Y &a, int i) Y temp=a; a.x+; b.y+; return temp;編輯課件重載賦值運(yùn)算符一、概述1、“”賦值運(yùn)算符可以被重載;2、重載后不能被繼承;3、必須重載為成員函數(shù)。二、格式:X X : operator=(const X from) /復(fù)制X的成員;三、一般來(lái)說(shuō)當(dāng)缺省的類賦值函數(shù)不能正確工作時(shí),考慮“”的重載。編輯課件模板編輯課件7.2.1 函數(shù)模板 1函數(shù)模板的定義函數(shù)模板的定義為: template (形參表) /函數(shù)定義體 由class或typename后加一個(gè)標(biāo)識(shí)符構(gòu)成 編輯課件【例7.13】函數(shù)模

33、板的說(shuō)明template Glorp min( Glorp a, Glorp b ) return a b ? a : b; 注意:對(duì)函數(shù)模板的說(shuō)明和定義必須是全局作用域,函數(shù)模板不能說(shuō)明為類的成員函數(shù) 編輯課件2函數(shù)模板的實(shí)例化在函數(shù)模板中,函數(shù)模板只是說(shuō)明,不能直接執(zhí)行,需要實(shí)例化為模板函數(shù)后才能執(zhí)行。當(dāng)編譯系統(tǒng)發(fā)現(xiàn)一個(gè)函數(shù)調(diào)用時(shí),將根據(jù)實(shí)參表中的類型生成一個(gè)重載函數(shù)即模板函數(shù)。 編輯課件【例7.14】函數(shù)模板的實(shí)例化#include template A fab(A x) return x=0?x,-x;void main() int i=5; double y=-5.4;cout”整數(shù)

34、的絕對(duì)值”fab(i)endl;cout”實(shí)數(shù)的絕對(duì)值”fab(y)endl;編輯課件7.2.2 類模板 1類模板的定義 template class /類說(shuō)明體 template :(形參表) /成員函數(shù)定義體 template :(形參表) /成員函數(shù)定義體 。template :(形參表) /成員函數(shù)定義體 編輯課件【例7.15】設(shè)計(jì)一套完整的算術(shù)運(yùn)算來(lái)補(bǔ)充add函數(shù)。templateclass CCalculator public: CCalculator(const T &x, const T &y) : m_x(x), m_y(y) CCalculator(void) const

35、T add(void) return m_x + m_y; const T sub(void) return m_x - m_y; const T mult(void) return m_x * m_y; const T div(void) return m_x / m_y; private: const T m_x; const T m_y; ; 編輯課件2類模板的實(shí)例化類模板不能直接使用,必須實(shí)例化為相應(yīng)的模板類 創(chuàng)建類模板的實(shí)例的一般格式為: ;例7.15類模板CCalculator的實(shí)例化為: CCalculator calc(5, 2); / 創(chuàng)建一個(gè)整數(shù)計(jì)算對(duì)象 const int

36、 z = calc.mult(); / 結(jié)果應(yīng)該為 10編輯課件7.3 應(yīng)用實(shí)例編輯課件第8章 繼承和派生 在C+中可重用性是通過(guò)繼承(inheritance)這一機(jī)制來(lái)實(shí)現(xiàn)的。繼承是C+的一個(gè)重要組成部分。編輯課件8.1 繼承和派生的概念 在C+中,所謂“繼承”就是在一個(gè)已存在的類的基礎(chǔ)上建立一個(gè)新的類。一個(gè)新類從已有的類那里獲得其已有特性,這種現(xiàn)象稱為類的繼承。通過(guò)繼承,一個(gè)新建子類從已有的父類那里獲得父類的特性。從另一角度說(shuō),從已有的類(父類)產(chǎn)生一個(gè)新的子類,稱為類的派生。類的繼承是用已有的類來(lái)建立專用類的編程技術(shù)。8.1.1基類與派生類 1.繼承與派生交通工具飛機(jī)滑翔機(jī)直升飛機(jī)噴氣式

37、飛機(jī)編輯課件交通工具飛機(jī)滑翔機(jī)直升飛機(jī)噴氣式飛機(jī)已存在的類(例如“交通工具”)稱為“基類”或“父類”。新建立的類(例如“飛機(jī)”)稱為“派生類”或“子類”。一個(gè)基類可以派生出多個(gè)派生類,每一個(gè)派生類又可以作為基類再派生出新的派生類,因此基類和派生類是相對(duì)而言的。2.基類與派生類 編輯課件請(qǐng)注意圖中箭頭的方向,在本書(shū)中約定,箭頭表示繼承的方向,從派生類指向基類。編輯課件8.1.2繼承與派生的作用 1.避免公用代碼的重復(fù)開(kāi)發(fā),在減少代碼和數(shù)據(jù)冗余的同時(shí),節(jié)省程序開(kāi)發(fā)的時(shí)間,提高程序開(kāi)發(fā)的效率和質(zhì)量。2.通過(guò)增強(qiáng)代碼一致性來(lái)減少模塊間的接口和界面。3.通過(guò)層次關(guān)系來(lái)組織對(duì)象,使得高層類作為低層類的抽象

38、,有利于程序員掌握對(duì)象的共性,在此基礎(chǔ)上,就能更快地掌握低層類中的個(gè)性特征,給編程與代碼重用帶來(lái)方便。編輯課件8.1.3派生類的聲明 聲明一個(gè)派生類的一般格式為:class 派生類名 : 派生存取說(shuō)明符(可?。?基類名/派生類新增的數(shù)據(jù)成員和成員函數(shù); 派生類名”是要從基類派生出的新類的名字,“基類名”是一個(gè)已經(jīng)定義好的基類的名字,“派生存取說(shuō)明符”可以是關(guān)鍵字public或protected或private,派生存取說(shuō)明符的作用會(huì)在后面詳細(xì)介紹,“派生存取說(shuō)明符”可以省略,默認(rèn)為private,即私有派生。 編輯課件/定義一個(gè)基類(Student類)class Studentpublic:

39、char name10; /姓名 int age; /年齡 char sex; /性別 char classname20;/班級(jí)名稱;/定義一個(gè)派生類(GraduateStudent類)class GraduateStudent : public Studentpublic:char Advisorname10; /導(dǎo)師int qualifiergrade; /資格考試分; 編輯課件8.2 派生類成員的訪問(wèn)控制 8.2.1派生類成員訪問(wèn)控制簡(jiǎn)介從一個(gè)基類派生出一個(gè)子類時(shí),可以通過(guò)指定派生時(shí)的存取說(shuō)明符來(lái)實(shí)現(xiàn)對(duì)派生類成員的訪問(wèn)控制。 既然派生類中包含基類成員和派生類自己增加的成員,就產(chǎn)生了這兩部

40、分成員的關(guān)系和訪問(wèn)屬性的問(wèn)題。在建立派生類的時(shí)候,并不是簡(jiǎn)單地把基類的私有成員直接作為派生類的私有成員,把基類的公用成員直接作為派生類的公用成員。實(shí)際上,對(duì)基類成員和派生類自己增加的成員是按不同的原則處理的。編輯課件8.2.2 private、protected與public類成員 1.private類成員 一個(gè)類中的私有(private)成員(包括數(shù)據(jù)成員和成員函數(shù))只能被它們所在類的成員函數(shù)和友元函數(shù)訪問(wèn),在C+中類成員存取說(shuō)明符缺省的情況下的存取特征都是私有的(private)。 編輯課件【例8.1】 類私有成員的定義和訪問(wèn) #include class Person /Person類的

41、三個(gè)私有成員 char name10; /姓名private: int age; /年齡 char sex; /性別;main()Person P1; P1.age=20;/非法 coutP1.nameendl; /非法 return 0; 編輯課件2.public類成員 一個(gè)類中的公有(public)成員(包括數(shù)據(jù)成員和成員函數(shù))可以被程序中任何代碼(包括函數(shù))訪問(wèn),一般情況下,應(yīng)盡量將類的數(shù)據(jù)成員聲明為私有(private),然后為需要被類外部訪問(wèn)的數(shù)據(jù)成員提供公有的成員函數(shù),實(shí)現(xiàn)對(duì)私有成員的設(shè)置和訪問(wèn),這種結(jié)構(gòu)能夠向類的客戶很好的隱藏實(shí)現(xiàn)方法,在有效減少錯(cuò)誤的同時(shí),可以增強(qiáng)程序的可修改性

42、。 編輯課件3.protected類成員 使用protected聲明的稱為保護(hù)成員。任何一個(gè)類的保護(hù)成員僅可以被其自己和派生類的所有非靜態(tài)成員函數(shù)和友元函數(shù)直接訪問(wèn),也就是說(shuō)其他的外部函數(shù)是不能訪問(wèn)它的。因此,對(duì)于那些既要對(duì)外界隱藏,又要能被派生類訪問(wèn)的成員,可以將它們聲明為保護(hù)成員。 如果基類聲明了私有成員,那么任何派生類都是不能訪問(wèn)它們的,若希望在派生類中能訪問(wèn)它們,應(yīng)當(dāng)把它們聲明為保護(hù)成員。如果在一個(gè)類中聲明了保護(hù)成員,就意味著該類可能要用作基類,在它的派生類中會(huì)訪問(wèn)這些成員。編輯課件8.2.3三種派生方式的定義 1.私有(private)派生 在聲明一個(gè)派生類時(shí)將派生方式指定為priv

43、ate的,稱為私有派生,用私有派生方式建立的派生類稱為私有派生類 ,其基類稱為私有基類。由私有派生得到的派生類,它從基類繼承的成員都將變?yōu)樗接谐蓡T,也就是說(shuō)通過(guò)私有派生,派生類從基類繼承來(lái)的公有成員和保護(hù)成員都將變成派生類的私有成員,這些成員將只能被派生類的成員函數(shù)和友元函數(shù)訪問(wèn)。需要重點(diǎn)說(shuō)明的是,基類的私有成員經(jīng)過(guò)私有派生后繼續(xù)保持其基類的私有成員身份,無(wú)法被派生類訪問(wèn)。 編輯課件2.保護(hù)(protected)派生由保護(hù)派生得到的派生類,它從基類繼承的公有和保護(hù)成員都將變?yōu)榕缮惖谋Wo(hù)成員?;惖乃接谐蓡T經(jīng)過(guò)保護(hù)派生后繼續(xù)保持其基類的私有成員身份,依然無(wú)法被派生類訪問(wèn)。 保護(hù)派生的特點(diǎn)是:

44、基類的公用成員和保護(hù)成員在派生類中都成了保護(hù)成員,其私有成員仍為基類私有。也就是把基類原有的公用成員也保護(hù)起來(lái),不讓類外任意訪問(wèn)。編輯課件3.公有(public)派生 由公有派生得到的派生類,它從基類繼承的成員都將維持原有訪問(wèn)控制特征,即通過(guò)公有派生后,派生類從基類繼承的公有成員在派生類中仍然是公有成員,保護(hù)成員仍然是保護(hù)成員,而基類的私有成員經(jīng)過(guò)公有派生后繼續(xù)保持其基類的私有成員身份,依然無(wú)法被派生類訪問(wèn)。 編輯課件8.2.4派生類成員訪問(wèn)控制規(guī)則 1.派生類中新增成員的訪問(wèn)控制遵循類成員訪問(wèn)控制的規(guī)則。 存取說(shuō)明符訪問(wèn)控制規(guī)則Private此派生類的非靜態(tài)成員函數(shù)和友元函數(shù)可以直接訪問(wèn)Pr

45、otected此派生類和其子類非靜態(tài)成員函數(shù)和友元函數(shù)可以訪問(wèn)Public任何非靜態(tài)成員函數(shù),友元函數(shù)和非成員函數(shù)都可以直接訪問(wèn)編輯課件2. 類成員在派生類中的訪問(wèn)控制規(guī)則 基類成員的存取說(shuō)明符派生方式public派生protected派生private派生Private在派生類中被隱藏在派生類中被隱藏在派生類中被隱藏Protected派生類中為protected派生類中為protected派生類中為privatePublic派生類中為public派生類中為protected派生類中為private注意:不管是何種派生,基類的private成員永遠(yuǎn)都不能被其派生類直接訪問(wèn),但可以通過(guò)基類的pu

46、blic和protected成員函數(shù)訪問(wèn)。 編輯課件8.3 派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)8.3.1派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)的聲明類的構(gòu)造函數(shù)是類的一種特殊的成員函數(shù),它的作用主要是為對(duì)象分配內(nèi)存、進(jìn)行初始化;而析構(gòu)函數(shù)它的作用與構(gòu)造函數(shù)相反。 派生類的構(gòu)造函數(shù)聲明格式如下 :派生類的構(gòu)造函數(shù)名稱(參數(shù)表): 基類的構(gòu)造函數(shù)名(參數(shù)表)/派生類構(gòu)造函數(shù)體編輯課件class Point int x,y;public:Point(int a,int b)/基類的構(gòu)造函數(shù)x=a;y=b;cout”Constructing Point class n”;Point()/基類的析構(gòu)函數(shù)cout”Destr

47、ucting Point class n”;class Circle :public Pointdouble radius;public : Circle (double r,int a,int b):Point(a,b)/派生類的構(gòu)造函數(shù) radius =r;cout”Constructing Circle class n”; Circle ()/派生類的析構(gòu)函數(shù)cout”Destructing Circle class n”;編輯課件派生類中含有對(duì)象成員時(shí),其構(gòu)造函數(shù)的聲明格式如下: 派生類的構(gòu)造函數(shù)名稱(參數(shù)表): 基類的構(gòu)造函數(shù)名(參數(shù)表),對(duì)象成員名1(參數(shù)表),對(duì)象成員名N(參數(shù)表

48、)/派生類構(gòu)造函數(shù)體 class Circle2 :public Pointdouble radius;Point P1;public : Circle2 (double r,int a,int b):Point(a,b),P1(a,b)/派生類的構(gòu)造函數(shù),定義時(shí)/指定了基類的構(gòu)造函數(shù)和對(duì)象成員P1的構(gòu)造函數(shù)radius =r;cout”Constructing Circle2 class n”; Circle2 ()/派生類的析構(gòu)函數(shù)cout”Destructing Circle2 class n”; 編輯課件8.3.2派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)的構(gòu)造規(guī)則 1. 基類具有顯式的構(gòu)造函數(shù)時(shí)(1

49、)基類具有不帶參數(shù)的構(gòu)造函數(shù)派生類既可以自己不定義構(gòu)造函數(shù),也可以根據(jù)需要定義自己的構(gòu)造函數(shù),構(gòu)造函數(shù)可以帶參數(shù)也可以省略,在派生類中定義構(gòu)造函數(shù)時(shí)還可省略“:基類構(gòu)造函數(shù)名(參數(shù)表)”。 (2)基類僅有帶參數(shù)的構(gòu)造函數(shù) 派生類必須顯式的定義其構(gòu)造函數(shù),并在聲明時(shí)指定其基類的某一構(gòu)造函數(shù)和參數(shù)表,把參數(shù)傳遞給基類構(gòu)造函數(shù)。 編輯課件2. 基類具有隱式的構(gòu)造函數(shù)時(shí) 當(dāng)基類沒(méi)有顯式的定義(即隱式的定義)構(gòu)造函數(shù)時(shí),派生類可以根據(jù)需要定義自己的構(gòu)造函數(shù),派生類構(gòu)造函數(shù)的參數(shù)表、基類的構(gòu)造函數(shù)名和參數(shù)表都可以根據(jù)需要省略。 編輯課件8.3.3派生類構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用順序1. 構(gòu)造函數(shù)的調(diào)用順序

50、派生類對(duì)象創(chuàng)建的時(shí)候,構(gòu)造函數(shù)的執(zhí)行順序?yàn)椋海?)基類的構(gòu)造函數(shù)(2)對(duì)象成員的構(gòu)造函數(shù)(3)派生類自身的構(gòu)造函數(shù) 2. 析構(gòu)函數(shù)的調(diào)用順序與構(gòu)造函數(shù)的調(diào)用順序正好相反。即 (1)派生類自身的析構(gòu)函數(shù)(2)對(duì)象成員的構(gòu)造函數(shù)(3)基類的析構(gòu)函數(shù) 編輯課件【例8.6】派生類Circle2的構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行順序/Point和Circle2類的定義main()Circle2 C1(0.0,1,1);cout”-program line- n”;return 0;編輯課件8.4 多重繼承8.4.1多重繼承的聲明前面討論的是單繼承,即一個(gè)類是從一個(gè)基類派生而來(lái)的。在C+中還允許從多個(gè)基類中派生出

51、新的子類,這種派生方法稱為多重繼承(或多基派生)。這一強(qiáng)大的派生功能可以大大提高軟件重用的靈活性 。 聲明的格式如下: class 派生類名 : 派生存取說(shuō)明符(可?。? 基類名1, 派生存取說(shuō)明符N 基類名N/派生類新增的數(shù)據(jù)成員和成員函數(shù);編輯課件【例8.7】 多重繼承的聲明#include class Circle1 /基類Circle1 protected: int r; public:void setx (int x) r=x;void draw( ) coutdrawingn;class Circle2 /基類Circle2 protected: int r; public:voi

52、d setx (int x) r=x;void write( ) coutwritingn;class Circle: public Circle1,public Circle2 /類Circle公有繼承了Circle1和Circle2 public: void show() coutshowingn;void main() Circle cc;cc.draw();cc.write();cc.show();編輯課件8.4.2多重繼承的幾點(diǎn)說(shuō)明1. 在多重繼承中派生類成員的訪問(wèn)控制規(guī)則與單一繼承規(guī)則相同。2. 多重繼承的構(gòu)造函數(shù)與析構(gòu)函數(shù)定義與單一繼承相似,只是在構(gòu)造函數(shù)定義時(shí)N個(gè)基類的構(gòu)造函數(shù)

53、之間用逗號(hào)分隔。3. 多重繼承雖然功能強(qiáng)大,但也容易造成系統(tǒng)的復(fù)雜性,設(shè)計(jì)時(shí)務(wù)必正確和謹(jǐn)慎,能用單一繼承時(shí)盡量不用多重繼承。4. 多重繼承容易產(chǎn)生模糊性,在引用時(shí)要注意 編輯課件例如前面例8.7如果按照下面來(lái)引用: void main() Circle cc;cc.setx(10); / Circle1的setx還是Circle2的setx? void main() Circle cc;cc.Circle1:setx(10); /說(shuō)明是Circle1中的r為10 編輯課件8.4.3 虛基類 1. 虛基類的概念在很多情況下,程序員會(huì)定義一些類,而不想將其實(shí)例化為任何對(duì)象,這樣的類稱為“虛類”或“

54、抽象類”,因?yàn)檫@種虛類一般都要被用作基類,所以又被稱為“虛基類”或“抽象基類”。 2. 虛基類的聲明class 派生類名 : virtual 派生存取說(shuō)明符(可省) 虛基類名/派生類新增的數(shù)據(jù)成員和成員函數(shù);編輯課件3. 虛基類的初始化 虛基類初始化時(shí),構(gòu)造函數(shù)的調(diào)用順序規(guī)則:(1)同一層派生中包含多個(gè)虛基類時(shí),虛基類的構(gòu)造函數(shù)按它們派生時(shí)聲明的先后次序調(diào)用。 (2)如某虛基類是由實(shí)基類派生而來(lái),則先調(diào)用此實(shí)基類的構(gòu)造函數(shù),再調(diào)用虛基類的構(gòu)造函數(shù),最后才是派生類的構(gòu)造函數(shù)。 ( 3)若同一層派生中,同時(shí)存在虛基類與實(shí)基類,應(yīng)先調(diào)用虛基類的構(gòu)造函數(shù),再調(diào)用實(shí)基類的構(gòu)造函數(shù),最后調(diào)用派生類的構(gòu)造函

55、數(shù)。 編輯課件4. 虛基類的作用虛基類的作用就是為其他類提供一個(gè)合適的基類,以便派生類可以從它那里繼承和實(shí)現(xiàn)所需的接口。在多重繼承時(shí),當(dāng)派生類的多個(gè)基類有一個(gè)共同的基類時(shí),為防止產(chǎn)生二義性問(wèn)題可使用虛基類方法。注意: 虛基類并不是在聲明基類時(shí)聲明的,而是在聲明派生類時(shí),指定繼承方式時(shí)聲明的。因?yàn)橐粋€(gè)基類可以在生成一個(gè)派生類時(shí)作為虛基類,而在生成另一個(gè)派生類時(shí)不作為虛基類。編輯課件【例8.11】存在二義性的虛基類多重派生#include class Base /基類protected: int b;public:Base()b =1;cout” Constructing Base class”e

56、ndl;class Base1:public Base /基類1從Base派生public:Base1()cout” Constructing Base1 class”endl;cout”Base b=”bendl;編輯課件class Base2:public Base /基類2從Base派生public:Base2()cout” Constructing Base2 class”endl;cout”Base b=”bendl;class Derived: public Base1, Base2 /從兩個(gè)基類base1和base2多重派生出子類public: Derived ()cout” C

57、onstructing Derived class”endl;cout”Base b=”bendl;main ()Derived D1;return 0;改成如下語(yǔ)句:class Base1: virtual public Baseclass Base2: virtual public Base編輯課件8.5 基類和派生類的轉(zhuǎn)換8.5.1 什么是基類和派生類的轉(zhuǎn)換只有公用派生類才是基類真正的子類型,它完整地繼承了基類的功能?;惻c派生類對(duì)象之間有賦值兼容關(guān)系,由于派生類中包含從基類繼承的成員,因此可以將派生類的值賦給基類對(duì)象,在用到基類對(duì)象的時(shí)候可以用其子類對(duì)象代替。大多數(shù)時(shí)候基類和派生類的轉(zhuǎn)

58、換發(fā)生在對(duì)象之間進(jìn)行賦值的時(shí)候。編輯課件8.5.2 基類與派生類的轉(zhuǎn)換方法1可以用派生類對(duì)象為基類對(duì)象賦值;2可以用派生類對(duì)象初始化基類引用對(duì)象;3可以把指向派生類對(duì)象的指針賦給基類對(duì)象的指針;4可以把派生類對(duì)象的地址賦給基類對(duì)象的指針。 編輯課件8.6 繼承與組合在C+中,為了重用已有的軟件,除了可以通過(guò)繼承和派生的方式從已有的類產(chǎn)生一個(gè)新類外,還可以通過(guò)將一個(gè)或多個(gè)類作為類成員的方式來(lái)產(chǎn)生一個(gè)新的類,這種方式就是組合。 class Date /基類Date/;class TelephoneNumber/;class Address /基類Address/;class Employee /

59、Employee類中包含類對(duì)象成員,組合了三個(gè)類 protected: Date birthday; TelephoneNumber phonenumber; Address homeaddress; /; 編輯課件類的組合和繼承一樣,是軟件重用的重要方式。組合和繼承都是有效地利用已有類的資源。但二者的概念和用法不同。編輯課件第9章 多態(tài)性和虛函數(shù)編輯課件9.1 多態(tài)性的概念 多態(tài)性是指不同類的對(duì)象對(duì)于同一消息的處理具有不同的實(shí)現(xiàn)。 多態(tài)性在C+中表現(xiàn)為同一形式的函數(shù)調(diào)用,可能調(diào)用不同的函數(shù)實(shí)現(xiàn)。從系統(tǒng)實(shí)現(xiàn)的角度看,C+的多態(tài)性分為兩類,一類稱為編譯時(shí)刻多態(tài)性,另一類稱為運(yùn)行時(shí)刻多態(tài)性,也稱動(dòng)

60、態(tài)多態(tài)性。 編輯課件9.1.1 編譯時(shí)刻的多態(tài)性 C+編譯時(shí)多態(tài)性通過(guò)重載(函數(shù)重載和運(yùn)算符重載)來(lái)實(shí)現(xiàn) 【例9.1】 編譯時(shí)刻的多態(tài)性運(yùn)算符重載:下面這段程序建立Data類和T_Data類,并重載運(yùn)算符“+=”,使之能用于相應(yīng)類對(duì)象的運(yùn)算。 編輯課件#include using namespace std;class Datapublic:Data(int x=0,int y=0); /缺省構(gòu)造函數(shù)void set_xy(int x,int y);int get_X() const;int get_Y() const;long norm();Data() ; /析構(gòu)函數(shù)Data& opera

溫馨提示

  • 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)論