c++面向?qū)ο蟪绦蛟O(shè)計(jì)_第1頁(yè)
c++面向?qū)ο蟪绦蛟O(shè)計(jì)_第2頁(yè)
c++面向?qū)ο蟪绦蛟O(shè)計(jì)_第3頁(yè)
c++面向?qū)ο蟪绦蛟O(shè)計(jì)_第4頁(yè)
c++面向?qū)ο蟪绦蛟O(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩412頁(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、 面向?qū)ο蟮乃枷胱畛醭霈F(xiàn)于挪威奧斯陸大學(xué)和面向?qū)ο蟮乃枷胱畛醭霈F(xiàn)于挪威奧斯陸大學(xué)和挪威計(jì)算機(jī)中心共同研制的挪威計(jì)算機(jī)中心共同研制的Simula 67語(yǔ)言中,隨著的語(yǔ)言中,隨著的Smalltalk-76和和8080語(yǔ)言推出,面向?qū)ο蟮牡某绦蛟O(shè)計(jì)語(yǔ)言推出,面向?qū)ο蟮牡某绦蛟O(shè)計(jì)方法得到了比較完善的實(shí)現(xiàn)。方法得到了比較完善的實(shí)現(xiàn)。 此后,面向?qū)ο蟮母拍詈蛻?yīng)用已超越了程序設(shè)計(jì)此后,面向?qū)ο蟮母拍詈蛻?yīng)用已超越了程序設(shè)計(jì)和軟件開(kāi)發(fā),擴(kuò)展到如數(shù)據(jù)庫(kù)系統(tǒng),交互式界面,分和軟件開(kāi)發(fā),擴(kuò)展到如數(shù)據(jù)庫(kù)系統(tǒng),交互式界面,分布式系統(tǒng),網(wǎng)絡(luò)管理結(jié)構(gòu)和人工智能等領(lǐng)域。布式系統(tǒng),網(wǎng)絡(luò)管理結(jié)構(gòu)和人工智能等領(lǐng)域。 數(shù)據(jù)抽象數(shù)據(jù)抽象

2、 一種設(shè)計(jì)方法一種設(shè)計(jì)方法 把一組數(shù)據(jù)及作用與其上的操作組成一把一組數(shù)據(jù)及作用與其上的操作組成一個(gè)設(shè)計(jì)實(shí)體或單位。接口說(shuō)明外部可見(jiàn),其個(gè)設(shè)計(jì)實(shí)體或單位。接口說(shuō)明外部可見(jiàn),其實(shí)現(xiàn)是隱蔽的,不可見(jiàn)的。實(shí)現(xiàn)是隱蔽的,不可見(jiàn)的。發(fā)展的三個(gè)階段發(fā)展的三個(gè)階段01010101100100IntegerRealBoolean用戶用戶定義定義抽象數(shù)抽象數(shù)據(jù)類(lèi)型據(jù)類(lèi)型抽象數(shù)據(jù)類(lèi)型抽象數(shù)據(jù)類(lèi)型 抽象數(shù)據(jù)類(lèi)型是指抽象數(shù)據(jù)類(lèi)型是指“一個(gè)值集和作用在一個(gè)值集和作用在該值集上的操作集該值集上的操作集”。抽象數(shù)據(jù)類(lèi)型的定義。抽象數(shù)據(jù)類(lèi)型的定義只決定于其邏輯特性,與其具體的計(jì)算機(jī)內(nèi)只決定于其邏輯特性,與其具體的計(jì)算機(jī)內(nèi)部實(shí)現(xiàn)

3、無(wú)關(guān)。一個(gè)抽象數(shù)據(jù)類(lèi)型可以分解為部實(shí)現(xiàn)無(wú)關(guān)。一個(gè)抽象數(shù)據(jù)類(lèi)型可以分解為語(yǔ)法、語(yǔ)義、表示和算法語(yǔ)法、語(yǔ)義、表示和算法4個(gè)部分。個(gè)部分。功能抽象功能抽象模塊模塊數(shù)據(jù)抽象數(shù)據(jù)抽象模塊模塊抽象數(shù)據(jù)類(lèi)型的實(shí)現(xiàn)抽象數(shù)據(jù)類(lèi)型的實(shí)現(xiàn)實(shí)現(xiàn)抽象數(shù)據(jù)類(lèi)型需要借助于高級(jí)程序設(shè)計(jì)實(shí)現(xiàn)抽象數(shù)據(jù)類(lèi)型需要借助于高級(jí)程序設(shè)計(jì)語(yǔ)言語(yǔ)言;在面向過(guò)程的語(yǔ)言中,用戶可以自己定義數(shù)在面向過(guò)程的語(yǔ)言中,用戶可以自己定義數(shù)據(jù)類(lèi)型;據(jù)類(lèi)型;在面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言中,借助于對(duì)象在面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言中,借助于對(duì)象描述抽象數(shù)據(jù)類(lèi)型。描述抽象數(shù)據(jù)類(lèi)型。(Class)問(wèn)題求解問(wèn)題求解面向?qū)ο笤O(shè)計(jì)方法:實(shí)現(xiàn)問(wèn)題空間和問(wèn)題求面向?qū)ο笤O(shè)計(jì)方法:實(shí)現(xiàn)問(wèn)題

4、空間和問(wèn)題求解空間的近似和直接模擬。解空間的近似和直接模擬。意識(shí)部分意識(shí)部分教室教室物質(zhì)部分物質(zhì)部分303303教室教室抽象部分抽象部分教室類(lèi)教室類(lèi)具體部分具體部分一個(gè)對(duì)象:教室實(shí)例一個(gè)對(duì)象:教室實(shí)例現(xiàn)實(shí)問(wèn)題空間現(xiàn)實(shí)問(wèn)題空間解空間解空間封裝機(jī)制封裝機(jī)制基于消息的通信基于消息的通信繼承機(jī)制繼承機(jī)制多態(tài)機(jī)制多態(tài)機(jī)制 理解面向?qū)ο蟮幕靖拍顚?duì)于學(xué)習(xí)和掌握面向理解面向?qū)ο蟮幕靖拍顚?duì)于學(xué)習(xí)和掌握面向?qū)ο蟮拈_(kāi)發(fā)方法是十分重要的。對(duì)象的開(kāi)發(fā)方法是十分重要的。 類(lèi)類(lèi)(ClassClass)對(duì)象對(duì)象( (Object)Object)實(shí)例實(shí)例( (Instance)Instance)( (Polymorphis

5、m)Polymorphism)繼承繼承(InheritanceInheritance)消息消息( (Message)Message)封裝封裝(Encapsulation)(Encapsulation)把客觀世界從概念上看成是一個(gè)由相互配合而協(xié)把客觀世界從概念上看成是一個(gè)由相互配合而協(xié)作的對(duì)象所組成的系統(tǒng)作的對(duì)象所組成的系統(tǒng)面向?qū)ο竺嫦驅(qū)ο?對(duì)象對(duì)象+分類(lèi)分類(lèi)+繼承繼承+通信通信一個(gè)實(shí)例一個(gè)實(shí)例椅子椅子對(duì)象:桌子對(duì)象:桌子價(jià)格價(jià)格尺寸尺寸重量重量位置位置顏色顏色類(lèi):家具類(lèi):家具對(duì)象:椅子對(duì)象:椅子價(jià)格價(jià)格尺寸尺寸重量重量位置位置顏色顏色買(mǎi)賣(mài)移動(dòng)買(mǎi)買(mǎi)賣(mài)賣(mài)移動(dòng)移動(dòng)買(mǎi)買(mǎi)賣(mài)賣(mài)移動(dòng)移動(dòng)價(jià)格價(jià)格尺寸尺寸重量

