c++面向?qū)ο蟪绦蛟O(shè)計(jì)
《c++面向?qū)ο蟪绦蛟O(shè)計(jì)》由會(huì)員分享,可在線閱讀,更多相關(guān)《c++面向?qū)ο蟪绦蛟O(shè)計(jì)(417頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、 面向?qū)ο蟮乃枷胱畛醭霈F(xiàn)于挪威奧斯陸大學(xué)和挪面向?qū)ο蟮乃枷胱畛醭霈F(xiàn)于挪威奧斯陸大學(xué)和挪威計(jì)算機(jī)中心共同研制的威計(jì)算機(jī)中心共同研制的Simula 67語言中,隨著的語言中,隨著的Smalltalk-76和和8080語言推出,面向?qū)ο蟮牡某绦蛟O(shè)計(jì)語言推出,面向?qū)ο蟮牡某绦蛟O(shè)計(jì)方法得到了比較完善的實(shí)現(xiàn)。方法得到了比較完善的實(shí)現(xiàn)。 此后,面向?qū)ο蟮母拍詈蛻?yīng)用已超越了程序設(shè)計(jì)此后,面向?qū)ο蟮母拍詈蛻?yīng)用已超越了程序設(shè)計(jì)和軟件開發(fā),擴(kuò)展到如數(shù)據(jù)庫系統(tǒng),交互式界面,分和軟件開發(fā),擴(kuò)展到如數(shù)據(jù)庫系統(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í)體或單位。接口說明外部可見,其個(gè)設(shè)計(jì)實(shí)體或單位。接口說明外部可見,其實(shí)現(xiàn)是隱蔽的,不可見的。實(shí)現(xiàn)是隱蔽的,不可見的。發(fā)展的三個(gè)階段發(fā)展的三個(gè)階段01010101100100IntegerRealBoolean用戶用戶定義定義抽象數(shù)抽象數(shù)據(jù)類型據(jù)類型抽象數(shù)據(jù)類型抽象數(shù)據(jù)類型 抽象數(shù)據(jù)類型是指抽象數(shù)據(jù)類型是指“一個(gè)值集和作用在一個(gè)值集和作用在該值集上的操作集該值集上的操作集”。抽象數(shù)據(jù)類型的定義。抽象數(shù)據(jù)類型的定義只決定于其邏輯特性,與其具體的計(jì)算機(jī)內(nèi)只決定于其邏輯特性,與其具體的計(jì)算機(jī)內(nèi)部實(shí)現(xiàn)
3、無關(guān)。一個(gè)抽象數(shù)據(jù)類型可以分解為部實(shí)現(xiàn)無關(guān)。一個(gè)抽象數(shù)據(jù)類型可以分解為語法、語義、表示和算法語法、語義、表示和算法4個(gè)部分。個(gè)部分。功能抽象功能抽象模塊模塊數(shù)據(jù)抽象數(shù)據(jù)抽象模塊模塊抽象數(shù)據(jù)類型的實(shí)現(xiàn)抽象數(shù)據(jù)類型的實(shí)現(xiàn)實(shí)現(xiàn)抽象數(shù)據(jù)類型需要借助于高級(jí)程序設(shè)計(jì)實(shí)現(xiàn)抽象數(shù)據(jù)類型需要借助于高級(jí)程序設(shè)計(jì)語言;語言;在面向過程的語言中,用戶可以自己定義數(shù)在面向過程的語言中,用戶可以自己定義數(shù)據(jù)類型;據(jù)類型;在面向?qū)ο蟮某绦蛟O(shè)計(jì)語言中,借助于對(duì)象在面向?qū)ο蟮某绦蛟O(shè)計(jì)語言中,借助于對(duì)象描述抽象數(shù)據(jù)類型。描述抽象數(shù)據(jù)類型。(Class)問題求解問題求解面向?qū)ο笤O(shè)計(jì)方法:實(shí)現(xiàn)問題空間和問題求面向?qū)ο笤O(shè)計(jì)方法:實(shí)現(xiàn)問
4、題空間和問題求解空間的近似和直接模擬。解空間的近似和直接模擬。意識(shí)部分意識(shí)部分教室教室物質(zhì)部分物質(zhì)部分303303教室教室抽象部分抽象部分教室類教室類具體部分具體部分一個(gè)對(duì)象:教室實(shí)例一個(gè)對(duì)象:教室實(shí)例現(xiàn)實(shí)問題空間現(xiàn)實(shí)問題空間解空間解空間封裝機(jī)制封裝機(jī)制基于消息的通信基于消息的通信繼承機(jī)制繼承機(jī)制多態(tài)機(jī)制多態(tài)機(jī)制 理解面向?qū)ο蟮幕靖拍顚?duì)于學(xué)習(xí)和掌握面向理解面向?qū)ο蟮幕靖拍顚?duì)于學(xué)習(xí)和掌握面向?qū)ο蟮拈_發(fā)方法是十分重要的。對(duì)象的開發(fā)方法是十分重要的。 類類(ClassClass)對(duì)象對(duì)象( (Object)Object)實(shí)例實(shí)例( (Instance)Instance)( (Polymorphi
5、sm)Polymorphism)繼承繼承(InheritanceInheritance)消息消息( (Message)Message)封裝封裝(Encapsulation)(Encapsulation)把客觀世界從概念上看成是一個(gè)由相互配合而協(xié)把客觀世界從概念上看成是一個(gè)由相互配合而協(xié)作的對(duì)象所組成的系統(tǒng)作的對(duì)象所組成的系統(tǒng)面向?qū)ο竺嫦驅(qū)ο?對(duì)象對(duì)象+分類分類+繼承繼承+通信通信一個(gè)實(shí)例一個(gè)實(shí)例椅子椅子對(duì)象:桌子對(duì)象:桌子價(jià)格價(jià)格尺寸尺寸重量重量位置位置顏色顏色類:家具類:家具對(duì)象:椅子對(duì)象:椅子價(jià)格價(jià)格尺寸尺寸重量重量位置位置顏色顏色買賣移動(dòng)買買賣賣移動(dòng)移動(dòng)買買賣賣移動(dòng)移動(dòng)價(jià)格價(jià)格尺寸尺寸重
6、量重量位置位置顏色顏色對(duì)象對(duì)象對(duì)象對(duì)象( (Object)Object)對(duì)象是用來描述客觀存在的事物,它是構(gòu)成對(duì)象是用來描述客觀存在的事物,它是構(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ù)是私有的,所以要想訪問其數(shù)據(jù)的正確方法是向該對(duì)象發(fā)送消息,讓對(duì)象
7、自身選擇其內(nèi)部相應(yīng)的操作以完成對(duì)該項(xiàng)數(shù)據(jù)的訪問對(duì)象的動(dòng)作取決于外界給對(duì)象的刺激,這就是消息,消息告訴對(duì)象所要求它完成的功能。對(duì)象具有一定的智能功能,即“知道”如何選擇相應(yīng)的操作來處理對(duì)象所接收的消息從設(shè)計(jì)人員的角度看,對(duì)象是一個(gè)完成特定功能的程序塊從設(shè)計(jì)人員的角度看,對(duì)象是一個(gè)完成特定功能的程序塊從用戶的角度看,對(duì)象為他們提供了所希望的行為從用戶的角度看,對(duì)象為他們提供了所希望的行為對(duì)象對(duì)象(Object)對(duì)象標(biāo)識(shí)對(duì)象標(biāo)識(shí)對(duì)象生命周期對(duì)象生命周期類類又稱又稱對(duì)象類對(duì)象類一組具有相一組具有相同屬性和相同操作的對(duì)象的集合。同屬性和相同操作的對(duì)象的集合。在一個(gè)類中,每個(gè)對(duì)象都是類的在一個(gè)類中,每個(gè)對(duì)
8、象都是類的實(shí)例實(shí)例(instance) ,它們都可以使用類中提供的函數(shù)。它們都可以使用類中提供的函數(shù)。類具有屬性類具有屬性,用數(shù)據(jù)結(jié)構(gòu)來描述類的屬性,用數(shù)據(jù)結(jié)構(gòu)來描述類的屬性,類具有操作,類具有操作,它是對(duì)象的行為的抽象,操作實(shí)現(xiàn)它是對(duì)象的行為的抽象,操作實(shí)現(xiàn)的過程稱為方法的過程稱為方法(method) ,方法有方法名,方法,方法有方法名,方法體和參數(shù)。體和參數(shù)。 幾何對(duì)象幾何對(duì)象顏色顏色位置位置移動(dòng)(移動(dòng)(delta:矢量):矢量)選擇(選擇(P:指針型)指針型):布爾型布爾型旋轉(zhuǎn)旋轉(zhuǎn)(角度角度)圖1 對(duì)象類的描述人人姓姓 名名:字符串字符串年年 齡齡: 整整 型型改換工作改換工作改換地址改
9、換地址文件文件文件名文件名文件大小文件大小最近更新日期最近更新日期打印打印(人人)張紅兵張紅兵28繪圖員繪圖員人民路人民路8號(hào)號(hào)(人人)李軍李軍24程序員程序員無無圖2 對(duì)象的描述類名類名屬性屬性運(yùn)算運(yùn)算 對(duì)象對(duì)象 類類屬于某類的具體對(duì)象就是該類的屬于某類的具體對(duì)象就是該類的。一個(gè)類的不同實(shí)例必定具有:一個(gè)類的不同實(shí)例必定具有:相同的操作(或行為)的集合相同的操作(或行為)的集合相同的信息結(jié)構(gòu)或?qū)傩远x,但可以有不同的屬性值相同的信息結(jié)構(gòu)或?qū)傩远x,但可以有不同的屬性值不同的對(duì)象標(biāo)識(shí)不同的對(duì)象標(biāo)識(shí)消息消息(Message)對(duì)象之間的聯(lián)系是通過傳遞消息來實(shí)現(xiàn)的。對(duì)象之間的聯(lián)系是通過傳遞消息來實(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ì)象做什么的部分稱為消息操作;息中告訴對(duì)象做什么的部分稱為消息操作;(2)消息操作名類似于函數(shù)名,其本質(zhì)
11、區(qū)別在)消息操作名類似于函數(shù)名,其本質(zhì)區(qū)別在于:函數(shù)名代表一段可執(zhí)行的代碼,但消息操于:函數(shù)名代表一段可執(zhí)行的代碼,但消息操作名具體功能的選定還取決于接收消息的對(duì)象作名具體功能的選定還取決于接收消息的對(duì)象本身本身(3)函數(shù)調(diào)用是過程式的(如何做),消息傳)函數(shù)調(diào)用是過程式的(如何做),消息傳送是說明式的(做什么),具體如何做,由對(duì)送是說明式的(做什么),具體如何做,由對(duì)象根據(jù)收到的消息自行確定。象根據(jù)收到的消息自行確定。 繼承是使用現(xiàn)存的定義作為基礎(chǔ),建立新定義的繼承是使用現(xiàn)存的定義作為基礎(chǔ),建立新定義的技術(shù)。技術(shù)。是父類和子類之間共享數(shù)據(jù)結(jié)構(gòu)和方法的機(jī)制,是父類和子類之間共享數(shù)據(jù)結(jié)構(gòu)和方法的
12、機(jī)制,這是類之間的一種關(guān)系。這是類之間的一種關(guān)系。 繼承性分:繼承性分: 單重繼承:單重繼承:一個(gè)子類只有一個(gè)父類。即一個(gè)子類只有一個(gè)父類。即子類只繼承子類只繼承一個(gè)父類的數(shù)據(jù)結(jié)構(gòu)和方法。一個(gè)父類的數(shù)據(jù)結(jié)構(gòu)和方法。 多重繼承:多重繼承:一個(gè)子類可有多個(gè)父類。繼承多個(gè)一個(gè)子類可有多個(gè)父類。繼承多個(gè)父類父類的數(shù)據(jù)結(jié)構(gòu)和方法。的數(shù)據(jù)結(jié)構(gòu)和方法?;惢愖宇愖宇怉子類子類B圖 4 繼承性描述現(xiàn)存類定義現(xiàn)存類定義父類父類( (基類基類) )新類定義新類定義子類子類( (派生類派生類) )繼繼 承承圖 3 繼承性單繼承單繼承CheckingSavingsSuperclass (parent)Subclas
13、sesInheritance 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ú)立的基本單位,用戶只能見到對(duì)象封裝界面上的信息,位,用戶只能見到對(duì)象封裝界面上的信息,對(duì)象內(nèi)部對(duì)用戶是隱蔽的。封裝的目的在于對(duì)象內(nèi)部對(duì)用戶是隱蔽的。封裝的目的在于將對(duì)象的使用者和對(duì)象的設(shè)計(jì)者分開,使用將對(duì)象的使用者和對(duì)象的設(shè)計(jì)者分開,使用者不必知道行為實(shí)現(xiàn)的細(xì)節(jié),只需使用設(shè)計(jì)者不必知道行為實(shí)現(xiàn)的細(xì)節(jié),只需使用設(shè)計(jì)者提供的消息訪問對(duì)象者提供的消息訪問對(duì)象 封裝是把過程和數(shù)據(jù)包圍起來,對(duì)數(shù)據(jù)的封裝是把過程和數(shù)據(jù)包圍起來,對(duì)數(shù)據(jù)的訪問只能通過已定義的界面。訪問只能通過已定義的界面。PosColor 公有公有消息消息私有私有消息消息存
15、儲(chǔ)結(jié)構(gòu)方法協(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ì)象的類的供的功能細(xì)節(jié),實(shí)現(xiàn)細(xì)節(jié)不能在定義這個(gè)對(duì)象的類的外面訪問外面訪問矛盾嗎?矛盾嗎?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è)即一個(gè)名字具有多種語義。名字具有多種語義。同一對(duì)象接收到不同消息采用不同的行為方式同一對(duì)象接收到不同消息采用不同的行為方式不同對(duì)象收到相同消息時(shí)產(chǎn)生不同的動(dòng)作不同對(duì)象收到相同消息時(shí)產(chǎn)生不同的動(dòng)作重載(重載(overload)動(dòng)態(tài)綁定動(dòng)態(tài)綁定類屬類屬 例如:例如: “繪圖繪圖”操作,作用在操作,作用在“橢圓橢圓” 和和“矩矩形形” 上,畫出不同的圖形。上,畫出不同的圖形。使用虛函數(shù)可實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編,不同聯(lián)編可以選擇使用虛函
17、數(shù)可實(shí)現(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)在基類中,定義成員函數(shù)為虛函數(shù)在基類中,定義成員函數(shù)為虛函數(shù)(virtual);(2)(2)定義基類的公有定義基類的公有(public)派生類;派生類;(3)(3)在基類的公有派生類中在基類的公有派生類中“重載重載”該虛函數(shù);該虛函數(shù);(4)(4)定義指向基類的指針變量,它指向基類的公定義指向基類的指針變量,它指向基類的公有派生類的對(duì)象。有派生類的對(duì)象。重載虛函數(shù)不是一般的重載函數(shù),它要求函數(shù)重載虛函數(shù)不是
18、一般的重載函數(shù),它要求函數(shù)名、返回類型、參數(shù)個(gè)數(shù)、參數(shù)類型和順序完全相同。名、返回類型、參數(shù)個(gè)數(shù)、參數(shù)類型和順序完全相同。例如:例如:下面是實(shí)現(xiàn)下面是實(shí)現(xiàn)“多態(tài)性多態(tài)性” 的一個(gè)例子的一個(gè)例子#include using namespace std;class figure /定義基類定義基類 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 ”; cout
19、set_dim(10.0,5.0); p-show_area(); p=&c; / 指向圓形對(duì)象指向圓形對(duì)象 p-set_dim(9.0); p-show_area();void main() figure *p; /定義指向基類的指針變量定義指向基類的指針變量 triangle t; / square s; / 定義基類的公有派生類的對(duì)象定義基類的公有派生類的對(duì)象 circle c; / p=&t; / 指向三角形對(duì)象指向三角形對(duì)象 p-set_dim(10.0,5.0); p-show_area();figureCircleTriangleSquarearea()area()area()a
20、rea()類與對(duì)象類與對(duì)象C+語言程序設(shè)計(jì)C+語言程序設(shè)計(jì)本章主要內(nèi)容本章主要內(nèi)容l面向?qū)ο蟮乃枷朊嫦驅(qū)ο蟮乃枷雔OOP的基本特點(diǎn)的基本特點(diǎn)l類概念和聲明類概念和聲明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類的組合類的組合C+語言程序設(shè)計(jì)回顧:面向過程的設(shè)計(jì)方法回顧:面向過程的設(shè)計(jì)方法l重點(diǎn)重點(diǎn): 如何實(shí)現(xiàn)細(xì)節(jié)過程,將數(shù)據(jù)與函數(shù)分開。l形式:形式: 主模塊+若干個(gè)子模塊(main()+子函數(shù))。l特點(diǎn):特點(diǎn): 自頂向下,逐步求精功能分解。l缺點(diǎn):缺點(diǎn): 效率低,程序的可重用性差。面向?qū)ο蟮乃枷隒+語言程序設(shè)計(jì)面向?qū)ο蟮姆椒嫦驅(qū)ο蟮姆?/p>
21、法l目的:目的: 實(shí)現(xiàn)軟件設(shè)計(jì)的產(chǎn)業(yè)化。l觀點(diǎn)觀點(diǎn):解決問題屬于自然界的。解決問題屬于自然界的。 自然界是由實(shí)體(對(duì)象)所組成。l程序設(shè)計(jì)方法:程序設(shè)計(jì)方法: 使用面向?qū)ο蟮挠^點(diǎn)來描述模仿并處理現(xiàn)實(shí)問題。l要求:要求: 高度概括、分類、和抽象。面向?qū)ο蟮乃枷隒+語言程序設(shè)計(jì)(1)抽象)抽象l抽象是對(duì)具體對(duì)象(問題)進(jìn)行概括,抽象是對(duì)具體對(duì)象(問題)進(jìn)行概括,抽出這一類對(duì)象的公共性質(zhì)并加以描述抽出這一類對(duì)象的公共性質(zhì)并加以描述的過程。(如學(xué)生,教師的過程。(如學(xué)生,教師, 課程)課程) 先注意問題的本質(zhì)及描述,其次是實(shí)現(xiàn)過程或細(xì)節(jié)。 數(shù)據(jù)抽象:描述某類對(duì)象的屬性或狀態(tài)(對(duì)象相互區(qū)別的物理量)。
22、行為抽象:描述某類對(duì)象的共有的行為特征或具有的功能。 抽象的實(shí)現(xiàn):通過類的聲明。OOP的基本特點(diǎn)C+語言程序設(shè)計(jì)抽象實(shí)例抽象實(shí)例鐘表鐘表l數(shù)據(jù)抽象:數(shù)據(jù)抽象: int Hour, int Minute, int Secondl行為抽象:行為抽象: SetTime(), ShowTime()OOP的基本特點(diǎn)C+語言程序設(shè)計(jì)抽象實(shí)例抽象實(shí)例鐘表類鐘表類class Clock public: void SetTime(int NewH, int NewM, int NewS); void ShowTime(); private: int Hour,Minute,Second;OOP的基本特點(diǎn)C+語言
23、程序設(shè)計(jì)抽象實(shí)例抽象實(shí)例人人l數(shù)據(jù)抽象:數(shù)據(jù)抽象:char *name,char *sex, int age, int idl行為抽象:行為抽象:生物屬性角度:GetCloth(), Eat(), 社會(huì)屬性角度:Work(), Promote() ,注意:同一個(gè)問題可能有不同的抽象結(jié)果:根據(jù)解決問題的要求不同,產(chǎn)生的抽象成員可能不同OOP的基本特點(diǎn)C+語言程序設(shè)計(jì)(2) 封裝封裝l將抽象出的數(shù)據(jù)成員、行為成員相結(jié)將抽象出的數(shù)據(jù)成員、行為成員相結(jié)合,將它們視為一個(gè)整體,即類。合,將它們視為一個(gè)整體,即類。 目的是增強(qiáng)安全性和簡化編程,使用者不必了解具體的實(shí)現(xiàn)細(xì)節(jié),而只需要通過外部接口,以特定的訪
24、問權(quán)限,來使用類的成員。 實(shí)現(xiàn)封裝:類聲明中的OOP的基本特點(diǎn)C+語言程序設(shè)計(jì)封裝封裝l實(shí)例:實(shí)例: class Clock public: void SetTime(int NewH,int NewM, int NewS); void ShowTime(); private: int Hour,Minute,Second; ;邊界特定的訪問權(quán)限OOP的基本特點(diǎn)外部接口C+語言程序設(shè)計(jì)(3)繼承與派生)繼承與派生l為了重用引出了繼函的概念。為了重用引出了繼函的概念。l是是C+中支持層次分類的一種機(jī)制,允許程序員中支持層次分類的一種機(jī)制,允許程序員在保持原有類特性的基礎(chǔ)上,進(jìn)行更具體的說明。在保
25、持原有類特性的基礎(chǔ)上,進(jìn)行更具體的說明。l實(shí)現(xiàn):聲明派生類實(shí)現(xiàn):聲明派生類第第11章章l昆蟲的分類樹昆蟲的分類樹OOP的基本特點(diǎn)C+語言程序設(shè)計(jì)多態(tài)性多態(tài)性l多態(tài):同一名稱,不同的功能實(shí)現(xiàn)方式。多態(tài):同一名稱,不同的功能實(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+語言程序設(shè)計(jì)c+中的類中的類l類是具有相同屬性和行為的一組對(duì)象類是具有相同屬性和行為的一組對(duì)象的集合,它為屬于該類的全部對(duì)象提的集合,它為屬于該類的全部對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬供了
26、統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個(gè)主要部分。性和行為兩個(gè)主要部分。l利用類可以實(shí)現(xiàn)數(shù)據(jù)的封裝、隱藏、利用類可以實(shí)現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。繼承與派生。l利用類易于編寫大型復(fù)雜程序,其模利用類易于編寫大型復(fù)雜程序,其模塊化程度比塊化程度比C中采用函數(shù)更高。中采用函數(shù)更高。類 和 對(duì) 象C+語言程序設(shè)計(jì)類與函數(shù)類與函數(shù)l函數(shù)是將邏輯上相關(guān)的函數(shù)是將邏輯上相關(guān)的語句與數(shù)據(jù)語句與數(shù)據(jù)封封裝,用于完成特定的功能。裝,用于完成特定的功能。l而類則是邏輯上相關(guān)的而類則是邏輯上相關(guān)的函數(shù)與數(shù)據(jù)函數(shù)與數(shù)據(jù)的的封裝,它是對(duì)所要處理的問題的描述。封裝,它是對(duì)所要處理的問題的描述。類 和 對(duì) 象C+語言程
27、序設(shè)計(jì)類的聲明形式類的聲明形式l 類是一種用戶自定義類型,聲明形類是一種用戶自定義類型,聲明形式:式: class 類名稱 public: 公有成員(外部接口) private: 私有成員 protected: 保護(hù)型成員 類 和 對(duì) 象C+語言程序設(shè)計(jì)公有類型成員公有類型成員l在關(guān)鍵字在關(guān)鍵字public后面聲明,它們是類后面聲明,它們是類與外部的接口,任何外部函數(shù)都可以訪與外部的接口,任何外部函數(shù)都可以訪問公有類型數(shù)據(jù)和函數(shù)。問公有類型數(shù)據(jù)和函數(shù)。類 和 對(duì) 象C+語言程序設(shè)計(jì)私有類型成員私有類型成員l在關(guān)鍵字在關(guān)鍵字private后面聲明,只允許后面聲明,只允許本類中的函數(shù)訪問,而類外部
28、的任何函本類中的函數(shù)訪問,而類外部的任何函數(shù)都不能訪問。數(shù)都不能訪問。l如果緊跟在類名稱的后面聲明私有成如果緊跟在類名稱的后面聲明私有成員,則關(guān)鍵字員,則關(guān)鍵字privateprivate可以省略??梢允÷浴n?和 對(duì) 象C+語言程序設(shè)計(jì)保護(hù)類型保護(hù)類型l與與private類似,其差別表現(xiàn)在繼承與類似,其差別表現(xiàn)在繼承與派生時(shí)對(duì)派生類的影響不同,派生時(shí)對(duì)派生類的影響不同,第七章講第七章講。類 和 對(duì) 象C+語言程序設(shè)計(jì)類的成員類的成員 class Clock public: void SetTime(int NewH, int NewM, int NewS); void ShowTime();
29、 private: int Hour, Minute, Second; ;類 和 對(duì) 象成員數(shù)據(jù)成員函數(shù)lvoid Clock : SetTime(int NewH, int NewM, int NewS)ll Hour=NewH;l Minute=NewM;l Second=NewS;llvoid Clock : ShowTime()ll coutHour:Minute:Second;l19C+語言程序設(shè)計(jì)成員數(shù)據(jù)成員數(shù)據(jù)l與一般的變量聲明相同,但需要將它放在類的聲與一般的變量聲明相同,但需要將它放在類的聲明體中。明體中。lclass complexl private:l double re
30、al;l double imag;l public:l void init(double r,double i)real=r;imag=i;l double realcomplex()return real;l double imagcomplex()return imag;l double abscomplex()l double t;l t=real*real+imag*imag;l return sqrt(t);l l l 類 和 對(duì) 象C+語言程序設(shè)計(jì)成員函數(shù)成員函數(shù)l在類中說明原形,可以在在類中說明原形,可以在類外給出函類外給出函數(shù)體實(shí)現(xiàn),并在函數(shù)名前使用類名加數(shù)體實(shí)現(xiàn),并在函數(shù)名前
31、使用類名加以限定。以限定。也可以也可以直接在類中給出函數(shù)直接在類中給出函數(shù)體,形成內(nèi)聯(lián)成員函數(shù)體,形成內(nèi)聯(lián)成員函數(shù)。l允許聲明重載函數(shù)和帶默認(rèn)形參值的允許聲明重載函數(shù)和帶默認(rèn)形參值的函數(shù)函數(shù)類 和 對(duì) 象C+語言程序設(shè)計(jì)帶缺省形參值的函數(shù)帶缺省形參值的函數(shù)lVoid clock:setTime(int NewH=0,int NewM=0,int NewS=0)l l Hour=NewH;l Minute=NewM;l Second=NewS;l C+語言程序設(shè)計(jì)內(nèi)聯(lián)成員函數(shù)內(nèi)聯(lián)成員函數(shù)l為了提高運(yùn)行時(shí)的效率,對(duì)于較簡單為了提高運(yùn)行時(shí)的效率,對(duì)于較簡單的函數(shù)可以聲明為內(nèi)聯(lián)形式。的函數(shù)可以聲明為內(nèi)
32、聯(lián)形式。l內(nèi)聯(lián)函數(shù)體中不要有復(fù)雜結(jié)構(gòu)(如循內(nèi)聯(lián)函數(shù)體中不要有復(fù)雜結(jié)構(gòu)(如循環(huán)語句和環(huán)語句和switch語句)。語句)。l在類中聲明內(nèi)聯(lián)成員函數(shù)的方式:在類中聲明內(nèi)聯(lián)成員函數(shù)的方式: 將函數(shù)體放在類的聲明中-隱式 使用inline關(guān)鍵字-顯式類 和 對(duì) 象C+語言程序設(shè)計(jì)內(nèi)聯(lián)成員函數(shù)舉例內(nèi)聯(lián)成員函數(shù)舉例(隱式隱式)lclass Pointll public:l void Init(int initX,int initY)l l X=initX;l Y=initY;l l int GetX() return X;l int GetY() return Y;l private:l int X,Y;l
33、;類 和 對(duì) 象C+語言程序設(shè)計(jì)內(nèi)聯(lián)成員函數(shù)舉例內(nèi)聯(lián)成員函數(shù)舉例(顯式顯式)lclass Pointll public:l void Init(int initX,int initY);l int GetX(); l int GetY();l private:l int X,Y;l;類 和 對(duì) 象linline void Point: Init(int initX,int initY)ll X=initX;l Y=initY;llinline int Point:GetX() ll return X;llinline int Point:GetY() ll return Y;l25C+語言程序
34、設(shè)計(jì)對(duì)象對(duì)象l類的對(duì)象是該類的某一特定實(shí)體,即類的對(duì)象是該類的某一特定實(shí)體,即類類型的變量。類類型的變量。l聲明形式:聲明形式: 類名類名 對(duì)象名;對(duì)象名;l例:例: Clock myClock;類 和 對(duì) 象C+語言程序設(shè)計(jì)類中成員的訪問方式類中成員的訪問方式l類中成員互訪類中成員互訪 直接使用成員名l類外訪問類外訪問 使用“對(duì)象名.成員名”方式訪問 public 屬性的成員類 和 對(duì) 象C+語言程序設(shè)計(jì)例例 類的應(yīng)用舉例類的應(yīng)用舉例l#includelusing namespace std;lclass Clockll public:l void SetTime(int NewH,int
35、NewM,int NewS);l void ShowTime();l private:l int Hour,Minute,Second;l;lvoid Clock:SetTime(int NewH,int NewM,int NewS)l Hour=NewH;l Minute=NewM;l Second=NewS;lC+語言程序設(shè)計(jì)lvoid Clock:ShowTime()ll coutHour“:”Minute“:”Second;l lvoid main(void)l Clock myClock;l myClock.SetTime(8,30,30);l myClock.ShowTime();
36、l例例 類的應(yīng)用舉例類的應(yīng)用舉例C+語言程序設(shè)計(jì)結(jié)構(gòu)與類結(jié)構(gòu)與類lStruct Savingsl unsigned accountNumber;l float balance;l;lvoid fn()l Savings a;l Savings b;l a.accountNumber=1;l b.accountNumber=2;l;結(jié)構(gòu)與類的區(qū)別:類中成員的缺省存儲(chǔ)屬性為私有的結(jié)構(gòu)體中的缺省存儲(chǔ)屬性為共有的C+語言程序設(shè)計(jì)構(gòu)造函數(shù)構(gòu)造函數(shù)l由于類的封裝性,不能像普通變量一樣初始化由于類的封裝性,不能像普通變量一樣初始化lstruct Savingslunsigned accountNumber;
37、l float balance;l;lSavings A=1,2000.0;lSavings B(2,3000.0);構(gòu)造函數(shù)和析構(gòu)函數(shù)C+語言程序設(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ì)象,或者說將對(duì)象特定的值去構(gòu)造對(duì)象,或者說將對(duì)象初初始化始化為一個(gè)特定的狀態(tài)。為一個(gè)特定的狀態(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)生出如果程序中未聲明,則系統(tǒng)自動(dòng)產(chǎn)生出一個(gè)一個(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)形參值參值的
38、函數(shù)的函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)C+語言程序設(shè)計(jì)構(gòu)造函數(shù)舉例構(gòu)造函數(shù)舉例lclass Clockllpublic:lClock (int NewH, int NewM, int NewS);/構(gòu)造構(gòu)造函數(shù)函數(shù)lvoid SetTime(int NewH, int NewM, int NewS);lvoid ShowTime();lprivate:lint Hour,Minute,Second;l;構(gòu)造函數(shù)和析構(gòu)函數(shù)l構(gòu)造函數(shù)的實(shí)現(xiàn):構(gòu)造函數(shù)的實(shí)現(xiàn):lClock:Clock(int NewH, int NewM, int NewS)llHour= NewH;lMinute= NewM;lSecond
39、= NewS;ll建立對(duì)象時(shí)構(gòu)造函數(shù)的作用:建立對(duì)象時(shí)構(gòu)造函數(shù)的作用:lvoid main()ll Clock c (0,0,0); /隱含調(diào)用構(gòu)造函數(shù),將初始值作為實(shí)隱含調(diào)用構(gòu)造函數(shù),將初始值作為實(shí)參。參。l c.ShowTime();l31C+語言程序設(shè)計(jì)重載構(gòu)造函數(shù):重載構(gòu)造函數(shù):l/ex.hl#include lclass Demo int x,y;l public:l Demo(int a,int b)l x=a; y=b;l cout“Constructor demo(int ,int)be calledn”;l l Demo()l cout“Constructor demo()
40、be calledn”;l void show()l cout“X=”xt“Y=”yendl;l ; C+語言程序設(shè)計(jì)l#include “ex.h”lvoid main()l Demo d1(3,5); /Al d1.Show();l Demo d2; /Bl d2.Show();ll該程序的輸出為:該程序的輸出為:lConstructor Demo(int ,int) be calledlX=3 Y=5lConstructor Demo( ) be calledlX=946 Y=928 (隨機(jī)值隨機(jī)值)C+語言程序設(shè)計(jì)拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)l拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參為本類
41、的拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參為本類的對(duì)象引用。對(duì)象引用。l作用:使用一個(gè)對(duì)象(參數(shù)指定的對(duì)象),去初始化一作用:使用一個(gè)對(duì)象(參數(shù)指定的對(duì)象),去初始化一個(gè)正在被建立的同類型對(duì)象。個(gè)正在被建立的同類型對(duì)象。 class 類名 public : 類名(形參);/構(gòu)造函數(shù) 類名(類名 &對(duì)象名);/拷貝構(gòu)造函數(shù) . ; 類名: 類名(類名 &對(duì)象名)/拷貝構(gòu)造函數(shù)的實(shí)現(xiàn) 函數(shù)體 構(gòu)造函數(shù)和析構(gòu)函數(shù)C+語言程序設(shè)計(jì)例例 拷貝構(gòu)造函數(shù)舉例拷貝構(gòu)造函數(shù)舉例 class Point public: Point(int xx=0,int yy=0); Point( Point &p); int
42、 GetX() return X; int GetY() return Y; private: int X,Y; ;構(gòu)造函數(shù)和析構(gòu)函數(shù)lPoint:Point(int xx,int yy)ll X=xx;l Y=yy;llPoint:Point (Point& p)ll X=p.X;l Y=p.Y;l cout拷貝構(gòu)造函數(shù)被調(diào)用拷貝構(gòu)造函數(shù)被調(diào)用endl;llPoint b(1,1);lPoint a(b);34C+語言程序設(shè)計(jì)拷貝構(gòu)造函數(shù)被調(diào)用的時(shí)機(jī)拷貝構(gòu)造函數(shù)被調(diào)用的時(shí)機(jī)l(1)當(dāng)用類的一個(gè)對(duì)象去初始化該類的)當(dāng)用類的一個(gè)對(duì)象去初始化該類的另一個(gè)對(duì)象時(shí)系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函另一個(gè)對(duì)象時(shí)系統(tǒng)
43、自動(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+語言程序設(shè)計(jì)l(2)若函數(shù)的形參為類對(duì)象,調(diào)用函)若函數(shù)的形參為類對(duì)象,調(diào)用函數(shù)時(shí),實(shí)參賦值給形參,系統(tǒng)自動(dòng)調(diào)數(shù)時(shí),實(shí)參賦值給形參,系統(tǒng)自動(dòng)調(diào)用拷貝構(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ù)
44、 構(gòu)造函數(shù)和析構(gòu)函數(shù)拷貝構(gòu)造函數(shù)被調(diào)用的時(shí)機(jī)拷貝構(gòu)造函數(shù)被調(diào)用的時(shí)機(jī)C+語言程序設(shè)計(jì)l(3)當(dāng)函數(shù)的返回值是類對(duì)象時(shí),系)當(dāng)函數(shù)的返回值是類對(duì)象時(shí),系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù)。例如:統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù)。例如: Point fun2() Point A(1,2); return A; /調(diào)用拷貝構(gòu)造函調(diào)用拷貝構(gòu)造函數(shù)數(shù) void main() Point B; B=fun2(); 構(gòu)造函數(shù)和析構(gòu)函數(shù)拷貝構(gòu)造函數(shù)被調(diào)用的時(shí)機(jī)拷貝構(gòu)造函數(shù)被調(diào)用的時(shí)機(jī)C+語言程序設(shè)計(jì)拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)l如果程序員沒有為類聲明拷貝初始化構(gòu)造函數(shù),則編譯器自如果程序員沒有為類聲明拷貝初始化構(gòu)造函數(shù),則編譯器自己生
45、成一個(gè)拷貝構(gòu)造函數(shù)。己生成一個(gè)拷貝構(gòu)造函數(shù)。l這個(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ù)成員。lPoint(Point &p) Point A(1,2);lX=p.x; Point B(A);l Y=p.y; B.X=A.Xl 如果沒有定義這個(gè)函數(shù)如果沒有定義這個(gè)函數(shù) B.Y=A.Y構(gòu)造函數(shù)和析構(gòu)函數(shù)C+語言程序設(shè)計(jì)析構(gòu)函數(shù)析構(gòu)函數(shù)l完成對(duì)象被刪除前的一些清理工作。完成對(duì)象被刪除前的一些清理工作。l在對(duì)象的生存期結(jié)束的時(shí)刻系統(tǒng)自動(dòng)調(diào)在對(duì)象的生存
46、期結(jié)束的時(shí)刻系統(tǒng)自動(dòng)調(diào)用它,然后再釋放此對(duì)象所屬的空間。用它,然后再釋放此對(duì)象所屬的空間。l如果程序中未聲明析構(gòu)函數(shù),編譯器將如果程序中未聲明析構(gòu)函數(shù),編譯器將自動(dòng)產(chǎn)生一個(gè)默認(rèn)的析構(gòu)函數(shù)。自動(dòng)產(chǎn)生一個(gè)默認(rèn)的析構(gòu)函數(shù)。構(gòu)造函數(shù)和析構(gòu)函數(shù)C+語言程序設(shè)計(jì)構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例構(gòu)造函數(shù)和析構(gòu)函數(shù)舉例l#includelusing namespace std;lclass Pointl l public:l Point(int xx,int yy);l Point();l /.其它函數(shù)原形其它函數(shù)原形l private:l int X,int Y;l;構(gòu)造函數(shù)和析構(gòu)函數(shù)lPoint:Point(int
47、 xx,int yy)l X=xx; Y=yy;llPoint:Point()lll/.其它函數(shù)的實(shí)現(xiàn)略其它函數(shù)的實(shí)現(xiàn)略41C+語言程序設(shè)計(jì)l#include lclass Qll int x,y;l public:l Q(int a=0,int b=0)l cout“調(diào)用了構(gòu)造函數(shù)!調(diào)用了構(gòu)造函數(shù)!”endl;l x=a; y=b;l void P(void)l coutxtyn;l Q()l cout“調(diào)用了析構(gòu)函數(shù)!調(diào)用了析構(gòu)函數(shù)!”n;lvoid main(void)ll Q q(50,100);l q.P();l cout“退出主函數(shù)!退出主函數(shù)!n”;ll輸出:調(diào)用了構(gòu)造函數(shù)!輸出
48、:調(diào)用了構(gòu)造函數(shù)!l 50 100l 退出主函數(shù)!退出主函數(shù)! l 調(diào)用了析構(gòu)函數(shù)!調(diào)用了析構(gòu)函數(shù)!l C+語言程序設(shè)計(jì)類的應(yīng)用舉例類的應(yīng)用舉例l一圓型游泳池如圖所示,現(xiàn)在需在其一圓型游泳池如圖所示,現(xiàn)在需在其周圍建一圓型過道,并在其四周圍上柵欄。周圍建一圓型過道,并在其四周圍上柵欄。柵欄價(jià)格為柵欄價(jià)格為35元元/米,過道造價(jià)為米,過道造價(jià)為20元元/平平方米。過道寬度為方米。過道寬度為3米,游泳池半徑由鍵盤米,游泳池半徑由鍵盤輸入。要求編程計(jì)算并輸出過道和柵欄的輸入。要求編程計(jì)算并輸出過道和柵欄的造價(jià)。造價(jià)。游泳池過道l#include lusing namespace std;lconst
49、 float PI = 3.14159;lconst float FencePrice = 35;lconst float ConcretePrice = 20;l/聲明類聲明類Circle 及其數(shù)據(jù)和方法及其數(shù)據(jù)和方法lclass Circlell private:l float radius;l l public:l Circle(float r); /構(gòu)造函數(shù)構(gòu)造函數(shù)l l float Circumference(); /圓周長圓周長l float Area(); /圓面積圓面積l;43l/ 類的實(shí)現(xiàn)類的實(shí)現(xiàn)l/ 構(gòu)造函數(shù)初始化數(shù)據(jù)成員構(gòu)造函數(shù)初始化數(shù)據(jù)成員radiuslCircle:C
50、ircle(float r)lradius=rl/ 計(jì)算圓的周長計(jì)算圓的周長lfloat Circle:Circumference()ll return 2 * PI * radius;ll l/ 計(jì)算圓的面積計(jì)算圓的面積 lfloat Circle:Area() ll return PI * radius * radius;l44lvoid main ()ll float radius;l float FenceCost, ConcreteCost; l l / 提示用戶輸入半徑提示用戶輸入半徑l coutradius;l / 聲明聲明 Circle 對(duì)象對(duì)象l Circle Pool(ra
51、dius);/自動(dòng)調(diào)用構(gòu)造自動(dòng)調(diào)用構(gòu)造函數(shù)函數(shù)l Circle PoolRim(radius + 3); 45l/ 計(jì)算柵欄造價(jià)并輸出計(jì)算柵欄造價(jià)并輸出l FenceCost = PoolRim.Circumference() * FencePrice;l cout Fencing Cost is ¥ FenceCost endl;l l / 計(jì)算過道造價(jià)并輸出計(jì)算過道造價(jià)并輸出l ConcreteCost = (PoolRim.Area() - Pool.Area()*ConcretePrice;l cout Concrete Cost is ¥ ConcreteCost endl;ll運(yùn)行
52、結(jié)果運(yùn)行結(jié)果lEnter the radius of the pool: 10lFencing Cost is ¥2858.85lConcrete Cost is ¥4335.3946C+語言程序設(shè)計(jì)例:復(fù)數(shù)例:復(fù)數(shù)(類與對(duì)象、內(nèi)聯(lián)成員函數(shù))(類與對(duì)象、內(nèi)聯(lián)成員函數(shù))l#include l#include lClass complexlPrivate:l double real;l double imag;lPublic:l void init(double r,double i)l real=r;imag=I;l double realcomplex() return real;l doub
53、le imagcomplex() return imag;l double abscomplex()l double t;l t=real*real+imag*imag;l return sqrt(t);l l;lvoid main()ll complex a;l a.init(1.1,2.2);l cout“real of complex a=”a.realcomplex()endl;l cout“image of complex a=”a.imagecomplex()endl;l cout“abs of complex a=”a.abscomplex()endl;lC+語言程序設(shè)計(jì)例:復(fù)數(shù)
54、例:復(fù)數(shù) (構(gòu)造函數(shù))(構(gòu)造函數(shù))l#include l#include lClass complexlPrivate:l double real;l double imag;lPublic:l complex(double r,double i)l real=r;imag=I;l double realcomplex() return real;l double imagcomplex() return imag;l double abscomplex()l double t;l t=real*real+imag*imag;l return sqrt(t);l l;lvoid main()l
55、l complex a(1.1,2.2);l cout“real of complex a=”a.realcomplex()endl;l cout“image of complex a=”a.imagecomplex()endl;l cout“abs of complex a=”a.abscomplex()endl;lC+語言程序設(shè)計(jì)例:復(fù)數(shù)例:復(fù)數(shù) (帶缺省參數(shù)構(gòu)造函數(shù))(帶缺省參數(shù)構(gòu)造函數(shù))l#include l#include lClass complexlPrivate:l double real;l double imag;lPublic:l complex(double r=0.0
56、,double i=0.0)l real=r;imag=I;l double realcomplex() return real;l double imagcomplex() return imag;l double abscomplex()l double t;l t=real*real+imag*imag;l return sqrt(t);l l;lvoid main()ll complex a(1.1,2.2);l complex b;l complex c(1.0);l cout“real of complex a=”a.realcomplex()endl;l cout“image o
57、f complex a=”a.imagecomplex()endl;l cout“abs of complex a=”a.abscomplex()endl;lC+語言程序設(shè)計(jì)例:復(fù)數(shù)例:復(fù)數(shù) (構(gòu)造函數(shù)重載)(構(gòu)造函數(shù)重載)l#include l#include lClass complexlPrivate:l double real;l double imag;lPublic:l complex(double r,double i)l real=r;imag=I;l complex() real=0.0; imag=0.0;l double realcomplex() return real
58、;l double imagcomplex() return imag;l double abscomplex()l double t;l t=real*real+imag*imag;l return sqrt(t);l l;lvoid main()ll complex a(1.1,2.2);l cout“real of complex a=”a.realcomplex()endl;l cout“image of complex a=”a.imagecomplex()endl;l cout“abs of complex a=”a.abscomplex()endl;l complex b;l c
59、out“real of complex a=”b.realcomplex()endl;l cout“image of complex a=”b.imagecomplex()endl;l cout“abs of complex a=”b.abscomplex()endl;ll參數(shù)能不能給一個(gè)值參數(shù)能不能給一個(gè)值l 如:如:complex c(1.1);行嗎?行嗎?C+語言程序設(shè)計(jì)例:復(fù)數(shù)例:復(fù)數(shù) (析構(gòu)函數(shù))(析構(gòu)函數(shù))l#include l#include lClass complexlPrivate:l double real;l double imag;lPublic:l complex(
60、double r=0.0,double i=0.0)l real=r;imag=I;l complex() cout“destructing.n”;l double realcomplex() return real;l double imagcomplex() return imag;l double abscomplex()l double t;l t=real*real+imag*imag;l return sqrt(t);l l;lvoid main()ll complex a(1.1,2.2);l cout“real of complex a=”a.realcomplex()endl
61、;l cout“image of complex a=”a.imagecomplex()endl;l cout“abs of complex a=”a.abscomplex()endl;l complex b;l cout“real of complex a=”b.realcomplex()endl;l cout“image of complex a=”b.imagecomplex()endl;l cout“abs of complex a=”b.abscomplex()endl;lC+語言程序設(shè)計(jì)例:復(fù)數(shù)例:復(fù)數(shù) (拷貝構(gòu)造函數(shù)(拷貝構(gòu)造函數(shù)應(yīng)用應(yīng)用A)l#include l#include
62、 lClass complexlPrivate:l double real;l double imag;lPublic:l complex(double r=0.0,double i=0.0)l real=r;imag=I;l complex(complex &c)l real=c.real; imag=c.imag;l complex() cout“destructing.n”;l double realcomplex() return real;l double imagcomplex() return imag;l double abscomplex()l double t;l t=re
63、al*real+imag*imag;l return sqrt(t);l l;lvoid main()ll complex a(1.1,2.2);l cout“real of complex a=”a.realcomplex()endl;l cout“image of complex a=”a.imagecomplex()endl;l cout“abs of complex a=”a.abscomplex()endl;l complex b(a);l cout“real of complex a=”b.realcomplex()endl;l cout“image of complex a=”b
64、.imagecomplex()endl;l cout“abs of complex a=”b.abscomplex()endl;lC+語言程序設(shè)計(jì)例:復(fù)數(shù)例:復(fù)數(shù) (拷貝構(gòu)造函數(shù)(拷貝構(gòu)造函數(shù)應(yīng)用應(yīng)用B)l#include l#include lClass complexlPrivate:l double real;l double imag;lPublic:l complex(double r=0.0,double i=0.0)l real=r;imag=I;l complex(complex &c)l real=c.real; imag=c.imag;l complex() cout“de
65、structing.n”;l double realcomplex() return real;l double imagcomplex() return imag;l double abscomplex()l double t;l t=real*real+imag*imag;l return sqrt(t);l l;lvoid display(complex p)ll cout“real of complex p=”p.realcomplex()endl;l cout“image of complex p=”p.imagecomplex()endl;l cout“abs of complex
66、 p=”p.abscomplex()endl;llvoid main()ll complex a(1.1,2.2);l display(a);l lC+語言程序設(shè)計(jì)例:復(fù)數(shù)例:復(fù)數(shù) (拷貝構(gòu)造函數(shù)(拷貝構(gòu)造函數(shù)應(yīng)用應(yīng)用C)l#include l#include lClass complexlPrivate:l double real;l double imag;lPublic:l complex(double r=0.0,double i=0.0)l real=r;imag=I;l complex(complex &c)l real=c.real; imag=c.imag;l complex() cout“destructing.n”;l double realcomplex() return real;l double imagcomplex() return imag;l double abscomplex()l double t;l t=real*real+imag*imag;l return sqrt(t);l l;lcomplex fun()ll complex a(1.1,
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 市教育局冬季運(yùn)動(dòng)會(huì)安全工作預(yù)案
- 2024年秋季《思想道德與法治》大作業(yè)及答案3套試卷
- 2024年教師年度考核表個(gè)人工作總結(jié)(可編輯)
- 2024年xx村兩委涉案資金退還保證書
- 2024年憲法宣傳周活動(dòng)總結(jié)+在機(jī)關(guān)“弘揚(yáng)憲法精神推動(dòng)發(fā)改工作高質(zhì)量發(fā)展”專題宣講報(bào)告會(huì)上的講話
- 2024年XX村合作社年報(bào)總結(jié)
- 2024-2025年秋季第一學(xué)期初中歷史上冊(cè)教研組工作總結(jié)
- 2024年小學(xué)高級(jí)教師年終工作總結(jié)匯報(bào)
- 2024-2025年秋季第一學(xué)期初中物理上冊(cè)教研組工作總結(jié)
- 2024年xx鎮(zhèn)交通年度總結(jié)
- 2024-2025年秋季第一學(xué)期小學(xué)語文教師工作總結(jié)
- 2024年XX村陳規(guī)陋習(xí)整治報(bào)告
- 2025年學(xué)校元旦迎新盛典活動(dòng)策劃方案
- 2024年學(xué)校周邊安全隱患自查報(bào)告
- 2024年XX鎮(zhèn)農(nóng)村規(guī)劃管控述職報(bào)告