6、重量位置位置顏色顏色對(duì)象對(duì)象對(duì)象對(duì)象(Object)(Object)對(duì)象是用來(lái)描述客觀存在的事物,它是構(gòu)成對(duì)象是用來(lái)描述客觀存在的事物,它是構(gòu)成系統(tǒng)的基本單位,是對(duì)客觀世界中事物的抽系統(tǒng)的基本單位,是對(duì)客觀世界中事物的抽象描述。象描述。 對(duì)象對(duì)象 行為(功能、方法、服務(wù))行為(功能、方法、服務(wù)) 屬性(數(shù)據(jù))屬性(數(shù)據(jù))屬性屬性行為行為接口接口對(duì)象對(duì)象對(duì)象對(duì)象對(duì)象對(duì)象對(duì)象是由私有數(shù)據(jù)(屬性)及作用于其上的一組操作(行對(duì)象是由私有數(shù)據(jù)(屬性)及作用于其上的一組操作(行為)所構(gòu)成的一個(gè)封閉整體為)所構(gòu)成的一個(gè)封閉整體由于對(duì)象的數(shù)據(jù)是私有的,所以要想訪問(wèn)其數(shù)據(jù)的正確方法是向該對(duì)象發(fā)送消息,讓對(duì)象自身

7、選擇其內(nèi)部相應(yīng)的操作以完成對(duì)該項(xiàng)數(shù)據(jù)的訪問(wèn)對(duì)象的動(dòng)作取決于外界給對(duì)象的刺激,這就是消息,消息告訴對(duì)象所要求它完成的功能。對(duì)象具有一定的智能功能,即“知道”如何選擇相應(yīng)的操作來(lái)處理對(duì)象所接收的消息從設(shè)計(jì)人員的角度看,對(duì)象是一個(gè)完成特定功能的程序塊從設(shè)計(jì)人員的角度看,對(duì)象是一個(gè)完成特定功能的程序塊從用戶的角度看,對(duì)象為他們提供了所希望的行為從用戶的角度看,對(duì)象為他們提供了所希望的行為對(duì)象對(duì)象(Object)對(duì)象標(biāo)識(shí)對(duì)象標(biāo)識(shí)對(duì)象生命周期對(duì)象生命周期類(lèi)類(lèi)又稱(chēng)又稱(chēng)對(duì)象類(lèi)對(duì)象類(lèi)一組具有相一組具有相同屬性和相同操作的對(duì)象的集合。同屬性和相同操作的對(duì)象的集合。在一個(gè)類(lèi)中,每個(gè)對(duì)象都是類(lèi)的在一個(gè)類(lèi)中,每個(gè)對(duì)象都

8、是類(lèi)的實(shí)例實(shí)例(instance) ,它們都可以使用類(lèi)中提供的函數(shù)。它們都可以使用類(lèi)中提供的函數(shù)。類(lèi)具有屬性類(lèi)具有屬性,用數(shù)據(jù)結(jié)構(gòu)來(lái)描述類(lèi)的屬性,用數(shù)據(jù)結(jié)構(gòu)來(lái)描述類(lèi)的屬性,類(lèi)具有操作,類(lèi)具有操作,它是對(duì)象的行為的抽象,操作實(shí)現(xiàn)它是對(duì)象的行為的抽象,操作實(shí)現(xiàn)的過(guò)程稱(chēng)為方法的過(guò)程稱(chēng)為方法(method) ,方法有方法名,方法,方法有方法名,方法體和參數(shù)。體和參數(shù)。 幾何對(duì)象幾何對(duì)象顏色顏色位置位置移動(dòng)(移動(dòng)(delta:矢量)矢量)選擇(選擇(P:指針型)指針型):布爾型布爾型旋轉(zhuǎn)旋轉(zhuǎn)(角度角度)圖1 對(duì)象類(lèi)的描述人人姓姓 名名:字符串字符串年年 齡齡: 整整 型型改換工作改換工作改換地址改換地址

9、文件文件文件名文件名文件大小文件大小最近更新日期最近更新日期打印打印(人人)張紅兵張紅兵28繪圖員繪圖員人民路人民路8號(hào)號(hào)(人人)李軍李軍24程序員程序員無(wú)無(wú)圖2 對(duì)象的描述類(lèi)名類(lèi)名屬性屬性運(yùn)算運(yùn)算 對(duì)象對(duì)象 類(lèi)類(lèi)屬于某類(lèi)的具體對(duì)象就是該類(lèi)的屬于某類(lèi)的具體對(duì)象就是該類(lèi)的。一個(gè)類(lèi)的不同實(shí)例必定具有:一個(gè)類(lèi)的不同實(shí)例必定具有:相同的操作(或行為)的集合相同的操作(或行為)的集合相同的信息結(jié)構(gòu)或?qū)傩远x,但可以有不同的屬性值相同的信息結(jié)構(gòu)或?qū)傩远x,但可以有不同的屬性值不同的對(duì)象標(biāo)識(shí)不同的對(duì)象標(biāo)識(shí)消息消息(Message)對(duì)象之間的聯(lián)系是通過(guò)傳遞消息來(lái)實(shí)現(xiàn)的。對(duì)象之間的聯(lián)系是通過(guò)傳遞消息來(lái)實(shí)現(xiàn)的。消

10、息消息就是向?qū)ο蟀l(fā)出的服務(wù)請(qǐng)求(互相聯(lián)系、就是向?qū)ο蟀l(fā)出的服務(wù)請(qǐng)求(互相聯(lián)系、協(xié)同工作等)。協(xié)同工作等)。是對(duì)象之間進(jìn)行通訊的一種數(shù)據(jù)結(jié)構(gòu)。是對(duì)象之間進(jìn)行通訊的一種數(shù)據(jù)結(jié)構(gòu)。消息統(tǒng)一了消息統(tǒng)一了“數(shù)據(jù)流數(shù)據(jù)流”和和“控制流控制流”。數(shù)據(jù)數(shù)據(jù)方法方法消息到達(dá)消息消息 - - 消息傳送與函數(shù)調(diào)用的區(qū)別消息傳送與函數(shù)調(diào)用的區(qū)別(1)函數(shù)調(diào)用可以帶或不帶參數(shù),但是消息至)函數(shù)調(diào)用可以帶或不帶參數(shù),但是消息至少帶一個(gè)參數(shù),它表明接收該消息的對(duì)象,消少帶一個(gè)參數(shù),它表明接收該消息的對(duì)象,消息中告訴對(duì)象做什么的部分稱(chēng)為消息操作;息中告訴對(duì)象做什么的部分稱(chēng)為消息操作;(2)消息操作名類(lèi)似于函數(shù)名,其本質(zhì)區(qū)別在

11、)消息操作名類(lèi)似于函數(shù)名,其本質(zhì)區(qū)別在于:函數(shù)名代表一段可執(zhí)行的代碼,但消息操于:函數(shù)名代表一段可執(zhí)行的代碼,但消息操作名具體功能的選定還取決于接收消息的對(duì)象作名具體功能的選定還取決于接收消息的對(duì)象本身本身(3)函數(shù)調(diào)用是過(guò)程式的(如何做),消息傳)函數(shù)調(diào)用是過(guò)程式的(如何做),消息傳送是說(shuō)明式的(做什么),具體如何做,由對(duì)送是說(shuō)明式的(做什么),具體如何做,由對(duì)象根據(jù)收到的消息自行確定。象根據(jù)收到的消息自行確定。 繼承是使用現(xiàn)存的定義作為基礎(chǔ),建立新定義的繼承是使用現(xiàn)存的定義作為基礎(chǔ),建立新定義的技術(shù)。技術(shù)。是父類(lèi)和子類(lèi)之間共享數(shù)據(jù)結(jié)構(gòu)和方法的機(jī)制,是父類(lèi)和子類(lèi)之間共享數(shù)據(jù)結(jié)構(gòu)和方法的機(jī)制,

12、這是類(lèi)之間的一種關(guān)系。這是類(lèi)之間的一種關(guān)系。 繼承性分:繼承性分: 單重繼承:?jiǎn)沃乩^承:一個(gè)子類(lèi)只有一個(gè)父類(lèi)。即一個(gè)子類(lèi)只有一個(gè)父類(lèi)。即子類(lèi)只繼承子類(lèi)只繼承一個(gè)父類(lèi)的數(shù)據(jù)結(jié)構(gòu)和方法。一個(gè)父類(lèi)的數(shù)據(jù)結(jié)構(gòu)和方法。 多重繼承:多重繼承:一個(gè)子類(lèi)可有多個(gè)父類(lèi)。繼承多個(gè)一個(gè)子類(lèi)可有多個(gè)父類(lèi)。繼承多個(gè)父類(lèi)父類(lèi)的數(shù)據(jù)結(jié)構(gòu)和方法。的數(shù)據(jù)結(jié)構(gòu)和方法。基類(lèi)基類(lèi)子類(lèi)子類(lèi)A子類(lèi)子類(lèi)B圖 4 繼承性描述現(xiàn)存類(lèi)定義現(xiàn)存類(lèi)定義父類(lèi)父類(lèi)( (基類(lèi)基類(lèi)) )新類(lèi)定義新類(lèi)定義子類(lèi)子類(lèi)( (派生類(lèi)派生類(lèi)) )繼繼 承承圖 3 繼承性單繼承單繼承CheckingSavingsSuperclass (parent)Subclasses

13、Inheritance RelationshipAncestorDescendentsAccount- balance- name- number+ withdraw()+ createStatement()多繼承多繼承Use multiple inheritance only when needed and always with caution!FlyingThingAnimalHorseWolfBirdHelicopterAirplaneMultiple Inheritance封裝封裝(Encapsulation) 封裝是一種信息隱蔽技術(shù),就是把對(duì)象封裝是一種信息隱蔽技術(shù),就是把對(duì)象的屬

14、性和行為相結(jié)合構(gòu)成一個(gè)獨(dú)立的基本單的屬性和行為相結(jié)合構(gòu)成一個(gè)獨(dú)立的基本單位,用戶只能見(jiàn)到對(duì)象封裝界面上的信息,位,用戶只能見(jiàn)到對(duì)象封裝界面上的信息,對(duì)象內(nèi)部對(duì)用戶是隱蔽的。封裝的目的在于對(duì)象內(nèi)部對(duì)用戶是隱蔽的。封裝的目的在于將對(duì)象的使用者和對(duì)象的設(shè)計(jì)者分開(kāi),使用將對(duì)象的使用者和對(duì)象的設(shè)計(jì)者分開(kāi),使用者不必知道行為實(shí)現(xiàn)的細(xì)節(jié),只需使用設(shè)計(jì)者不必知道行為實(shí)現(xiàn)的細(xì)節(jié),只需使用設(shè)計(jì)者提供的消息訪問(wèn)對(duì)象者提供的消息訪問(wèn)對(duì)象 封裝是把過(guò)程和數(shù)據(jù)包圍起來(lái),對(duì)數(shù)據(jù)的封裝是把過(guò)程和數(shù)據(jù)包圍起來(lái),對(duì)數(shù)據(jù)的訪問(wèn)只能通過(guò)已定義的界面。訪問(wèn)只能通過(guò)已定義的界面。PosColor 公有公有消息消息私有私有消息消息存儲(chǔ)結(jié)構(gòu)

15、方法協(xié).議一個(gè)對(duì)象封裝的定義為:封裝的定義為:(1)一個(gè)限定所有對(duì)象內(nèi)部軟件的一個(gè)清楚界面;一個(gè)限定所有對(duì)象內(nèi)部軟件的一個(gè)清楚界面;(2)一個(gè)描述這個(gè)對(duì)象和其它對(duì)象之間相互作用的接口一個(gè)描述這個(gè)對(duì)象和其它對(duì)象之間相互作用的接口(3)受保護(hù)的內(nèi)部實(shí)現(xiàn),這個(gè)實(shí)現(xiàn)給出了由軟件對(duì)象提受保護(hù)的內(nèi)部實(shí)現(xiàn),這個(gè)實(shí)現(xiàn)給出了由軟件對(duì)象提供的功能細(xì)節(jié),實(shí)現(xiàn)細(xì)節(jié)不能在定義這個(gè)對(duì)象的類(lèi)的供的功能細(xì)節(jié),實(shí)現(xiàn)細(xì)節(jié)不能在定義這個(gè)對(duì)象的類(lèi)的外面訪問(wèn)外面訪問(wèn)矛盾嗎?矛盾嗎?No!封裝性主要指的是對(duì)象的封裝性,引入繼承機(jī)制封裝性主要指的是對(duì)象的封裝性,引入繼承機(jī)制后,對(duì)象仍然是封裝地很好的實(shí)體,其它對(duì)象后,對(duì)象仍然是封裝地很好的

16、實(shí)體,其它對(duì)象與它通信只能發(fā)送消息。與它通信只能發(fā)送消息。相似性:共享代碼!相似性:共享代碼!繼承:靜態(tài)共享代碼封裝:動(dòng)態(tài)共享代碼多態(tài)多態(tài)(Polymorphism)即一個(gè)名字具有多種語(yǔ)義。即一個(gè)名字具有多種語(yǔ)義。同一對(duì)象接收到不同消息采用不同的行為方式同一對(duì)象接收到不同消息采用不同的行為方式不同對(duì)象收到相同消息時(shí)產(chǎn)生不同的動(dòng)作不同對(duì)象收到相同消息時(shí)產(chǎn)生不同的動(dòng)作重載(重載(overload)動(dòng)態(tài)綁定動(dòng)態(tài)綁定類(lèi)屬類(lèi)屬 例如:例如: “繪圖繪圖”操作,作用在操作,作用在“橢圓橢圓” 和和“矩形矩形” 上,上,畫(huà)出不同的圖形。畫(huà)出不同的圖形。使用虛函數(shù)可實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編,不同聯(lián)編可以選擇使用虛函數(shù)可實(shí)

17、現(xiàn)動(dòng)態(tài)聯(lián)編,不同聯(lián)編可以選擇不同的實(shí)現(xiàn),這便是多態(tài)性。不同的實(shí)現(xiàn),這便是多態(tài)性。 繼承是動(dòng)態(tài)聯(lián)編的基礎(chǔ),虛函數(shù)是動(dòng)態(tài)聯(lián)編的關(guān)繼承是動(dòng)態(tài)聯(lián)編的基礎(chǔ),虛函數(shù)是動(dòng)態(tài)聯(lián)編的關(guān)鍵。鍵。(1)1)在基類(lèi)中,定義成員函數(shù)為虛函數(shù)在基類(lèi)中,定義成員函數(shù)為虛函數(shù)(virtual);(2)(2)定義基類(lèi)的公有定義基類(lèi)的公有(public)派生類(lèi);派生類(lèi);(3)(3)在基類(lèi)的公有派生類(lèi)中在基類(lèi)的公有派生類(lèi)中“重載重載”該虛函數(shù);該虛函數(shù);(4)(4)定義指向基類(lèi)的指針變量,它指向基類(lèi)的公定義指向基類(lèi)的指針變量,它指向基類(lèi)的公有派生類(lèi)的對(duì)象。有派生類(lèi)的對(duì)象。重載虛函數(shù)不是一般的重載函數(shù),它要求函數(shù)重載虛函數(shù)不是一般的

18、重載函數(shù),它要求函數(shù)名、返回類(lèi)型、參數(shù)個(gè)數(shù)、參數(shù)類(lèi)型和順序完全相同。名、返回類(lèi)型、參數(shù)個(gè)數(shù)、參數(shù)類(lèi)型和順序完全相同。例如:例如:下面是實(shí)現(xiàn)下面是實(shí)現(xiàn)“多態(tài)性多態(tài)性” 的一個(gè)例子的一個(gè)例子#include using namespace std;class figure /定義基類(lèi)定義基類(lèi) protected: double x,y; public: void set_dim(double i; double j=0) x=i; y=j; virtual void show_area() /定義虛函數(shù)定義虛函數(shù) cout“No area computation define ”; coutset

19、_dim(10.0,5.0); p-show_area(); p=&c; / 指向圓形對(duì)象指向圓形對(duì)象 p-set_dim(9.0); p-show_area();void main() figure *p; /定義指向基類(lèi)的指針變量定義指向基類(lèi)的指針變量 triangle t; / square s; / 定義基類(lèi)的公有派生類(lèi)的對(duì)象定義基類(lèi)的公有派生類(lèi)的對(duì)象 circle c; / p=&t; / 指向三角形對(duì)象指向三角形對(duì)象 p-set_dim(10.0,5.0); p-show_area();figureCircleTriangleSquarearea()area()ar

20、ea()area()類(lèi)與對(duì)象類(lèi)與對(duì)象C+語(yǔ)言程序設(shè)計(jì)C+語(yǔ)言程序設(shè)計(jì)本章主要內(nèi)容本章主要內(nèi)容l面向?qū)ο蟮乃枷朊嫦驅(qū)ο蟮乃枷雔OOP的基本特點(diǎn)的基本特點(diǎn)l類(lèi)概念和聲明類(lèi)概念和聲明l對(duì)象對(duì)象l構(gòu)造函數(shù)構(gòu)造函數(shù)l析構(gòu)函數(shù)析構(gòu)函數(shù)l內(nèi)聯(lián)成員函數(shù)內(nèi)聯(lián)成員函數(shù)l拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)l類(lèi)的組合類(lèi)的組合C+語(yǔ)言程序設(shè)計(jì)回顧:面向過(guò)程的設(shè)計(jì)方法回顧:面向過(guò)程的設(shè)計(jì)方法l重點(diǎn)重點(diǎn): 如何實(shí)現(xiàn)細(xì)節(jié)過(guò)程,將數(shù)據(jù)與函數(shù)分開(kāi)。l形式:形式: 主模塊+若干個(gè)子模塊(main()+子函數(shù))。l特點(diǎn):特點(diǎn): 自頂向下,逐步求精功能分解。l缺點(diǎn):缺點(diǎn): 效率低,程序的可重用性差。面向?qū)ο蟮乃枷隒+語(yǔ)言程序設(shè)計(jì)面向?qū)ο蟮姆椒?/p>

21、向?qū)ο蟮姆椒╨目的:目的: 實(shí)現(xiàn)軟件設(shè)計(jì)的產(chǎn)業(yè)化。l觀點(diǎn)觀點(diǎn):解決問(wèn)題屬于自然界的。解決問(wèn)題屬于自然界的。 自然界是由實(shí)體(對(duì)象)所組成。l程序設(shè)計(jì)方法:程序設(shè)計(jì)方法: 使用面向?qū)ο蟮挠^點(diǎn)來(lái)描述模仿并處理現(xiàn)實(shí)問(wèn)題。l要求:要求: 高度概括、分類(lèi)、和抽象。面向?qū)ο蟮乃枷隒+語(yǔ)言程序設(shè)計(jì)(1)抽象)抽象抽象是對(duì)具體對(duì)象(問(wèn)題)進(jìn)行概括,抽象是對(duì)具體對(duì)象(問(wèn)題)進(jìn)行概括,抽出這一類(lèi)對(duì)象的公共性質(zhì)并加以描述抽出這一類(lèi)對(duì)象的公共性質(zhì)并加以描述的過(guò)程。(如學(xué)生,教師的過(guò)程。(如學(xué)生,教師, 課程)課程) 先注意問(wèn)題的本質(zhì)及描述,其次是實(shí)現(xiàn)過(guò)程或細(xì)節(jié)。 數(shù)據(jù)抽象:描述某類(lèi)對(duì)象的屬性或狀態(tài)(對(duì)象相互區(qū)別的物理

22、量)。 行為抽象:描述某類(lèi)對(duì)象的共有的行為特征或具有的功能。 抽象的實(shí)現(xiàn):通過(guò)類(lèi)的聲明。OOP的基本特點(diǎn)C+語(yǔ)言程序設(shè)計(jì)抽象實(shí)例抽象實(shí)例鐘表鐘表l數(shù)據(jù)抽象:數(shù)據(jù)抽象:int Hour, int Minute, int Secondl行為抽象:行為抽象:SetTime(), ShowTime()OOP的基本特點(diǎn)C+語(yǔ)言程序設(shè)計(jì)抽象實(shí)例抽象實(shí)例鐘表類(lèi)鐘表類(lèi)class Clock public: void SetTime(int NewH, int NewM, int NewS); void ShowTime(); private: int Hour,Minute,Second;OOP的基本特點(diǎn)C+

23、語(yǔ)言程序設(shè)計(jì)抽象實(shí)例抽象實(shí)例人人l數(shù)據(jù)抽象:數(shù)據(jù)抽象:char *name,char *sex, int age, int idl行為抽象:行為抽象:生物屬性角度:GetCloth(), Eat(), 社會(huì)屬性角度:Work(), Promote() ,注意:同一個(gè)問(wèn)題可能有不同的抽象結(jié)果:根據(jù)解決問(wèn)題的要求不同,產(chǎn)生的抽象成員可能不同OOP的基本特點(diǎn)C+語(yǔ)言程序設(shè)計(jì)(2) 封裝封裝將抽象出的數(shù)據(jù)成員、行為成員相結(jié)將抽象出的數(shù)據(jù)成員、行為成員相結(jié)合,將它們視為一個(gè)整體,即類(lèi)。合,將它們視為一個(gè)整體,即類(lèi)。 目的是增強(qiáng)安全性和簡(jiǎn)化編程,使用者不必了解具體的實(shí)現(xiàn)細(xì)節(jié),而只需要通過(guò)外部接口,以特定的

24、訪問(wèn)權(quán)限,來(lái)使用類(lèi)的成員。 實(shí)現(xiàn)封裝:類(lèi)聲明中的OOP的基本特點(diǎn)C+語(yǔ)言程序設(shè)計(jì)封裝封裝l實(shí)例:實(shí)例:class Clock public: void SetTime(int NewH,int NewM, int NewS); void ShowTime(); private: int Hour,Minute,Second;邊界特定的訪問(wèn)權(quán)限OOP的基本特點(diǎn)外部接口C+語(yǔ)言程序設(shè)計(jì)(3)繼承與派生繼承與派生為了重用引出了繼函的概念。為了重用引出了繼函的概念。是是C+中支持層次分類(lèi)的一種機(jī)制,允許程序員中支持層次分類(lèi)的一種機(jī)制,允許程序員在保持原有類(lèi)特性的基礎(chǔ)上,進(jìn)行更具體的說(shuō)明。在保持原有類(lèi)特

25、性的基礎(chǔ)上,進(jìn)行更具體的說(shuō)明。實(shí)現(xiàn):聲明派生類(lèi)實(shí)現(xiàn):聲明派生類(lèi)第第11章章昆蟲(chóng)的分類(lèi)樹(shù)昆蟲(chóng)的分類(lèi)樹(shù)OOP的基本特點(diǎn)C+語(yǔ)言程序設(shè)計(jì)多態(tài)性多態(tài)性l多態(tài):同一名稱(chēng),不同的功能實(shí)現(xiàn)方式。多態(tài):同一名稱(chēng),不同的功能實(shí)現(xiàn)方式。l目的:達(dá)到行為標(biāo)識(shí)統(tǒng)一,減少程序中標(biāo)目的:達(dá)到行為標(biāo)識(shí)統(tǒng)一,減少程序中標(biāo)識(shí)符的個(gè)數(shù)。識(shí)符的個(gè)數(shù)。l實(shí)現(xiàn):重載函數(shù)和虛函數(shù)實(shí)現(xiàn):重載函數(shù)和虛函數(shù)第第12章章OOP的基本特點(diǎn)C+語(yǔ)言程序設(shè)計(jì)c+中的類(lèi)中的類(lèi)l類(lèi)是具有相同屬性和行為的一組對(duì)象類(lèi)是具有相同屬性和行為的一組對(duì)象的集合,它為屬于該類(lèi)的全部對(duì)象提的集合,它為屬于該類(lèi)的全部對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬供了統(tǒng)一的抽象描述

26、,其內(nèi)部包括屬性和行為兩個(gè)主要部分。性和行為兩個(gè)主要部分。l利用類(lèi)可以實(shí)現(xiàn)數(shù)據(jù)的封裝、隱藏、利用類(lèi)可以實(shí)現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。繼承與派生。l利用類(lèi)易于編寫(xiě)大型復(fù)雜程序,其模利用類(lèi)易于編寫(xiě)大型復(fù)雜程序,其模塊化程度比塊化程度比C中采用函數(shù)更高。中采用函數(shù)更高。類(lèi) 和 對(duì) 象C+語(yǔ)言程序設(shè)計(jì)類(lèi)與函數(shù)類(lèi)與函數(shù)l函數(shù)是將邏輯上相關(guān)的函數(shù)是將邏輯上相關(guān)的語(yǔ)句與數(shù)據(jù)語(yǔ)句與數(shù)據(jù)封封裝,用于完成特定的功能。裝,用于完成特定的功能。l而類(lèi)則是邏輯上相關(guān)的而類(lèi)則是邏輯上相關(guān)的函數(shù)與數(shù)據(jù)函數(shù)與數(shù)據(jù)的的封裝,它是對(duì)所要處理的問(wèn)題的描述。封裝,它是對(duì)所要處理的問(wèn)題的描述。類(lèi) 和 對(duì) 象C+語(yǔ)言程序設(shè)計(jì)類(lèi)的聲明

27、形式類(lèi)的聲明形式 類(lèi)是一種用戶自定義類(lèi)型,聲明形式:類(lèi)是一種用戶自定義類(lèi)型,聲明形式:class 類(lèi)名稱(chēng) public: 公有成員(外部接口) private: 私有成員 protected: 保護(hù)型成員類(lèi) 和 對(duì) 象C+語(yǔ)言程序設(shè)計(jì)公有類(lèi)型成員公有類(lèi)型成員在關(guān)鍵字在關(guān)鍵字public后面聲明,它們是類(lèi)后面聲明,它們是類(lèi)與外部的接口,任何外部函數(shù)都可以訪與外部的接口,任何外部函數(shù)都可以訪問(wèn)公有類(lèi)型數(shù)據(jù)和函數(shù)。問(wèn)公有類(lèi)型數(shù)據(jù)和函數(shù)。類(lèi) 和 對(duì) 象C+語(yǔ)言程序設(shè)計(jì)私有類(lèi)型成員私有類(lèi)型成員在關(guān)鍵字在關(guān)鍵字private后面聲明,后面聲明,只允許只允許本類(lèi)中的函數(shù)訪問(wèn),而類(lèi)外部的任何函本類(lèi)中的函數(shù)訪問(wèn)

28、,而類(lèi)外部的任何函數(shù)都不能訪問(wèn)。數(shù)都不能訪問(wèn)。如果如果緊跟在類(lèi)名稱(chēng)的后面聲明私有成員,緊跟在類(lèi)名稱(chēng)的后面聲明私有成員,則則關(guān)鍵字關(guān)鍵字privateprivate可以可以省略。省略。類(lèi) 和 對(duì) 象C+語(yǔ)言程序設(shè)計(jì)保護(hù)類(lèi)型保護(hù)類(lèi)型與與private類(lèi)似,其差別表現(xiàn)在繼承與類(lèi)似,其差別表現(xiàn)在繼承與派生時(shí)對(duì)派生類(lèi)的影響不同,派生時(shí)對(duì)派生類(lèi)的影響不同,第七章講第七章講。類(lèi) 和 對(duì) 象C+語(yǔ)言程序設(shè)計(jì)類(lèi)的成員類(lèi)的成員class Clock public: void SetTime(int NewH, int NewM, int NewS); void ShowTime(); private: int H

29、our, Minute, Second;類(lèi) 和 對(duì) 象成員數(shù)據(jù)成員函數(shù)void Clock : SetTime(int NewH, int NewM, int NewS) Hour=NewH; Minute=NewM; Second=NewS;void Clock : ShowTime() coutHour:Minute:Second;19C+語(yǔ)言程序設(shè)計(jì)成員數(shù)據(jù)成員數(shù)據(jù)l與一般的變量聲明相同,但需要將它放在類(lèi)的聲與一般的變量聲明相同,但需要將它放在類(lèi)的聲明體中。明體中。lclass complex private: double real; double imag; public: void

30、 init(double r,double i)real=r;imag=i; double realcomplex()return real; double imagcomplex()return imag; double abscomplex() double t; t=real*real+imag*imag; return sqrt(t); 類(lèi) 和 對(duì) 象C+語(yǔ)言程序設(shè)計(jì)成員函數(shù)成員函數(shù)l在類(lèi)中說(shuō)明原形,可以在在類(lèi)中說(shuō)明原形,可以在類(lèi)外給出函類(lèi)外給出函數(shù)體實(shí)現(xiàn),并在函數(shù)名前使用類(lèi)名加數(shù)體實(shí)現(xiàn),并在函數(shù)名前使用類(lèi)名加以限定。以限定。也可以也可以直接在類(lèi)中給出函數(shù)直接在類(lèi)中給出函數(shù)體,形成內(nèi)聯(lián)

31、成員函數(shù)體,形成內(nèi)聯(lián)成員函數(shù)。l允許聲明重載函數(shù)和帶默認(rèn)形參值的允許聲明重載函數(shù)和帶默認(rèn)形參值的函數(shù)函數(shù)類(lèi) 和 對(duì) 象C+語(yǔ)言程序設(shè)計(jì)帶缺省形參值的函數(shù)帶缺省形參值的函數(shù)lVoid clock:setTime(int NewH=0,int NewM=0,int NewS=0) Hour=NewH; Minute=NewM; Second=NewS; C+語(yǔ)言程序設(shè)計(jì)內(nèi)聯(lián)成員函數(shù)內(nèi)聯(lián)成員函數(shù)l為了提高運(yùn)行時(shí)的效率,對(duì)于較簡(jiǎn)單為了提高運(yùn)行時(shí)的效率,對(duì)于較簡(jiǎn)單的函數(shù)可以聲明為內(nèi)聯(lián)形式。的函數(shù)可以聲明為內(nèi)聯(lián)形式。l內(nèi)聯(lián)函數(shù)體中不要有復(fù)雜結(jié)構(gòu)(如循內(nèi)聯(lián)函數(shù)體中不要有復(fù)雜結(jié)構(gòu)(如循環(huán)語(yǔ)句和環(huán)語(yǔ)句和swit

32、ch語(yǔ)句)。語(yǔ)句)。l在類(lèi)中聲明內(nèi)聯(lián)成員函數(shù)的方式:在類(lèi)中聲明內(nèi)聯(lián)成員函數(shù)的方式: 將函數(shù)體放在類(lèi)的聲明中-隱式 使用inline關(guān)鍵字-顯式類(lèi) 和 對(duì) 象C+語(yǔ)言程序設(shè)計(jì)內(nèi)聯(lián)成員函數(shù)舉例內(nèi)聯(lián)成員函數(shù)舉例(隱式隱式)class Point public: void Init(int initX,int initY) X=initX; Y=initY; int GetX() return X; int GetY() return Y; private: int X,Y;類(lèi) 和 對(duì) 象C+語(yǔ)言程序設(shè)計(jì)內(nèi)聯(lián)成員函數(shù)舉例內(nèi)聯(lián)成員函數(shù)舉例(顯式顯式)class Point public: void In

33、it(int initX,int initY); int GetX(); int GetY(); private: int X,Y;類(lèi) 和 對(duì) 象inline void Point: Init(int initX,int initY) X=initX; Y=initY;inline int Point:GetX() return X;inline int Point:GetY() return Y;25C+語(yǔ)言程序設(shè)計(jì)對(duì)象對(duì)象l類(lèi)的對(duì)象是該類(lèi)的某一特定實(shí)體,即類(lèi)的對(duì)象是該類(lèi)的某一特定實(shí)體,即類(lèi)類(lèi)型的變量。類(lèi)類(lèi)型的變量。l聲明形式:聲明形式: 類(lèi)名類(lèi)名 對(duì)象名;對(duì)象名;l例:例: Clock m

34、yClock;類(lèi) 和 對(duì) 象C+語(yǔ)言程序設(shè)計(jì)類(lèi)中成員的訪問(wèn)方式類(lèi)中成員的訪問(wèn)方式l類(lèi)中成員互訪類(lèi)中成員互訪 直接使用成員名l類(lèi)外訪問(wèn)類(lèi)外訪問(wèn) 使用“對(duì)象名.成員名”方式訪問(wèn) public 屬性的成員類(lèi) 和 對(duì) 象C+語(yǔ)言程序設(shè)計(jì)例例 類(lèi)的應(yīng)用舉例類(lèi)的應(yīng)用舉例#includeusing namespace std;class Clock public: void SetTime(int NewH,int NewM,int NewS); void ShowTime(); private: int Hour,Minute,Second;void Clock:SetTime(int NewH,int

35、NewM,int NewS) Hour=NewH; Minute=NewM; Second=NewS;C+語(yǔ)言程序設(shè)計(jì)void Clock:ShowTime() coutHour“:”Minute“:”Second; void main(void) Clock myClock; myClock.SetTime(8,30,30); myClock.ShowTime();例例 類(lèi)的應(yīng)用舉例類(lèi)的應(yīng)用舉例C+語(yǔ)言程序設(shè)計(jì)結(jié)構(gòu)與類(lèi)結(jié)構(gòu)與類(lèi)Struct Savings unsigned accountNumber; float balance;void fn() Savings a; Savings b;

36、 a.accountNumber=1; b.accountNumber=2;結(jié)構(gòu)與類(lèi)的區(qū)別:類(lèi)中成員的缺省存儲(chǔ)屬性為私有的結(jié)構(gòu)體中的缺省存儲(chǔ)屬性為共有的C+語(yǔ)言程序設(shè)計(jì)構(gòu)造函數(shù)構(gòu)造函數(shù)l由于類(lèi)的封裝性,不能像普通變量一樣初始化由于類(lèi)的封裝性,不能像普通變量一樣初始化struct Savingsunsigned accountNumber; float balance;Savings A=1,2000.0;Savings B(2,3000.0);構(gòu)造函數(shù)和析構(gòu)函數(shù)C+語(yǔ)言程序設(shè)計(jì)構(gòu)造函數(shù)構(gòu)造函數(shù)l構(gòu)造函數(shù)的作用是在對(duì)象被創(chuàng)建時(shí)使用特定的構(gòu)造函數(shù)的作用是在對(duì)象被創(chuàng)建時(shí)使用特定的值去構(gòu)造對(duì)象,或者說(shuō)

37、將對(duì)象值去構(gòu)造對(duì)象,或者說(shuō)將對(duì)象初始化初始化為一個(gè)特為一個(gè)特定的狀態(tài)。定的狀態(tài)。l在對(duì)象創(chuàng)建時(shí)在對(duì)象創(chuàng)建時(shí)由系統(tǒng)自動(dòng)調(diào)用由系統(tǒng)自動(dòng)調(diào)用。l如果程序中未聲明,則系統(tǒng)自動(dòng)產(chǎn)生出一個(gè)如果程序中未聲明,則系統(tǒng)自動(dòng)產(chǎn)生出一個(gè)默默認(rèn)形式認(rèn)形式的構(gòu)造函數(shù)的構(gòu)造函數(shù)l允許為允許為內(nèi)聯(lián)內(nèi)聯(lián)函數(shù)、函數(shù)、重載重載函數(shù)、函數(shù)、帶默認(rèn)形參值帶默認(rèn)形參值的的函數(shù)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)C+語(yǔ)言程序設(shè)計(jì)構(gòu)造函數(shù)舉例構(gòu)造函數(shù)舉例class Clockpublic:Clock (int NewH, int NewM, int NewS);/構(gòu)造函數(shù)構(gòu)造函數(shù)void SetTime(int NewH, int NewM, int

38、NewS);void ShowTime();private:int Hour,Minute,Second;構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)的實(shí)現(xiàn):構(gòu)造函數(shù)的實(shí)現(xiàn):Clock:Clock(int NewH, int NewM, int NewS)Hour= NewH;Minute= NewM;Second= NewS;建立對(duì)象時(shí)構(gòu)造函數(shù)的作用:建立對(duì)象時(shí)構(gòu)造函數(shù)的作用:void main() Clock c (0,0,0); /隱含調(diào)用構(gòu)造函數(shù),將初始值作為實(shí)參。隱含調(diào)用構(gòu)造函數(shù),將初始值作為實(shí)參。 c.ShowTime();31C+語(yǔ)言程序設(shè)計(jì)重載構(gòu)造函數(shù):重載構(gòu)造函數(shù):/ex.h#include

39、class Demo int x,y; public: Demo(int a,int b) x=a; y=b; cout“Constructor demo(int ,int)be calledn”; Demo() cout“Constructor demo() be calledn”; void show() cout“X=”xt“Y=”yendl; ; C+語(yǔ)言程序設(shè)計(jì)#include “ex.h”void main() Demo d1(3,5); /A d1.Show(); Demo d2; /B d2.Show();該程序的輸出為:該程序的輸出為:Constructor Demo(int

40、 ,int) be calledX=3 Y=5Constructor Demo( ) be calledX=946 Y=928 (隨機(jī)值隨機(jī)值)C+語(yǔ)言程序設(shè)計(jì)拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參為本類(lèi)的拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參為本類(lèi)的對(duì)象引用。對(duì)象引用。作用:使用一個(gè)對(duì)象(參數(shù)指定的對(duì)象),去初始化一作用:使用一個(gè)對(duì)象(參數(shù)指定的對(duì)象),去初始化一個(gè)正在被建立的同類(lèi)型對(duì)象。個(gè)正在被建立的同類(lèi)型對(duì)象。class 類(lèi)名 public : 類(lèi)名(形參);/構(gòu)造函數(shù) 類(lèi)名(類(lèi)名 &對(duì)象名);/拷貝構(gòu)造函數(shù) .;類(lèi)名: 類(lèi)名(類(lèi)名 &對(duì)象名)

41、/拷貝構(gòu)造函數(shù)的實(shí)現(xiàn) 函數(shù)體 構(gòu)造函數(shù)和析構(gòu)函數(shù)C+語(yǔ)言程序設(shè)計(jì)例例 拷貝構(gòu)造函數(shù)舉例拷貝構(gòu)造函數(shù)舉例class Point public: Point(int xx=0,int yy=0); Point( Point &p); int GetX() return X; int GetY() return Y; private: int X,Y;構(gòu)造函數(shù)和析構(gòu)函數(shù)Point:Point(int xx,int yy) X=xx; Y=yy;Point:Point (Point& p) X=p.X; Y=p.Y; cout拷貝構(gòu)造函數(shù)被調(diào)用拷貝構(gòu)造函數(shù)被調(diào)用endl;Point b

42、(1,1);Point a(b);34C+語(yǔ)言程序設(shè)計(jì)拷貝構(gòu)造函數(shù)被調(diào)用的時(shí)機(jī)拷貝構(gòu)造函數(shù)被調(diào)用的時(shí)機(jī)l(1)當(dāng)用類(lèi)的一個(gè)對(duì)象去初始化該類(lèi)的)當(dāng)用類(lèi)的一個(gè)對(duì)象去初始化該類(lèi)的另一個(gè)對(duì)象時(shí)系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函另一個(gè)對(duì)象時(shí)系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù)實(shí)現(xiàn)拷貝賦值。數(shù)實(shí)現(xiàn)拷貝賦值。void main(void) Point A(1,2); Point B(A); /拷貝構(gòu)造函數(shù)被調(diào)用拷貝構(gòu)造函數(shù)被調(diào)用 coutB.GetX()endl;構(gòu)造函數(shù)和析構(gòu)函數(shù)C+語(yǔ)言程序設(shè)計(jì)l(2)若函數(shù)的形參為類(lèi)對(duì)象,調(diào)用函)若函數(shù)的形參為類(lèi)對(duì)象,調(diào)用函數(shù)時(shí),實(shí)參賦值給形參,系統(tǒng)自動(dòng)調(diào)數(shù)時(shí),實(shí)參賦值給形參,系統(tǒng)自動(dòng)調(diào)用拷貝

43、構(gòu)造函數(shù)。例如:用拷貝構(gòu)造函數(shù)。例如:void fun1(Point p) coutp.GetX()endl; void main() Point A(1,2); fun1(A); /調(diào)用拷貝構(gòu)造函數(shù)調(diào)用拷貝構(gòu)造函數(shù) 構(gòu)造函數(shù)和析構(gòu)函數(shù)拷貝構(gòu)造函數(shù)被調(diào)用的時(shí)機(jī)拷貝構(gòu)造函數(shù)被調(diào)用的時(shí)機(jī)C+語(yǔ)言程序設(shè)計(jì)l(3)當(dāng)函數(shù)的返回值是類(lèi)對(duì)象時(shí),系統(tǒng)自)當(dāng)函數(shù)的返回值是類(lèi)對(duì)象時(shí),系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù)。例如:動(dòng)調(diào)用拷貝構(gòu)造函數(shù)。例如:Point fun2() Point A(1,2); return A; /調(diào)用拷貝構(gòu)造函數(shù)調(diào)用拷貝構(gòu)造函數(shù)void main() Point B; B=fun2(); 構(gòu)造

44、函數(shù)和析構(gòu)函數(shù)拷貝構(gòu)造函數(shù)被調(diào)用的時(shí)機(jī)拷貝構(gòu)造函數(shù)被調(diào)用的時(shí)機(jī)C+語(yǔ)言程序設(shè)計(jì)拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)如果程序員沒(méi)有為類(lèi)聲明拷貝初始化構(gòu)造函數(shù),則編譯器自如果程序員沒(méi)有為類(lèi)聲明拷貝初始化構(gòu)造函數(shù),則編譯器自己生成一個(gè)拷貝構(gòu)造函數(shù)。己生成一個(gè)拷貝構(gòu)造函數(shù)。這個(gè)構(gòu)造函數(shù)執(zhí)行的功能是:用作為初始值的對(duì)象的每個(gè)數(shù)這個(gè)構(gòu)造函數(shù)執(zhí)行的功能是:用作為初始值的對(duì)象的每個(gè)數(shù)據(jù)成員的值,初始化將要建立的對(duì)象的對(duì)應(yīng)數(shù)據(jù)成員。據(jù)成員的值,初始化將要建立的對(duì)象的對(duì)應(yīng)數(shù)據(jù)成員。Point(Point &p) Point A(1,2);X=p.x; Point B(A); Y=p.y; B.X=A.X 如果沒(méi)有定義

45、這個(gè)函數(shù)如果沒(méi)有定義這個(gè)函數(shù) B.Y=A.Y構(gòu)造函數(shù)和析構(gòu)函數(shù)C+語(yǔ)言程序設(shè)計(jì)析構(gòu)函數(shù)析構(gòu)函數(shù)l完成對(duì)象被刪除前的一些清理工作。完成對(duì)象被刪除前的一些清理工作。l在對(duì)象的生存期結(jié)束的時(shí)刻系統(tǒng)自動(dòng)調(diào)用它,在對(duì)象的生存期結(jié)束的時(shí)刻系統(tǒng)自動(dòng)調(diào)用它,然后再釋放此對(duì)象所屬的空間。然后再釋放此對(duì)象所屬的空間。l如果程序中未聲明析構(gòu)函數(shù),編譯器將自動(dòng)如果程序中未聲明析構(gòu)函數(shù),編譯器將自動(dòng)產(chǎn)生一個(gè)默認(rèn)的析構(gòu)函數(shù)。產(chǎn)生一個(gè)默認(rèn)的析構(gòu)函數(shù)。構(gòu)造函數(shù)和析構(gòu)函數(shù)C+語(yǔ)言程序設(shè)計(jì)構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例#includeusing namespace std;class Point public: P

46、oint(int xx,int yy); Point(); /.其它函數(shù)原形其它函數(shù)原形 private: int X,int Y;構(gòu)造函數(shù)和析構(gòu)函數(shù)Point:Point(int xx,int yy) X=xx; Y=yy;Point:Point()/.其它函數(shù)的實(shí)現(xiàn)略其它函數(shù)的實(shí)現(xiàn)略41C+語(yǔ)言程序設(shè)計(jì)#include class Q int x,y; public: Q(int a=0,int b=0) cout“調(diào)用了構(gòu)造函數(shù)!調(diào)用了構(gòu)造函數(shù)!”endl; x=a; y=b; void P(void) coutxtyn; Q() cout“調(diào)用了析構(gòu)函數(shù)!調(diào)用了析構(gòu)函數(shù)!”n;void

47、 main(void) Q q(50,100); q.P(); cout“退出主函數(shù)!退出主函數(shù)!n”;輸出:調(diào)用了構(gòu)造函數(shù)!輸出:調(diào)用了構(gòu)造函數(shù)! 50 100 退出主函數(shù)!退出主函數(shù)! 調(diào)用了析構(gòu)函數(shù)!調(diào)用了析構(gòu)函數(shù)! C+語(yǔ)言程序設(shè)計(jì)類(lèi)的應(yīng)用舉例類(lèi)的應(yīng)用舉例一圓型游泳池如圖所示,現(xiàn)在需在其周?chē)粓A型游泳池如圖所示,現(xiàn)在需在其周?chē)ㄒ粓A型過(guò)道,并在其四周?chē)蠔艡?。柵欄價(jià)格建一圓型過(guò)道,并在其四周?chē)蠔艡凇艡趦r(jià)格為為35元元/米,過(guò)道造價(jià)為米,過(guò)道造價(jià)為20元元/平方米。過(guò)道寬度平方米。過(guò)道寬度為為3米,游泳池半徑由鍵盤(pán)輸入。要求編程計(jì)算米,游泳池半徑由鍵盤(pán)輸入。要求編程計(jì)算并輸出過(guò)道和柵

48、欄的造價(jià)。并輸出過(guò)道和柵欄的造價(jià)。游泳池過(guò)道#include using namespace std;const float PI = 3.14159;const float FencePrice = 35;const float ConcretePrice = 20;/聲明類(lèi)聲明類(lèi)Circle 及其數(shù)據(jù)和方法及其數(shù)據(jù)和方法class Circle private: float radius; public: Circle(float r); /構(gòu)造函數(shù)構(gòu)造函數(shù) float Circumference(); /圓周長(zhǎng)圓周長(zhǎng) float Area(); /圓面積圓面積;43/ 類(lèi)的實(shí)現(xiàn)類(lèi)的實(shí)現(xiàn)/

49、 構(gòu)造函數(shù)初始化數(shù)據(jù)成員構(gòu)造函數(shù)初始化數(shù)據(jù)成員radiusCircle:Circle(float r)radius=r/ 計(jì)算圓的周長(zhǎng)計(jì)算圓的周長(zhǎng)float Circle:Circumference() return 2 * PI * radius; / 計(jì)算圓的面積計(jì)算圓的面積 float Circle:Area() return PI * radius * radius;44void main () float radius; float FenceCost, ConcreteCost; / 提示用戶輸入半徑提示用戶輸入半徑 coutradius; / 聲明聲明 Circle 對(duì)象對(duì)象 C

50、ircle Pool(radius);/自動(dòng)調(diào)用構(gòu)造函數(shù)自動(dòng)調(diào)用構(gòu)造函數(shù) Circle PoolRim(radius + 3); 45/ 計(jì)算柵欄造價(jià)并輸出計(jì)算柵欄造價(jià)并輸出 FenceCost = PoolRim.Circumference() * FencePrice; cout Fencing Cost is ¥ FenceCost endl; / 計(jì)算過(guò)道造價(jià)并輸出計(jì)算過(guò)道造價(jià)并輸出 ConcreteCost = (PoolRim.Area() - Pool.Area()*ConcretePrice; cout Concrete Cost is ¥ ConcreteCost endl;

51、運(yùn)行結(jié)果運(yùn)行結(jié)果Enter the radius of the pool: 10Fencing Cost is ¥2858.85Concrete Cost is ¥4335.3946C+語(yǔ)言程序設(shè)計(jì)例:復(fù)數(shù)例:復(fù)數(shù)(類(lèi)與對(duì)象、內(nèi)聯(lián)成員函數(shù))(類(lèi)與對(duì)象、內(nèi)聯(lián)成員函數(shù))#include #include Class complexPrivate: double real; double imag;Public: void init(double r,double i) real=r;imag=I; double realcomplex() return real; double imagcompl

52、ex() return imag; double abscomplex() double t; t=real*real+imag*imag; return sqrt(t); ;void main() complex a; a.init(1.1,2.2); cout“real of complex a=”a.realcomplex()endl; cout“image of complex a=”a.imagecomplex()endl; cout“abs of complex a=”a.abscomplex()endl;C+語(yǔ)言程序設(shè)計(jì)例:復(fù)數(shù)例:復(fù)數(shù) (構(gòu)造函數(shù))(構(gòu)造函數(shù))#include

53、#include Class complexPrivate: double real; double imag;Public: complex(double r,double i) real=r;imag=I; double realcomplex() return real; double imagcomplex() return imag; double abscomplex() double t; t=real*real+imag*imag; return sqrt(t); ;void main() complex a(1.1,2.2); cout“real of complex a=”

54、a.realcomplex()endl; cout“image of complex a=”a.imagecomplex()endl; cout“abs of complex a=”a.abscomplex()endl;C+語(yǔ)言程序設(shè)計(jì)例:復(fù)數(shù)例:復(fù)數(shù) (帶缺省參數(shù)構(gòu)造函數(shù))(帶缺省參數(shù)構(gòu)造函數(shù))#include #include Class complexPrivate: double real; double imag;Public: complex(double r=0.0,double i=0.0) real=r;imag=I; double realcomplex() return

55、real; double imagcomplex() return imag; double abscomplex() double t; t=real*real+imag*imag; return sqrt(t); ;void main() complex a(1.1,2.2); complex b; complex c(1.0); cout“real of complex a=”a.realcomplex()endl; cout“image of complex a=”a.imagecomplex()endl; cout“abs of complex a=”a.abscomplex()en

56、dl;C+語(yǔ)言程序設(shè)計(jì)例:復(fù)數(shù)例:復(fù)數(shù) (構(gòu)造函數(shù)重載)(構(gòu)造函數(shù)重載)#include #include Class complexPrivate: double real; double imag;Public: complex(double r,double i) real=r;imag=I; complex() real=0.0; imag=0.0; double realcomplex() return real; double imagcomplex() return imag; double abscomplex() double t; t=real*real+imag*imag

57、; return sqrt(t); ;void main() complex a(1.1,2.2); cout“real of complex a=”a.realcomplex()endl; cout“image of complex a=”a.imagecomplex()endl; cout“abs of complex a=”a.abscomplex()endl; complex b; cout“real of complex a=”b.realcomplex()endl; cout“image of complex a=”b.imagecomplex()endl; cout“abs of

58、 complex a=”b.abscomplex()endl;l參數(shù)能不能給一個(gè)值參數(shù)能不能給一個(gè)值 如:如:complex c(1.1);行嗎?行嗎?C+語(yǔ)言程序設(shè)計(jì)例:復(fù)數(shù)例:復(fù)數(shù) (析構(gòu)函數(shù))(析構(gòu)函數(shù))#include #include Class complexPrivate: double real; double imag;Public: complex(double r=0.0,double i=0.0) real=r;imag=I; complex() cout“destructing.n”; double realcomplex() return real; double

59、imagcomplex() return imag; double abscomplex() double t; t=real*real+imag*imag; return sqrt(t); ;void main() complex a(1.1,2.2); cout“real of complex a=”a.realcomplex()endl; cout“image of complex a=”a.imagecomplex()endl; cout“abs of complex a=”a.abscomplex()endl; complex b; cout“real of complex a=”b

60、.realcomplex()endl; cout“image of complex a=”b.imagecomplex()endl; cout“abs of complex a=”b.abscomplex()endl;C+語(yǔ)言程序設(shè)計(jì)例:復(fù)數(shù)例:復(fù)數(shù) (拷貝構(gòu)造函數(shù)(拷貝構(gòu)造函數(shù)應(yīng)用應(yīng)用A)#include #include Class complexPrivate: double real; double imag;Public: complex(double r=0.0,double i=0.0) real=r;imag=I; complex(complex &c) real=c.real; imag=c.imag; complex() cout“de

溫馨提示

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