版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
面向?qū)ο蟮脑O(shè)計(jì)方法面向?qū)ο蟮腃++程式設(shè)計(jì)基礎(chǔ)21.1面向?qū)ο蟮乃枷胍?、面向?qū)ο蟮暮x
“面向?qū)ο蟆笔擒涹w設(shè)計(jì)的一種新思想,旨在使人們分析、設(shè)計(jì)系統(tǒng)的方法更接近認(rèn)識(shí)系統(tǒng)的方法;
面向?qū)ο蠓椒ň褪菫殡娔X軟體的創(chuàng)建提出了一種模型化世界的抽象方法;軟體工程專(zhuān)家給出了面向?qū)ο蟮拿枋觯?/p>
面向?qū)ο?/p>
=對(duì)象
+分類(lèi)
+繼承
+消息通信
即面向?qū)ο缶褪鞘褂脤?duì)象、類(lèi)、繼承等機(jī)制,對(duì)象之間僅能通過(guò)消息的傳遞實(shí)現(xiàn)通信。3
二、面向?qū)ο蟮某淌皆O(shè)計(jì)
面向過(guò)程的程式設(shè)計(jì)
基本思想:模組分解和功能抽象,複雜的程式必然包含一組數(shù)據(jù)以及用來(lái)處理這些數(shù)據(jù)的函數(shù),但函數(shù)是獨(dú)立的。程式自身不清楚哪些函數(shù)處理了這些數(shù)據(jù),即數(shù)據(jù)與處理這些數(shù)據(jù)的操作相分離。缺點(diǎn)是:1、程式修改麻煩:例如程式修改了一個(gè)變數(shù)名,則要修改所有使用該變數(shù)的語(yǔ)句;2、可靠性差,一致性難以保證:數(shù)據(jù)沒(méi)有封裝,數(shù)據(jù)可能被分散於程式各處的函數(shù)改變,數(shù)據(jù)從整體上很難保證可靠和一致。
面向?qū)ο蟮乃枷?
面向?qū)ο蟮某淌皆O(shè)計(jì)
基本思想:將客觀世界抽象為多個(gè)對(duì)象,將要設(shè)計(jì)的系統(tǒng)表示為對(duì)象的集合;對(duì)同類(lèi)對(duì)象抽象出其共性,形成類(lèi);類(lèi)是封裝了“數(shù)據(jù)和處理這些數(shù)據(jù)的操作”的一個(gè)整體,對(duì)象是類(lèi)的實(shí)例;類(lèi)通過(guò)外部介面與外界聯(lián)繫,對(duì)象之間通過(guò)消息進(jìn)行通訊。
類(lèi)和對(duì)象是實(shí)現(xiàn)數(shù)據(jù)封裝的具體機(jī)制,通過(guò)這種機(jī)制,把數(shù)據(jù)以及與其相關(guān)的操作進(jìn)行封裝(或捆綁),外界不能隨意修改和任意使用這些量,只有滿足一定的訪問(wèn)許可權(quán)才能進(jìn)行訪問(wèn)操作,增強(qiáng)了數(shù)據(jù)的安全性(解決了數(shù)據(jù)與操作相分離)。二、面向?qū)ο蟮某淌皆O(shè)計(jì)面向?qū)ο蟮乃枷?面向?qū)ο蟮幕靖拍?/p>
——對(duì)象一般意義上的對(duì)象:是現(xiàn)實(shí)世界中一個(gè)實(shí)際存在的事物??梢允怯行蔚模ū热缫惠v汽車(chē)),也可以是無(wú)形的(比如一項(xiàng)計(jì)畫(huà))。是構(gòu)成世界的一個(gè)獨(dú)立單位,具有:靜態(tài)特徵:可以用某種數(shù)據(jù)來(lái)描述動(dòng)態(tài)特徵:對(duì)象所表現(xiàn)的行為或具有的功能6面向?qū)ο蟮幕靖拍?/p>
——對(duì)象面向?qū)ο蠓椒ㄖ械膶?duì)象:是系統(tǒng)中用來(lái)描述客觀事物的一個(gè)實(shí)體,它是用來(lái)構(gòu)成系統(tǒng)的一個(gè)基本單位。對(duì)象由一組屬性和一組行為構(gòu)成。屬性:用來(lái)描述對(duì)象靜態(tài)特徵的資料項(xiàng)目。行為:用來(lái)描述對(duì)象動(dòng)態(tài)特徵的操作序列。7一、現(xiàn)實(shí)世界中的對(duì)象對(duì)象是現(xiàn)實(shí)世界的一個(gè)實(shí)體,它具有如下特徵:1、有一個(gè)名字以區(qū)別於其他對(duì)象;2、有一個(gè)狀態(tài)用來(lái)描述它的某些特徵;3、有一組操作,每一個(gè)操作決定了對(duì)象的一種功能或行為;對(duì)象的操作分為兩類(lèi):1)自身所承受的操作。2)是它施加於其他對(duì)象的操作。(例如人可以接受知識(shí),人可以駕駛汽車(chē))面向?qū)ο蟮幕靖拍?二、電腦世界中的對(duì)象在電腦世界中,可以把對(duì)象看成是記憶體中一個(gè)可標(biāo)識(shí)的區(qū)域,它能保存固定或可變數(shù)目的數(shù)值(或數(shù)值的集合),這些數(shù)值代表對(duì)象的屬性數(shù)據(jù)和對(duì)象的成員函數(shù)代碼。從軟體形式上看,對(duì)象是系統(tǒng)程式員、應(yīng)用程式員或用戶所定義的抽象數(shù)據(jù)類(lèi)型的變數(shù)。面向?qū)ο蟮幕靖拍?對(duì)象的狀態(tài)指對(duì)象自身所具有的那些特徵(屬性);這些狀態(tài)的存在,使對(duì)象能對(duì)自身以及對(duì)外界對(duì)象施加操作;對(duì)象的狀態(tài)並不是完全用來(lái)直接為外界服務(wù)的,但它們本身是能夠?yàn)橥饨绶?wù)的基礎(chǔ)。
對(duì)象的狀態(tài)面向?qū)ο蟮幕靖拍?0模組獨(dú)立性對(duì)象是獨(dú)立存在的模組,封裝了數(shù)據(jù)和操作。外部使用時(shí)只需瞭解它具有哪些功能。模組間的依賴(lài)性極小或幾乎沒(méi)有。動(dòng)態(tài)連接性對(duì)象之間有聯(lián)繫,通過(guò)消息啟動(dòng)機(jī)制,把一個(gè)個(gè)對(duì)象動(dòng)態(tài)地連接在一起。易維護(hù)性對(duì)象修改、功能完善及實(shí)現(xiàn)的細(xì)節(jié)都被局限於對(duì)象的內(nèi)部,不會(huì)涉及到外部。
對(duì)象的特性面向?qū)ο蟮幕靖拍?1面向?qū)ο蟮幕靖拍?/p>
——類(lèi)分類(lèi)——人類(lèi)通常的思維方法分類(lèi)所依據(jù)的原則——抽象忽略事物的非本質(zhì)特徵,只注意那些與當(dāng)前目標(biāo)有關(guān)的本質(zhì)特徵,從而找出事物的共性,把具有共同性質(zhì)的事物劃分為一類(lèi),得出一個(gè)抽象的概念。例如,石頭、樹(shù)木、汽車(chē)、房屋等都是人們?cè)陂L(zhǎng)期的生產(chǎn)和生活實(shí)踐中抽象出的概念。12面向?qū)ο蟮幕靖拍?/p>
——類(lèi)面向?qū)ο蠓椒ㄖ械?類(lèi)"具有相同屬性和服務(wù)的一組對(duì)象的集合為屬於該類(lèi)的全部對(duì)象提供了抽象的描述,包括屬性和行為兩個(gè)主要部分。類(lèi)與對(duì)象的關(guān)係:
猶如模具與鑄件之間的關(guān)係,一個(gè)屬於某類(lèi)的對(duì)象稱(chēng)為該類(lèi)的一個(gè)實(shí)例。面向?qū)ο蟮幕靖拍?3
類(lèi)與對(duì)象的關(guān)係類(lèi)(範(fàn)本)與對(duì)象(實(shí)例)的關(guān)係是抽象與具體的關(guān)係;同一類(lèi)的不同實(shí)例之間,必有如下特點(diǎn):相同的操作集合;相同的屬性集合;不同的對(duì)象名。面向?qū)ο蟮幕靖拍?4
類(lèi)的確定與描述類(lèi)的確定採(cǎi)用歸納法,基於對(duì)所遇到對(duì)象的總體分析中,歸納出其共同的特徵來(lái)定義類(lèi);類(lèi)是數(shù)據(jù)和對(duì)這些數(shù)據(jù)進(jìn)行操作的函數(shù)的封裝體,它是一種同時(shí)含有數(shù)據(jù)和函數(shù)的構(gòu)造數(shù)據(jù)類(lèi)型(結(jié)構(gòu));類(lèi)的描述同時(shí)包括數(shù)據(jù)和函數(shù)定義,類(lèi)中的數(shù)據(jù)和函數(shù)稱(chēng)為類(lèi)的成員(數(shù)據(jù)成員、成員函數(shù));數(shù)據(jù)成員是類(lèi)的那些成員函數(shù)需要用到的變數(shù),成員函數(shù)是對(duì)數(shù)據(jù)成員進(jìn)行處理的程式段。面向?qū)ο蟮幕靖拍?5面向?qū)ο蟮幕咎匦?/p>
——封裝性把對(duì)象的屬性和服務(wù)結(jié)合成一個(gè)獨(dú)立的系統(tǒng)單元。盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié)。對(duì)外形成一個(gè)邊界(或者說(shuō)一道屏障),只保留有限的對(duì)外介面使之與外部發(fā)生聯(lián)繫。16
什麼是封裝性?在面向?qū)ο笾校庋b是將一段程式代碼“包裝”起來(lái),只需知道這段“代碼”完成的功能,而不必關(guān)心功能的實(shí)現(xiàn)細(xì)節(jié);“代碼”包括一組數(shù)據(jù)和與這組數(shù)據(jù)相關(guān)的操作;封裝是指將一組數(shù)據(jù)(對(duì)象屬性)和與這組數(shù)據(jù)相關(guān)的操作(對(duì)象服務(wù))集合在一起,形成一個(gè)不可分割、獨(dú)立的實(shí)體—對(duì)象,用戶不必知道對(duì)象行為的實(shí)現(xiàn)細(xì)節(jié),只需根據(jù)對(duì)象提供的外部介面訪問(wèn)對(duì)象的服務(wù)。面向?qū)ο蟮幕咎匦?7
1.有一個(gè)清楚的邊界,對(duì)象的所有私有數(shù)據(jù)、內(nèi)部程式(成員函數(shù))細(xì)節(jié)都被限定在這個(gè)邊界內(nèi);
封裝應(yīng)該具有以下幾個(gè)條件:2.至少有一個(gè)介面,這個(gè)介面描述了該與其它對(duì)象之間的相互作用、請(qǐng)求和回應(yīng),它就是消息;3.對(duì)象行為的內(nèi)部實(shí)現(xiàn)代碼受封裝殼的保護(hù),其他對(duì)象不能直接修改該對(duì)象所擁有的數(shù)據(jù)和相關(guān)程式代碼。面向?qū)ο蟮幕咎匦?8
面向?qū)ο笙到y(tǒng)的封裝性
面向?qū)ο笙到y(tǒng)的封裝性是一種資訊隱藏技術(shù)。它的目的在於將對(duì)象的使用者與設(shè)計(jì)者分開(kāi),使用者不必知道對(duì)象行為實(shí)現(xiàn)的細(xì)節(jié);
封裝機(jī)制提供了一種共用代碼的手段。通過(guò)封裝,把一段代碼定義在一個(gè)類(lèi)中,並且在另一個(gè)類(lèi)所定義的操作中,可以通過(guò)創(chuàng)建該類(lèi)的實(shí)例,並向它發(fā)送消息而啟動(dòng)這段程式代碼,達(dá)到共用代碼的目的。面向?qū)ο蟮幕咎匦?9面向?qū)ο蟮幕咎匦?/p>
——繼承性繼承對(duì)於軟體複用有著重要意義,是面向?qū)ο蠹夹g(shù)能夠提高軟體開(kāi)發(fā)效率的重要原因之一。定義:特殊類(lèi)的對(duì)象擁有其一般類(lèi)的全部屬性與服務(wù),稱(chēng)作特殊類(lèi)對(duì)一般類(lèi)的繼承。例如:將輪船作為一個(gè)一般類(lèi),客輪便是一個(gè)特殊類(lèi)。201、繼承表達(dá)了對(duì)象之間的相交關(guān)係,即某類(lèi)對(duì)象可以繼承另一類(lèi)對(duì)象的特徵和能力。具有繼承關(guān)係的類(lèi)有如下特徵:☆類(lèi)間具有共用特徵(包括數(shù)據(jù)和程式代碼共用);☆類(lèi)間具有細(xì)微的差別或新增部分(包括非共用的程式代碼和數(shù)據(jù));☆類(lèi)間具有層次結(jié)構(gòu)(包含關(guān)係)。2、繼承的作用:在定義子類(lèi)時(shí)不必重複在父類(lèi)中定義的數(shù)據(jù)和操作,可減少代碼冗餘,提高軟體複用性;增強(qiáng)一致性,減少模組之間的介面和介面,易於程式維護(hù)。
繼承的含義面向?qū)ο蟮幕咎匦?1
繼承的分類(lèi)
從繼承源上可劃分為單繼承和多繼承;
單繼承:一個(gè)類(lèi)只允許有一個(gè)父類(lèi)時(shí),這種類(lèi)的繼承為單繼承;多繼承:一個(gè)類(lèi)同時(shí)允許有2個(gè)以上的父類(lèi)時(shí),這種類(lèi)的繼承為多繼承。面向?qū)ο蟮幕咎匦?2
單繼承與多繼承ABCDE單繼承多繼承FEDCBA23
面向?qū)ο笙到y(tǒng)的繼承性能清晰體現(xiàn)相關(guān)類(lèi)之間的層次結(jié)構(gòu)關(guān)係;能減小代碼和數(shù)據(jù)的冗餘度,增加程式重用性;能通過(guò)增強(qiáng)一致性來(lái)減少模組間的介面和介面,增加程式的易維護(hù)性;繼承是能自動(dòng)傳播代碼的有力工具;繼承還是在一些比較一般的類(lèi)的基礎(chǔ)上進(jìn)行構(gòu)造、建立和擴(kuò)充新類(lèi)的最有效的手段,利於軟體設(shè)計(jì)的逐步細(xì)化,即先進(jìn)行公共特性的設(shè)計(jì),再自頂向下開(kāi)發(fā)子類(lèi),逐步加入新內(nèi)容。24面向?qū)ο蟮幕咎匦?/p>
——多態(tài)性多態(tài)是指在一般類(lèi)中定義的屬性或行為,被特殊類(lèi)繼承之後,可以具有不同的數(shù)據(jù)類(lèi)型或表現(xiàn)出不同的行為。這使得同一個(gè)屬性或行為在一般類(lèi)及其各個(gè)特殊類(lèi)中具有不同的語(yǔ)義。例如:數(shù)的加法->實(shí)數(shù)的加法
->複數(shù)的加法25
多態(tài)性的含義多態(tài)性(Polymorphism)是指同一名字(函數(shù)、運(yùn)算符)在不同的場(chǎng)合具有不同的語(yǔ)義,或者同一介面有多種實(shí)現(xiàn);C++中的多態(tài)性是指不同的對(duì)象收到相同的消息時(shí)產(chǎn)生不同的動(dòng)作或行為;C++支持兩種多態(tài)性:
1、編譯時(shí)的多態(tài)性:通過(guò)函數(shù)重載來(lái)實(shí)現(xiàn)。
2、運(yùn)行時(shí)的多態(tài)性:通過(guò)虛函數(shù)來(lái)實(shí)現(xiàn)。面向?qū)ο蟮幕咎匦?6
重載(Overloading)C++允許為已有的函數(shù)和運(yùn)算符重新賦予新的含義,即具有相同名字的函數(shù)和運(yùn)算符在不同的場(chǎng)合可以表現(xiàn)為不同的行為;重載的含義是指通過(guò)為函數(shù)和運(yùn)算符創(chuàng)建附加定義而使它們的名字重載,即相同名字的函數(shù)或運(yùn)算符在不同的場(chǎng)合可以表現(xiàn)出不同的功能;函數(shù)重載:同一個(gè)作用域內(nèi)若干個(gè)參數(shù)特徵不同的函數(shù)可以使用相同的名字,定義重載函數(shù)時(shí),函數(shù)名相同,函數(shù)參數(shù)類(lèi)型、個(gè)數(shù)、順序必須不同;運(yùn)算符重載:同一個(gè)運(yùn)算符可以施加在兩個(gè)任意類(lèi)型的運(yùn)算元(例如結(jié)構(gòu)變數(shù)或?qū)ο螅┥稀?7
虛函數(shù)虛函數(shù)是指在類(lèi)等級(jí)的不同層次中說(shuō)明的名字、參數(shù)特徵和返回值類(lèi)型都相同但實(shí)現(xiàn)演算法不同的函數(shù);虛函數(shù)使用戶在一個(gè)類(lèi)等級(jí)中可以使用相同函數(shù)的多個(gè)版本,每個(gè)版本均屬於類(lèi)等級(jí)中不同的類(lèi),究竟使用的是哪一個(gè)特定的版本需要在運(yùn)行中決定;虛函數(shù)的各個(gè)版本中,其返回值、函數(shù)參數(shù)的個(gè)數(shù)和類(lèi)型必須一致。28電腦程式電腦的工作是用程式來(lái)控制的程式是指令的集合。指令是電腦可以識(shí)別的命令。電腦語(yǔ)言的發(fā)展29機(jī)器語(yǔ)言與組合語(yǔ)言由電腦硬體系統(tǒng)可以識(shí)別的二進(jìn)位指令組成的語(yǔ)言稱(chēng)為機(jī)器語(yǔ)言。電腦發(fā)展的初期,軟體工程師們只能用機(jī)器語(yǔ)言來(lái)編寫(xiě)程式。這一階段,在人類(lèi)的自然語(yǔ)言和電腦編程語(yǔ)言之間存在著巨大的鴻溝。組合語(yǔ)言將機(jī)器指令映射為一些可以被人讀懂的助記符,如ADD、SUB等。此時(shí)編程語(yǔ)言與人類(lèi)自然語(yǔ)言間的鴻溝略有縮小,但仍與人類(lèi)的思維相差甚遠(yuǎn)。因?yàn)樗某橄髮哟翁停淌絾T需要考慮大量的機(jī)器細(xì)節(jié)。電腦語(yǔ)言的發(fā)展30高級(jí)語(yǔ)言高級(jí)語(yǔ)言遮罩了機(jī)器的細(xì)節(jié),提高了語(yǔ)言的抽象層次,程式中可以採(cǎi)用具有一定涵義的數(shù)據(jù)命名和容易理解的執(zhí)行語(yǔ)句。這使得在書(shū)寫(xiě)程式時(shí)可以聯(lián)繫到程式所描述的具體事物。電腦語(yǔ)言的發(fā)展31面向?qū)ο蟮恼Z(yǔ)言出發(fā)點(diǎn):更直接地描述客觀世界中存在的事物(對(duì)象)以及它們之間的關(guān)係。特點(diǎn):是高級(jí)語(yǔ)言。將客觀事物看作具有屬性和行為的對(duì)象。通過(guò)抽象找出同一類(lèi)對(duì)象的共同屬性和行為,形成類(lèi)。通過(guò)類(lèi)的繼承與多態(tài)實(shí)現(xiàn)代碼重用。電腦語(yǔ)言的發(fā)展32面向?qū)ο蟮恼Z(yǔ)言優(yōu)點(diǎn):使程式能夠比較直接地反問(wèn)題域的本來(lái)面目,軟體開(kāi)發(fā)人員能夠利用人類(lèi)認(rèn)識(shí)事物所採(cǎi)用的一般思維方法來(lái)進(jìn)行軟體開(kāi)發(fā)。電腦語(yǔ)言的發(fā)展33
LISP語(yǔ)言:以表處理為特色,是一種人工智慧語(yǔ)言。
Simula67語(yǔ)言:引入了幾個(gè)面向?qū)ο蟪淌皆O(shè)計(jì)語(yǔ)言中的重要概念和特性,即數(shù)據(jù)抽象、類(lèi)機(jī)構(gòu)和繼承機(jī)制。
SmallTalk語(yǔ)言:源於Simula語(yǔ)言,體現(xiàn)了純粹的面向?qū)ο蟪淌皆O(shè)計(jì)思想,是真正的面向?qū)ο笳Z(yǔ)言。
C++語(yǔ)言:1980年AT&T設(shè)計(jì)了混合型的面向?qū)ο蟪淌皆O(shè)計(jì)語(yǔ)言C++,在C的基礎(chǔ)上擴(kuò)展了類(lèi)、對(duì)象等機(jī)制,並相容C語(yǔ)言,應(yīng)用最為廣泛。面向?qū)ο蟮恼Z(yǔ)言電腦語(yǔ)言的發(fā)展34程式設(shè)計(jì)方法的發(fā)展歷程
——面向過(guò)程的程式設(shè)計(jì)方法程式的目的:用於數(shù)學(xué)計(jì)算主要工作:設(shè)計(jì)求解問(wèn)題的過(guò)程缺點(diǎn):對(duì)於龐大、複雜的程式難以開(kāi)發(fā)和維護(hù)35程式設(shè)計(jì)方法的發(fā)展歷程
——面向過(guò)程的結(jié)構(gòu)化程式設(shè)計(jì)方法設(shè)計(jì)思路自頂向下、逐步求精。採(cǎi)用模組分解與功能抽象,自頂向下、分而治之。程式結(jié)構(gòu):按功能劃分為若干個(gè)基本模組,形成一個(gè)樹(shù)狀結(jié)構(gòu)。各模組間的關(guān)係盡可能簡(jiǎn)單,功能上相對(duì)獨(dú)立;每一模組內(nèi)部均是由順序、選擇和迴圈三種基本結(jié)構(gòu)組成。其模組化實(shí)現(xiàn)的具體方法是使用副程式。36程式設(shè)計(jì)方法的發(fā)展歷程
——面向過(guò)程的結(jié)構(gòu)化程式設(shè)計(jì)方法優(yōu)點(diǎn):有效地將一個(gè)較複雜的程式系統(tǒng)設(shè)計(jì)任務(wù)分解成許多易於控制和處理的子任務(wù),便於開(kāi)發(fā)和維護(hù)。面向?qū)ο蟮姆椒?7程式設(shè)計(jì)方法的發(fā)展歷程
——面向過(guò)程的結(jié)構(gòu)化程式設(shè)計(jì)方法缺點(diǎn):可重用性差、數(shù)據(jù)安全性差、難以開(kāi)發(fā)大型軟體和圖形介面的應(yīng)用軟體把數(shù)據(jù)和處理數(shù)據(jù)的過(guò)程分離為相互獨(dú)立的實(shí)體。當(dāng)數(shù)據(jù)結(jié)構(gòu)改變時(shí),所有相關(guān)的處理過(guò)程都要進(jìn)行相應(yīng)的修改。每一種相對(duì)於老問(wèn)題的新方法都要帶來(lái)額外的開(kāi)銷(xiāo)。圖形用戶介面的應(yīng)用程式,很難用過(guò)程來(lái)描述和實(shí)現(xiàn),開(kāi)發(fā)和維護(hù)也都很困難。38程式設(shè)計(jì)方法的發(fā)展歷程
——面向?qū)ο蟮姆椒▽?shù)據(jù)及對(duì)數(shù)據(jù)的操作方法封裝在一起,作為一個(gè)相互依存、不可分離的整體——對(duì)象。對(duì)同類(lèi)型對(duì)象抽象出其共性,形成類(lèi)。類(lèi)通過(guò)一個(gè)簡(jiǎn)單的外部介面,與外界發(fā)生關(guān)係。對(duì)象與對(duì)象之間通過(guò)消息進(jìn)行通訊。39程式設(shè)計(jì)方法的發(fā)展歷程
——面向?qū)ο蟮姆椒▋?yōu)點(diǎn):程式模組間的關(guān)係更為簡(jiǎn)單,程式模組的獨(dú)立性、數(shù)據(jù)的安全性就有了良好的保障。通過(guò)繼承與多態(tài)性,可以大大提高程式的可重用性,使得軟體的開(kāi)發(fā)和維護(hù)都更為方便。40面向?qū)ο蟮能涹w工程面向?qū)ο蟮能涹w工程是面向?qū)ο蠓椒ㄔ谲涹w工程領(lǐng)域的全面應(yīng)用。它包括:面向?qū)ο蟮姆治觯∣OA)面向?qū)ο蟮脑O(shè)計(jì)(OOD)面向?qū)ο蟮木幊蹋∣OP)面向?qū)ο蟮臏y(cè)試(OOT)面向?qū)ο蟮能涹w維護(hù)(OOSM)面向?qū)ο蟮能涹w開(kāi)發(fā)41系統(tǒng)分析系統(tǒng)分析階段應(yīng)該扼要精確地抽象出系統(tǒng)必須做什麼,但是不關(guān)心如何去實(shí)現(xiàn)。面向?qū)ο蟮南到y(tǒng)分析,直接用問(wèn)題域中客觀存在的事物建立模型中的對(duì)象,對(duì)單個(gè)事物及事物之間的關(guān)係,都保留他們的原貌,不做轉(zhuǎn)換,也不打破原有界限而重新組合,因此能夠很好地映射客觀事物。面向?qū)ο蟮能涹w開(kāi)發(fā)42設(shè)計(jì)針對(duì)系統(tǒng)的一個(gè)具體實(shí)現(xiàn)運(yùn)用面向?qū)ο蟮姆椒?。其中包括兩方面的工作:把OOA模型直接搬到OOD,作為OOD的一部分針對(duì)具體實(shí)現(xiàn)中的人機(jī)介面、數(shù)據(jù)存儲(chǔ)、任務(wù)管理等因素補(bǔ)充一些與實(shí)現(xiàn)有關(guān)的部分。面向?qū)ο蟮能涹w開(kāi)發(fā)43編程O(píng)OP工作就是用一種面向?qū)ο蟮木幊陶Z(yǔ)言把OOD模型中的每個(gè)成份書(shū)寫(xiě)出來(lái),是面向?qū)ο蟮能涹w開(kāi)發(fā)最終落實(shí)的重要階段。面向?qū)ο蟮能涹w開(kāi)發(fā)44測(cè)試測(cè)試的任務(wù)是發(fā)現(xiàn)軟體中的錯(cuò)誤。在面向?qū)ο蟮能涹w測(cè)試中繼續(xù)運(yùn)用面向?qū)ο蟮母拍钆c原則來(lái)組織測(cè)試,以對(duì)象的類(lèi)作為基本測(cè)試單位,可以更準(zhǔn)確的發(fā)現(xiàn)程式錯(cuò)誤並提高測(cè)試效率。面向?qū)ο蟮能涹w開(kāi)發(fā)45維護(hù)將軟體交付使用後,工作並沒(méi)有完結(jié),還要根據(jù)軟體的運(yùn)行情況和用戶的需求,不斷改進(jìn)系統(tǒng)。使用面向?qū)ο蟮姆椒ㄩ_(kāi)發(fā)的軟體,其程式與問(wèn)題域是一致的,因此,在維護(hù)階段運(yùn)用面向?qū)ο蟮姆椒梢源蟠筇岣哕涹w維護(hù)的效率。面向?qū)ο蟮能涹w開(kāi)發(fā)46C++語(yǔ)言的產(chǎn)生C++是從C語(yǔ)言發(fā)展演變而來(lái)的,首先是一個(gè)更好的C引入了類(lèi)的機(jī)制,最初的C++被稱(chēng)為“帶類(lèi)的C”1983年正式取名為C++從1989年開(kāi)始C++語(yǔ)言的標(biāo)準(zhǔn)化工作於1994年制定了ANSIC++標(biāo)準(zhǔn)草案於1998年11月被國(guó)際標(biāo)準(zhǔn)化組織(ISO)批準(zhǔn)為國(guó)際標(biāo)準(zhǔn),成為目前的C++C++的初步知識(shí)47C++的特點(diǎn)全面相容C它保持了C的簡(jiǎn)潔、高效和接近組合語(yǔ)言等特點(diǎn)對(duì)C的類(lèi)型系統(tǒng)進(jìn)行了改革和擴(kuò)充C++也支持面向過(guò)程的程式設(shè)計(jì),不是一個(gè)純正的面向?qū)ο蟮恼Z(yǔ)言支持面向?qū)ο蟮姆椒–++的初步知識(shí)48從C到C++最簡(jiǎn)單的C++程式C++程式的構(gòu)成和書(shū)寫(xiě)格式C++程式的編寫(xiě)和實(shí)現(xiàn)C++(Cplusplus)是C語(yǔ)言的超集,完全相容C語(yǔ)言,但在概念上不同於C,應(yīng)按C++自己的方式來(lái)使用它,掌握C++的思維方式、程式設(shè)計(jì)方法和編程習(xí)慣。那麼,C++對(duì)C做了哪些修改和增強(qiáng)?C++的初步知識(shí)49函數(shù)原形說(shuō)明變數(shù)的說(shuō)明輸入輸出const說(shuō)明符void類(lèi)型從C到C++C++的初步知識(shí)50
函數(shù)原形說(shuō)明C++要求為函數(shù)提供完全的原型,包括所有參數(shù)的類(lèi)型和返回值類(lèi)型,目的在於:編譯系統(tǒng)可以對(duì)函數(shù)的定義和使用之間的一致性進(jìn)行嚴(yán)格的檢查,保證函數(shù)使用的正確性;在函數(shù)定義和聲明時(shí),必須提供全部資訊:
voiddisplay(int,char*,float);intmixture(int,float,char*);C++的初步知識(shí)51
變數(shù)的說(shuō)明在C中,變數(shù)的定義必須出現(xiàn)在函數(shù)或複合語(yǔ)句的最前面,在正常執(zhí)行語(yǔ)句後面不能再定義變數(shù)。intm,n,k;m=10;n=9;k=m*n;….在C++中,變數(shù)的定義可以出現(xiàn)在任何位置。intm,n,k;m=10;n=9;k=m*n;….intx,y;y=k+m;…C++的初步知識(shí)52
輸入和輸出C++中除了保留C標(biāo)準(zhǔn)庫(kù)中的各種輸入和輸出函數(shù)外,還提供了一套新的輸入和輸出函數(shù)—流式輸入輸出。使用時(shí)包含頭檔“iostream.h”。例:
#include<iostream.h>intx,y;floatz;cin>>x>>y>>z;//從標(biāo)準(zhǔn)終端輸入數(shù)據(jù)
char*str=“Hello,howareyou!”;cout<<“Pleaseoutputtheinfoofthestring:”<<str<<“\n”;//向螢?zāi)惠敵鲎执?3
const說(shuō)明符定義常量時(shí),C語(yǔ)言用#define,而C++用const說(shuō)明符,const在C++中的作用:1.代替#define宏定義常量例:#defineMAX100
可替代為:
constintMAX=100;或intconstMAX=100;2.定義常量數(shù)組
constfloatdata[]={1.2,2.5,3.6,4.8,5.5};C++的初步知識(shí)54
const說(shuō)明符3.
const說(shuō)明符與函數(shù)參數(shù)相連接。例:voidprint_value(constintvalue){cout<<value;}
試圖在該函數(shù)體中改變const參量value的是非法的。C++的初步知識(shí)55
const說(shuō)明符4.定義指針常量,根據(jù)const位置的不同含義也不同,有三種方式:(1)指向常量的指針:說(shuō)明一個(gè)指針變數(shù)指向的數(shù)據(jù)是常量。(name是指向字串常量的指針,name指向的字串不能更改,但name可以更新)
const
char*name=“Richard”;name=“Martin”;對(duì)
name[0]=‘C’;錯(cuò)C++的初步知識(shí)56
const說(shuō)明符(2)常指針:把指針本身聲明為一個(gè)常量,而不是將它指向的對(duì)象聲明為常量。(name不能更改,name指向的內(nèi)容可更新)
char*constname=“Richard”;name=“Martin”;錯(cuò)
name[0]=‘C’;對(duì)(3)指向常量的常指針:
這個(gè)指針本身不能改變,它指向的值也不能改變。(name不能更改,name指向的內(nèi)容也不能更新)
constchar*constname=“Richard”;name=“Martin”;錯(cuò)
name[0]=‘C’;錯(cuò)57
void類(lèi)型void是指沒(méi)有數(shù)值的數(shù)據(jù)類(lèi)型,沒(méi)有任何返回值的函數(shù)應(yīng)說(shuō)明為void類(lèi)型。例如:voidfun(int*);void也可表示一個(gè)函數(shù)不需要任何入口參數(shù)。例如:intgraph(void);將C程式轉(zhuǎn)換成與C++相容的最常見(jiàn)的工作就是將沒(méi)有返回值的函數(shù)說(shuō)明為void類(lèi)型。C++嚴(yán)格檢查所有的函數(shù)原型是否包括:返回值類(lèi)型、函數(shù)名和各個(gè)參數(shù)的類(lèi)型。C++的初步知識(shí)58例1.4.1輸出一行字元:“ThisisaC++program.”程式如下:#include<iostream>//用cout輸出時(shí)需要用此頭檔usingnamespacestd;//使用命名空間std
intmain(){
cout<<“ThisisaC++program.\n”;//用C++的
//方法輸出一行資訊
return0;}程式運(yùn)行時(shí)輸出:ThisisaC++program.最簡(jiǎn)單的C++程式#include<iostream.h>59命名空間(Namespace)一個(gè)命名空間將不同的識(shí)別字集合在一個(gè)命名作用域(namedscope)內(nèi)為了解決命名衝突例如,聲明一個(gè)命名空間NS:namspaceNS{classFile;voidFun();}
則引用識(shí)別字的方式如下,NS::Fileobj;NS::Fun();沒(méi)有聲明命名空間的識(shí)別字都處?kù)稛o(wú)名的命名空間中60命名空間(Namespace)可以用using來(lái)指定命名空間例如,經(jīng)過(guò)以下聲明:
usingNS::File;
在當(dāng)前作用域中就可以直接引用Fileusingnamespacestd;
命名空間std中所有識(shí)別字都可直接引用在新的C++標(biāo)準(zhǔn)程式庫(kù)中,所有識(shí)別字都聲明在命名空間std中,頭檔都不使用擴(kuò)展名61最簡(jiǎn)單的C++程式例1.4.2求a、b兩個(gè)數(shù)之和。//求兩個(gè)數(shù)之和(本行是注釋?zhuān)?include<iostream>//用cout輸出時(shí)需要用此頭檔usingnamespacestd;//使用命名空間std
intmain()//主函數(shù)首部{inta,b,sum;//定義變數(shù)
cin>>a>>b;//輸入語(yǔ)句
sum=a+b;
cout<<“a+b=”<<sum<<endl;//輸出語(yǔ)句
return0;}注:1825(輸入18和25給a、b),a、b之間一個(gè)空格62C++程式的書(shū)寫(xiě)格式一個(gè)C++程式可以由一個(gè)程式單位或多個(gè)程式單位構(gòu)成。每一個(gè)程式單位作為一個(gè)檔,每個(gè)檔由若干個(gè)函數(shù)組成。由函數(shù)構(gòu)成的C++程式中,必須只有一個(gè)主函數(shù)main(),它是程式執(zhí)行的入口。需要指出兩點(diǎn):1、C++函數(shù)(包括main)的定義和聲明,必須提供函數(shù)的全部資訊:返回值、函數(shù)參數(shù)類(lèi)型和個(gè)數(shù)。無(wú)返回值或無(wú)參的情況用void;2、注釋形式:在一行語(yǔ)句內(nèi),“//”後面的字元被視為注釋在多行語(yǔ)句內(nèi),“/*”和“*/”中間的所有字元被視為注釋。63C++程式的編寫(xiě)和實(shí)現(xiàn)用C++語(yǔ)言編寫(xiě)根源程式*.cpp;對(duì)根源程式進(jìn)行編譯,形成*.obj檔。如果編譯出錯(cuò),再修改根源程式,直到編譯正確;將目標(biāo)檔與C++編譯器提供的庫(kù)檔進(jìn)行連接,形成可執(zhí)行的二進(jìn)位檔*.exe;運(yùn)行程式;分析運(yùn)行結(jié)果。642.1類(lèi)的聲明和對(duì)象定義C++類(lèi)及其對(duì)象的封裝性類(lèi)是具有相同屬性和行為的一組對(duì)象的集合,它為屬於該類(lèi)的全部對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個(gè)主要部分。利用類(lèi)可以實(shí)現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。利用類(lèi)易於編寫(xiě)大型複雜程式,其模組化程度比C中採(cǎi)用函數(shù)更高。652.1類(lèi)的聲明和對(duì)象定義C++類(lèi)及其對(duì)象的封裝性類(lèi)是對(duì)象共性特徵的抽象,對(duì)象的類(lèi)型稱(chēng)為類(lèi),類(lèi)是對(duì)象的範(fàn)本,對(duì)象是類(lèi)的具體實(shí)例;先聲明一個(gè)類(lèi),再定義對(duì)象,類(lèi)是抽象的,不佔(zhàn)用記憶體,對(duì)象是具體的,佔(zhàn)用實(shí)際的存儲(chǔ)空間;可以看作是一種特殊的構(gòu)造數(shù)據(jù)類(lèi)型,是結(jié)構(gòu)體的擴(kuò)充形式;類(lèi)是數(shù)據(jù)和對(duì)這些數(shù)據(jù)進(jìn)行操作的函數(shù)的封裝體,是包括數(shù)據(jù)和函數(shù)的數(shù)據(jù)類(lèi)型;類(lèi)的定義包括數(shù)據(jù)和函數(shù)的定義,類(lèi)中的數(shù)據(jù)和函數(shù)都是類(lèi)的成員;在C++中,類(lèi)用class來(lái)構(gòu)造。66類(lèi)的聲明
//聲明結(jié)構(gòu)體類(lèi)型struct
Student{intnum;
charname[20];
charsex;
};//定義2個(gè)結(jié)構(gòu)變數(shù)Studentstud1,stud2;class
Student//聲明類(lèi),以class開(kāi)頭
{intnum;
charname[20];
charsex;//以上3行是數(shù)據(jù)成員
voiddisplay()//成員函數(shù)
{cout<<“num:”<<num<<endl;
cout<<“name:”<<name<<endl;
cout<<“sex:”<<sex<<endl;}};
//定義Student類(lèi)的對(duì)象stud1,stud2Student
stud1,stud2;672.1類(lèi)的聲明和對(duì)象定義上述類(lèi)定義中未限定成員的訪問(wèn)屬性,對(duì)象stud1的數(shù)據(jù)和函數(shù)都是private的,數(shù)據(jù)安全了。但外界不能調(diào)用stud1中的函數(shù)和功能,因?yàn)闆](méi)有提供類(lèi)的對(duì)外的介面,類(lèi)有何用?不能把類(lèi)中的全部成員與外界隔離,一般將類(lèi)中的數(shù)據(jù)隱藏起來(lái),聲明為私有的(private),把成員函數(shù)作為對(duì)外界的介面,聲明為公有的(public)。例如,上述類(lèi)聲明改為:classStudent//聲明類(lèi)類(lèi)型{private://聲明以下部分為私有
intnum;
charname[20];
charsex;
public://聲明以下部分為公有
voiddisplay(){cout<<“num:”<<num<<endl;
cout<<“name:”<<name<<endl;
cout<<“sex:”<<sex<<endl;}};Student
stud1,stud2;68在C++中,定義類(lèi)的一般格式為:class
類(lèi)名{
private:
//私有類(lèi)型只限於通過(guò)自己的成員函數(shù)
//來(lái)訪問(wèn),即只有類(lèi)本身能夠訪問(wèn)它數(shù)據(jù)成員和成員函數(shù)說(shuō)明
public:
//公有類(lèi)型提供了類(lèi)的外部介面,允許類(lèi)
//的使用者來(lái)訪問(wèn)它數(shù)據(jù)成員和成員函數(shù)說(shuō)明
protected:
//保護(hù)類(lèi)型只允許本類(lèi)成員函數(shù)或派生
//類(lèi)成員函數(shù)訪問(wèn),用於類(lèi)的繼承和派生數(shù)據(jù)成員和成員函數(shù)};69公有類(lèi)型成員在關(guān)鍵字public後面聲明,它們是類(lèi)與外部的介面,任何外部函數(shù)都可以訪問(wèn)公有類(lèi)型數(shù)據(jù)和函數(shù)。類(lèi)的聲明和對(duì)象的定義70私有類(lèi)型成員在關(guān)鍵字private後面聲明,只允許本類(lèi)中的函數(shù)訪問(wèn),而類(lèi)外部的任何函數(shù)都不能訪問(wèn)。如果緊跟在類(lèi)名稱(chēng)的後面聲明私有成員,則關(guān)鍵字private可以省略。類(lèi)的聲明和對(duì)象的定義71保護(hù)類(lèi)型與private類(lèi)似,其差別表現(xiàn)在繼承與派生時(shí)對(duì)派生類(lèi)的影響不同。類(lèi)的聲明和對(duì)象的定義72在類(lèi)的定義中應(yīng)注意以下幾點(diǎn):1、“類(lèi)名”是一個(gè)合法的識(shí)別字;2、關(guān)鍵字private,public和protected說(shuō)明類(lèi)成員的三種訪問(wèn)許可權(quán);3、{}以內(nèi)的部分是“類(lèi)內(nèi)”,{}以外的部分為“類(lèi)外”;4、類(lèi)定義的聲明部分在“類(lèi)內(nèi)”,類(lèi)的成員函數(shù)既可以在“類(lèi)內(nèi)”定義,也可以在“類(lèi)外”定義;5、在“類(lèi)內(nèi)”不允許對(duì)所聲明的數(shù)據(jù)成員進(jìn)行初始化,類(lèi)的數(shù)據(jù)成員的類(lèi)型可以任意。73classCArea//聲明一個(gè)類(lèi){private://私有部分
intx,y,area;public://公有部分
voidsquarea(intvx,intvy);};例題2.1.174類(lèi)的成員classClock{public:
voidSetTime(intNewH,intNewM,
intNewS);
voidShowTime();private:intHour,Minute,Second;};成員數(shù)據(jù)成員函數(shù)類(lèi)的聲明和對(duì)象的定義75voidClock::SetTime(intNewH,intNewM,
intNewS){Hour=NewH;Minute=NewM;Second=NewS;}voidClock::ShowTime(){cout<<Hour<<":"<<Minute<<":"<<Second;}類(lèi)的聲明和對(duì)象的定義76數(shù)據(jù)成員與一般的變數(shù)聲明相同,但需要將它放在類(lèi)的聲明體中。類(lèi)的聲明和對(duì)象的定義77成員函數(shù)在類(lèi)中說(shuō)明原形,可以在類(lèi)外給出函數(shù)體實(shí)現(xiàn),並在函數(shù)名前使用類(lèi)名加以限定。也可以直接在類(lèi)中給出函數(shù)體,形成內(nèi)置成員函數(shù)。允許聲明重載函數(shù)和帶默認(rèn)形參值的函數(shù)類(lèi)的聲明和對(duì)象的定義78類(lèi)和結(jié)構(gòu)體的異同1、均為構(gòu)造類(lèi)型;2、結(jié)構(gòu)體用struct、類(lèi)用class作為標(biāo)識(shí);2、結(jié)構(gòu)體中的成員只有數(shù)據(jù)成員,且訪問(wèn)許可權(quán)默認(rèn)為public的;3、類(lèi)的成員包括數(shù)據(jù)和函數(shù),且訪問(wèn)許可權(quán)可以設(shè)置為private、public和protected的;4、結(jié)構(gòu)沒(méi)有實(shí)現(xiàn)數(shù)據(jù)封裝,數(shù)據(jù)可以被任何外部函數(shù)訪問(wèn)。類(lèi)實(shí)現(xiàn)了數(shù)據(jù)封裝,可以將數(shù)據(jù)限定為只能被本身的成員函數(shù)訪問(wèn)。類(lèi)的聲明和對(duì)象的定義79定義對(duì)象的方法1、先聲明類(lèi)類(lèi)型,然後再定義對(duì)象:如Student
stud1,stud2;在聲明類(lèi)類(lèi)型之後,定義對(duì)象有2種方法:class類(lèi)名對(duì)象名;如classStudentstud1,stud2;類(lèi)名對(duì)象名;如Student
stud1,stud2;類(lèi)的聲明和對(duì)象的定義80定義對(duì)象的方法2、在聲明類(lèi)類(lèi)型的同時(shí)定義對(duì)象:classStudent
//聲明類(lèi)類(lèi)型{public://先聲明公用部分
voiddisplay()
{cout<<“num:”<<num<<endl;
cout<<“name:”<<name<<endl;
cout<<“sex:”<<sex<<endl;}
private://後聲明私有部分
intnum;
charname[20];
charsex;}stud1,stud2;//定義Student類(lèi)的對(duì)象stud1,stud2類(lèi)的聲明和對(duì)象的定義81定義對(duì)象的方法3、不出現(xiàn)類(lèi)名,直接定義對(duì)象:class
//聲明類(lèi)類(lèi)型{public://聲明公用部分
……
private://聲明私有部分
……
protected://聲明保護(hù)部分
……}stud1,stud2;//定義對(duì)象stud1,stud2
定義多個(gè)對(duì)象時(shí),對(duì)象名之間用逗號(hào)隔開(kāi);對(duì)象名可以是一般的對(duì)象、指向?qū)ο蟮闹羔樆蛞妹?,也可以是?duì)象數(shù)組。
類(lèi)的聲明和對(duì)象的定義82例2.1.2定義一個(gè)日期類(lèi)CDate,再創(chuàng)建一個(gè)生日對(duì)象。classCDate{intyear;
intmonth;
intday;public:
voidSetDate(int,int,int);
voidShowDate();}myBirthday;//同時(shí)創(chuàng)建對(duì)象myBirthday或者定義類(lèi)之後:CDate
myBirthday,*p,q[5];類(lèi)的聲明和對(duì)象的定義83
2.2
類(lèi)的成員函數(shù)C++類(lèi)及其對(duì)象的封裝性類(lèi)的成員函數(shù)具有一般函數(shù)的性質(zhì),它同時(shí)屬於某個(gè)類(lèi)的成員,出現(xiàn)在類(lèi)定義體中,可被限定為具有private、public和protected三種訪問(wèn)屬性;成員函數(shù)可以訪問(wèn)本類(lèi)中的任何成員(包括private和public特性),可以引用在本作用域中有效的數(shù)據(jù);private屬性的成員函數(shù)只能被本類(lèi)其他的成員函數(shù)調(diào)用,不能被外界調(diào)用;public屬性的成員函數(shù)可以被外界調(diào)用,它是類(lèi)的對(duì)外介面。84在類(lèi)外定義成員函數(shù)類(lèi)的成員函數(shù)類(lèi)的成員函數(shù)可以在“類(lèi)內(nèi)”聲明,在“類(lèi)外”定義;類(lèi)外定義成員函數(shù)的一般形式如下:
返回值類(lèi)型
類(lèi)名::成員函數(shù)名(參數(shù)表){…
…//函數(shù)體
}
其中::是作用域運(yùn)算符。85例2.2.1classStudent
{public:
voiddisplay();//公用成員函數(shù)原型聲明
private:
intnum;
stringname;
charsex;//以上3行是私有數(shù)據(jù)成員};voidStudent
::display()//在類(lèi)外定義成員函數(shù){cout<<“num:”<<num<<endl;
cout<<“name:”<<name<<endl;
cout<<“sex:”<<sex<<endl;}Student
stud1,stud2;//定義2個(gè)類(lèi)對(duì)象類(lèi)的成員函數(shù)86內(nèi)置(inline)成員函數(shù)有些簡(jiǎn)單的成員函數(shù)可以直接在類(lèi)定義中定義,在類(lèi)定義體中定義的成員函數(shù)稱(chēng)為內(nèi)置函數(shù)(內(nèi)聯(lián)函數(shù));內(nèi)置函數(shù)可以減少函數(shù)調(diào)用時(shí)的記憶體開(kāi)銷(xiāo),不用記錄函數(shù)調(diào)用返回地址,只將代碼嵌入到函數(shù)調(diào)用點(diǎn)。內(nèi)置函數(shù)的定義有兩種方法:1、隱式定義將成員函數(shù)的定義體放在“類(lèi)內(nèi)”中。2、顯式定義在“類(lèi)內(nèi)”聲明,在“類(lèi)外”定義時(shí)在函數(shù)名前加關(guān)鍵字inline。類(lèi)的成員函數(shù)87內(nèi)置成員函數(shù)舉例(一)classPoint{public:voidInit(intinitX,intinitY)
{X=initX;Y=initY;}intGetX(){returnX;}intGetY(){returnY;}private:intX,Y;};類(lèi)的成員函數(shù)88內(nèi)置成員函數(shù)舉例(二)classPoint{public:voidInit(intinitX,intinitY);intGetX();
intGetY();
private:intX,Y;};類(lèi)的成員函數(shù)inlinevoidPoint::
Init(intinitX,intinitY){X=initX;Y=initY;}inlineintPoint::GetX(){returnX;}inlineintPoint::GetY(){returnY;}90成員函數(shù)的存儲(chǔ)方式定義類(lèi)對(duì)象時(shí),系統(tǒng)會(huì)為每個(gè)對(duì)象分配存儲(chǔ)空間,包括為類(lèi)對(duì)象的數(shù)據(jù)和函數(shù)代碼分配空間;如果定義同類(lèi)的10個(gè)對(duì)象,那麼如何為這10個(gè)對(duì)象分配不同的空間?10個(gè)同類(lèi)對(duì)象佔(zhàn)用存儲(chǔ)單元的情況類(lèi)的成員函數(shù)91成員函數(shù)的存儲(chǔ)方式為了節(jié)約記憶體,只用一段存儲(chǔ)空間來(lái)存放10個(gè)對(duì)象擁有的共同的函數(shù)代碼段,如下圖:
10個(gè)同類(lèi)對(duì)象成員函數(shù)的存儲(chǔ)方式C++規(guī)定:對(duì)象佔(zhàn)用的存儲(chǔ)空間只是對(duì)象數(shù)據(jù)成員佔(zhàn)用的存儲(chǔ)空間,可用sizeof函數(shù)驗(yàn)證;共同的成員函數(shù)代碼存儲(chǔ)在對(duì)象空間之外。類(lèi)的成員函數(shù)92成員函數(shù)的存儲(chǔ)方式調(diào)用不同對(duì)象的成員函數(shù)時(shí)都是執(zhí)行同一段函數(shù)代碼,但其執(zhí)行結(jié)果一般不同(常與數(shù)據(jù)有關(guān));不同對(duì)象使用同一段函數(shù)代碼,它們?nèi)绾螌?duì)不同對(duì)象中的數(shù)據(jù)進(jìn)行操作呢?C++專(zhuān)門(mén)為此設(shè)計(jì)了一個(gè)this指針,用來(lái)指向不同的對(duì)象;調(diào)用哪個(gè)對(duì)象,this就指向哪個(gè)對(duì)象,就訪問(wèn)它的成員。類(lèi)的成員函數(shù)93類(lèi)中成員的訪問(wèn)方式類(lèi)中成員互訪直接使用成員名類(lèi)外訪問(wèn)使用“對(duì)象名.成員名”方式訪問(wèn)
public
屬性的成員類(lèi)的成員函數(shù)94例:類(lèi)的應(yīng)用舉例#include<iostream>usingnamespacestd;classClock{//類(lèi)的聲明略}//類(lèi)的實(shí)現(xiàn)略voidmain(void){ClockmyClock;
myClock.SetTime(8,30,30);
myClock.ShowTime();}類(lèi)的成員函數(shù)95對(duì)象成員的引用訪問(wèn)對(duì)象中的成員有3種方法:1、通過(guò)對(duì)象名和成員運(yùn)算符訪問(wèn)對(duì)象中的成員,即:
對(duì)象名.數(shù)據(jù)成員名
or對(duì)象名.成員函數(shù)名(參數(shù)表)例如:stud1.num=1001;
stud1.display();
//設(shè)num和display函數(shù)為public成員
類(lèi)的成員函數(shù)96對(duì)象成員的引用定義一個(gè)日期類(lèi),使其具有輸出當(dāng)前日期的功能。見(jiàn)p-27例2.3.1:引用對(duì)象的成員2、通過(guò)指向?qū)ο蟮闹羔樤L問(wèn)對(duì)象中的成員,即:對(duì)象指針->數(shù)據(jù)成員名
or對(duì)象指針->成員函數(shù)名(參數(shù)表)
例如:Timet,*p=&t;cout<<p->hour;//hour是t中的成員3、通過(guò)對(duì)象的引用變數(shù)訪問(wèn)對(duì)象中的成員。類(lèi)的成員函數(shù)97類(lèi)的封裝性類(lèi)將一組數(shù)據(jù)和操作這些數(shù)據(jù)的演算法封裝在自定義的抽象數(shù)據(jù)類(lèi)型中。一般將類(lèi)的所有數(shù)據(jù)聲明為private(與外界隔離),將成員函數(shù)聲明為public(外界可以調(diào)用),外界通過(guò)調(diào)用公用成員函數(shù)實(shí)現(xiàn)對(duì)數(shù)據(jù)的操作;公用成員函數(shù)是用戶使用類(lèi)的公用介面(publicinterface),用戶只需知道如何調(diào)用公用成員函數(shù),不需瞭解函數(shù)的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),此即介面與實(shí)現(xiàn)分離;通過(guò)成員函數(shù)對(duì)數(shù)據(jù)成員進(jìn)行操作稱(chēng)為類(lèi)的實(shí)現(xiàn)。為了防止用戶隨意修改公用成員函數(shù),一般不向用戶公開(kāi)公用成員函數(shù)的源代碼,用戶只能接觸到其目標(biāo)代碼;類(lèi)中被操作的數(shù)據(jù)是私有的,實(shí)現(xiàn)的細(xì)節(jié)對(duì)用戶隱蔽,此即私有實(shí)現(xiàn)(privateimplementation)?!邦?lèi)的公用介面與私有實(shí)現(xiàn)的分離”形成了資訊隱蔽。
類(lèi)的封裝和資訊隱藏98封裝性的好處軟體工程的一個(gè)最基本的原則就是將介面與實(shí)現(xiàn)分離,資訊隱蔽是軟體工程的重要概念,其好處在於:(1)如果想修改或擴(kuò)充類(lèi)的功能,只需修改本類(lèi)中有關(guān)的數(shù)據(jù)成員和與它有關(guān)的成員函數(shù),程式中類(lèi)外的部分可以不必修改。(2)如果在編譯時(shí)發(fā)現(xiàn)類(lèi)中的數(shù)據(jù)讀寫(xiě)有錯(cuò),不必檢查整個(gè)程式,只需檢查本類(lèi)中訪問(wèn)這些數(shù)據(jù)的少數(shù)成員函數(shù)。這樣,就極大方便了程式(特別是大程式)的設(shè)計(jì)、修改和調(diào)試。類(lèi)的封裝和資訊隱藏99類(lèi)聲明和成員函數(shù)定義的分離類(lèi)被一個(gè)程式使用,將類(lèi)的聲明和成員函數(shù)的定義寫(xiě)在檔開(kāi)頭;類(lèi)被多個(gè)程式使用,需要重複將其寫(xiě)在多個(gè)檔開(kāi)頭;將類(lèi)的聲明(包含成員函數(shù)的聲明)放在指定的頭檔中,用戶使用類(lèi)時(shí),只要包含相應(yīng)的頭檔,即可定義該類(lèi)的對(duì)象、調(diào)用對(duì)象的公用成員函數(shù);為了實(shí)現(xiàn)資訊隱蔽,將類(lèi)的成員函數(shù)定義放在另一個(gè)檔中。這時(shí),一個(gè)程式有兩個(gè)模組:類(lèi)的成員函數(shù)定義檔student.cpp和主模組main.cpp,它們都包含類(lèi)聲明頭檔student.h;將student.cpp編譯成目標(biāo)檔student.obj,形成用戶類(lèi)庫(kù),與main.obj和系統(tǒng)資源庫(kù)鏈接而成main.exe。類(lèi)的封裝和資訊隱藏100類(lèi)聲明和成員函數(shù)定義的分離//student.hclassStudent{public:
voiddisplay();
private:
intnum;
charname[20];
charsex;};類(lèi)的封裝和資訊隱藏101類(lèi)聲明和成員函數(shù)定義的分離//student.cpp#include<iostream.h>#include“student.h”voidStudent::display()
{cout<<“num:”<<num<<endl;cout<<“name:”<<name<<endl;cout<<“sex:”<<sex<<endl;}//main.cpp#include<iostream.h>#include“student.h”intmain(){Student
stud;
stud.Display();
return0;}類(lèi)的封裝和資訊隱藏102類(lèi)聲明和成員函數(shù)定義的分離圖2.4.1包含多個(gè)原始檔案程式的編譯和連接過(guò)程類(lèi)的封裝和資訊隱藏103類(lèi)聲明和成員函數(shù)定義的分離使用類(lèi)庫(kù)將減少用戶對(duì)類(lèi)和成員函數(shù)定義的工作量;類(lèi)庫(kù)包括兩個(gè)部分:(1)類(lèi)聲明頭檔;(2)已經(jīng)編譯過(guò)的成員函數(shù)定義檔-目標(biāo)檔;用戶只需將類(lèi)庫(kù)裝入到自己的電腦系統(tǒng)(裝在C++編譯系統(tǒng)所在的子目錄),並在程式中用#include命令將有關(guān)類(lèi)聲明的頭檔包含到程式中,即可使用這些類(lèi)和其中的成員函數(shù)了;介面與實(shí)現(xiàn)的分離,為軟體開(kāi)發(fā)商給用戶提供類(lèi)庫(kù)創(chuàng)造了條件,而類(lèi)實(shí)現(xiàn)的程式代碼得到了保護(hù)。類(lèi)的封裝和資訊隱藏104構(gòu)造函數(shù)構(gòu)造函數(shù)的作用是在對(duì)象被創(chuàng)建時(shí)使用特定的值構(gòu)造對(duì)象,或者說(shuō)將對(duì)象初始化為一個(gè)特定的狀態(tài)。在對(duì)象創(chuàng)建時(shí)由系統(tǒng)自動(dòng)調(diào)用。如果程式中未聲明,則系統(tǒng)自動(dòng)產(chǎn)生出一個(gè)默認(rèn)形式的構(gòu)造函數(shù)允許為內(nèi)置函數(shù)、重載函數(shù)、帶默認(rèn)形參值的函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)105構(gòu)造函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)的名字必須與類(lèi)名相同;構(gòu)造函數(shù)一般聲明為public,無(wú)返回值,無(wú)需定義返回類(lèi)型;構(gòu)造函數(shù)是系統(tǒng)自動(dòng)調(diào)用的,且執(zhí)行一次;構(gòu)造函數(shù)不能被繼承,但允許重載(overloading);構(gòu)造函數(shù)的功能是對(duì)對(duì)象進(jìn)行初始化,一般構(gòu)造函數(shù)用於對(duì)象的初始化,每當(dāng)對(duì)象被聲明時(shí)對(duì)數(shù)據(jù)成員做初始化,不做賦值外的事情。106構(gòu)造函數(shù)的幾種形式構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)可為內(nèi)聯(lián)函數(shù),可以為無(wú)參數(shù)或帶參數(shù),還可以缺省參數(shù),例如:無(wú)參的構(gòu)造函數(shù)參數(shù)化的構(gòu)造函數(shù)缺省參數(shù)的構(gòu)造函數(shù)多構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)107classCArea{public:CArea(){x=0;y=0;}//無(wú)參數(shù)的構(gòu)造函數(shù)
CArea(intrx,intry=0);//帶缺省參數(shù)的構(gòu)造函數(shù)
CArea(floatrr){rr=0;}//帶一個(gè)參數(shù)的構(gòu)造函數(shù)
CArea(floatrr,char*ra);//帶兩個(gè)參數(shù)的構(gòu)造函數(shù)
};例2.5.1在類(lèi)中定義構(gòu)造函數(shù),見(jiàn)p33在類(lèi)中聲明的多種構(gòu)造函數(shù):例108構(gòu)造函數(shù)舉例classClock{public:
Clock(intNewH,intNewM,intNewS);//構(gòu)造函數(shù)
voidSetTime(intNewH,intNewM,intNewS); voidShowTime();private: intHour,Minute,Second;};構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)的實(shí)現(xiàn):Clock::Clock(intNewH,intNewM,intNewS){ Hour=NewH; Minute=NewM; Second=NewS;}建立對(duì)象時(shí)構(gòu)造函數(shù)的作用:voidmain(){
Clockc(0,0,0);//隱含調(diào)用構(gòu)造函數(shù),將初始值作為實(shí)參。
c.ShowTime();}31110
構(gòu)造函數(shù)的使用何時(shí)調(diào)用構(gòu)造函數(shù)?在類(lèi)對(duì)象進(jìn)入其作用域時(shí)調(diào)用構(gòu)造函數(shù);構(gòu)造函數(shù)沒(méi)有返回值,不要在定義構(gòu)造函數(shù)時(shí)聲明類(lèi)型;構(gòu)造函數(shù)不需要用戶調(diào)用,也不能被用戶調(diào)用;在構(gòu)造函數(shù)體中,不僅可以對(duì)數(shù)據(jù)成員賦初值,還可以包含其他語(yǔ)句如cout;如果用戶沒(méi)有定義構(gòu)造函數(shù),C++系統(tǒng)會(huì)自動(dòng)生成一個(gè)構(gòu)造函數(shù),其函數(shù)體為空,不執(zhí)行初始化操作;要想初始化一個(gè)對(duì)象,需要重新定義構(gòu)造函數(shù),否則對(duì)象的狀態(tài)將是隨機(jī)的。構(gòu)造函數(shù)和析構(gòu)函數(shù)111帶參數(shù)的構(gòu)造函數(shù)定義對(duì)象時(shí),通過(guò)不同參數(shù)值的傳遞實(shí)現(xiàn)不同對(duì)象的不同初始化,可以使用帶參數(shù)的構(gòu)造函數(shù);一般格式:構(gòu)造函數(shù)名(類(lèi)型1形參1,類(lèi)型2形參2,……)用戶不能顯式地調(diào)用構(gòu)造函數(shù),也無(wú)法採(cǎi)用常規(guī)的調(diào)用函數(shù)的方法給出實(shí)參(如fun(a,b))。實(shí)參只能在定義對(duì)象時(shí)給出,定義對(duì)象的一般格式:類(lèi)名對(duì)象名(實(shí)參1,實(shí)參2,……);例2.5.2:有兩個(gè)長(zhǎng)方體,長(zhǎng)、寬、高分別為:(1)12,25,30;(2)15,30,21。用帶參數(shù)的構(gòu)造函數(shù)編寫(xiě)程式求其體積。構(gòu)造函數(shù)和析構(gòu)函數(shù)112使用參數(shù)初始化表
在定義對(duì)象時(shí),可使用參數(shù)初始化表來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)成員的初始化,在函數(shù)首部實(shí)現(xiàn):Box::Box(inth,intw,intlen):height(h),width(w),length(len){}
其含義是:用形參h的值初始化數(shù)據(jù)成員height,用形參w的值初始化數(shù)據(jù)成員width,用形參len的值初始化數(shù)據(jù)成員length。構(gòu)造函數(shù)和析構(gòu)函數(shù)113構(gòu)造函數(shù)的重載
一個(gè)類(lèi)可以定義多個(gè)構(gòu)造函數(shù),使用戶選用不同的方式完成對(duì)象數(shù)據(jù)的初始化;重載的所有構(gòu)造函數(shù)同名,但其參數(shù)類(lèi)型、參數(shù)個(gè)數(shù)必須有所區(qū)別。構(gòu)造函數(shù)和析構(gòu)函數(shù)114例2.5.3
在例2.5.2的基礎(chǔ)上定義兩個(gè)構(gòu)造函數(shù),其中一個(gè)無(wú)參數(shù),一個(gè)有參數(shù),見(jiàn)p37
重載構(gòu)造函數(shù)的例子例,可以在類(lèi)中聲明的多種構(gòu)造函數(shù):classCArea{public:CArea(){x=0;y=0;}//無(wú)參數(shù)的構(gòu)造函數(shù)
CArea(intrx,intry=0);//帶缺省參數(shù)的構(gòu)造函數(shù)
CArea(floatrr){rr=0;}//帶一個(gè)參數(shù)的構(gòu)造函數(shù)
CArea(floatrr,char*ra);//帶兩個(gè)參數(shù)的構(gòu)造函數(shù)
};115
缺省構(gòu)造函數(shù)在調(diào)用構(gòu)造函數(shù)時(shí)不必給出實(shí)參的構(gòu)造函數(shù),稱(chēng)為默認(rèn)構(gòu)造函數(shù)(DefaultConstructor)或缺省構(gòu)造函數(shù);無(wú)參數(shù)的構(gòu)造函數(shù)屬於缺省構(gòu)造函數(shù);如果在定義對(duì)象時(shí)選用無(wú)參構(gòu)造函數(shù),應(yīng)按以下形式定義對(duì)象:
Boxbox1;//調(diào)用無(wú)參構(gòu)造函數(shù)建立對(duì)象在一個(gè)類(lèi)中可以包含多個(gè)構(gòu)造函數(shù),但是在創(chuàng)建每個(gè)對(duì)象時(shí),只執(zhí)行其中一個(gè)匹配版本的構(gòu)造函數(shù)。構(gòu)造函數(shù)和析構(gòu)函數(shù)116默認(rèn)形參值的作用函數(shù)在聲明時(shí)可以預(yù)先給出默認(rèn)的形參值,調(diào)用時(shí)如給出實(shí)參,則採(cǎi)用實(shí)參值,否則採(cǎi)用預(yù)先給出的默認(rèn)形參值。例如:intadd(intx=5,inty=6){returnx+y;}voidmain(void){add(10,20);//10+20add(10);//10+6add();//5+6}117默認(rèn)形參值的說(shuō)明次序默認(rèn)形參值必須從右向左順序聲明,並且在默認(rèn)形參值的右面不能有非默認(rèn)形參值的參數(shù)。因?yàn)檎{(diào)用時(shí)實(shí)參取代形參是從左向右的順序。例:intadd(intx,inty=5,intz=6);//正確intadd(intx=1,inty=5,intz);//錯(cuò)誤intadd(intx=1,inty,intz=6);//錯(cuò)誤118默認(rèn)形參值與函數(shù)的調(diào)用位置調(diào)用出現(xiàn)在函數(shù)體實(shí)現(xiàn)之前時(shí),默認(rèn)形參值必須在函數(shù)原形中給出;而當(dāng)調(diào)用出現(xiàn)在函數(shù)體實(shí)現(xiàn)之後時(shí),默認(rèn)形參值需在函數(shù)實(shí)現(xiàn)時(shí)給出。例:intadd(intx=5,inty=6);voidmain(void){add();
//調(diào)用在實(shí)現(xiàn)前}intadd(intx,inty){returnx+y;}intadd(intx=5,inty=6){returnx+y;}voidmain(void){add();
//調(diào)用在實(shí)現(xiàn)後}119默認(rèn)形參值的作用域在相同的作用域內(nèi),默認(rèn)形參值的說(shuō)明應(yīng)保持唯一,但如果在不同的作用域內(nèi),允許說(shuō)明不同的默認(rèn)形參。例:intadd(intx=1,inty=2);voidmain(void){intadd(intx=3,inty=4);add();//使用局部默認(rèn)形參值(實(shí)現(xiàn)3+4)}voidfun(void){...
add();//使用全局默認(rèn)形參值(實(shí)現(xiàn)1+2)}120
使用默認(rèn)參數(shù)的構(gòu)造函數(shù)使用默認(rèn)參數(shù)的構(gòu)造函數(shù),即構(gòu)造函數(shù)的參數(shù)表中沒(méi)有參數(shù);如果創(chuàng)建對(duì)象時(shí)不需要通過(guò)傳遞參數(shù)來(lái)初始化對(duì)象,可以使用它。例2.5.4:將例2.5.3的構(gòu)造函數(shù)改為含默認(rèn)值參數(shù)值,長(zhǎng)、寬、高的默認(rèn)值均為10。構(gòu)造函數(shù)和析構(gòu)函數(shù)121
使用默認(rèn)參數(shù)的構(gòu)造函數(shù)注意:在構(gòu)造函數(shù)中使用默認(rèn)參數(shù)提供了建立對(duì)象的多種初始化方法,相當(dāng)於多個(gè)重載的構(gòu)造函數(shù);應(yīng)該在聲明構(gòu)造函數(shù)時(shí)指定參數(shù)的默認(rèn)值,而不能只在定義構(gòu)造函數(shù)時(shí)指定默認(rèn)值;如果構(gòu)造函數(shù)的全部參數(shù)都指定了默認(rèn)值,則在定義對(duì)象時(shí)可以不給出,或給出一個(gè)、幾個(gè)實(shí)參;在一個(gè)類(lèi)中定義了全部默認(rèn)參數(shù)的構(gòu)造函數(shù)後,不能再定義重載構(gòu)造函數(shù),否則會(huì)出現(xiàn)二義性。Box(int=10,int=10,int=10);//指定全部參數(shù)為默認(rèn)參數(shù)Box();
//聲明無(wú)參構(gòu)造函數(shù),是重載構(gòu)造函數(shù)Box(int,int);
//聲明有2個(gè)參數(shù)的構(gòu)造函數(shù)若有以下語(yǔ)句:Boxbox1;
//無(wú)法確定調(diào)用第1個(gè)、還是第2個(gè)構(gòu)造函數(shù)?Boxbox2(15,30);
//無(wú)法確定調(diào)用第1個(gè)、還是第3個(gè)構(gòu)造函數(shù)?例2.5.5。
析構(gòu)函數(shù)(destructor)也是一個(gè)特殊的成員函數(shù),它的作用與構(gòu)造函數(shù)相反.它的名字是類(lèi)名的前面加一個(gè)“~”符號(hào)。在C++中“~”是位取反運(yùn)算符,從這點(diǎn)也可以想到:析構(gòu)函數(shù)是與構(gòu)造函數(shù)作用相反的函數(shù)。當(dāng)對(duì)象的生命期結(jié)束時(shí),會(huì)自動(dòng)執(zhí)行析構(gòu)函數(shù)。比如說(shuō)如果在一個(gè)函數(shù)中定義了一個(gè)對(duì)象(它是自動(dòng)局部對(duì)象),當(dāng)這個(gè)函數(shù)被調(diào)用結(jié)束時(shí),對(duì)象應(yīng)該釋放,在對(duì)象釋放前自動(dòng)執(zhí)行析構(gòu)函數(shù)。析構(gòu)函數(shù)析構(gòu)函數(shù)的作用並不是刪除對(duì)象,而是在撤銷(xiāo)對(duì)象佔(zhàn)用的記憶體之前完成一些清理工作。最典型的情況是構(gòu)造對(duì)象時(shí),在構(gòu)造函數(shù)中分配了資源,例如動(dòng)態(tài)申請(qǐng)了一些記憶體單元,在對(duì)象消失時(shí)就要釋放這些記憶體單元。一般由一系列的delete組成。析構(gòu)函數(shù)不返回任何值,沒(méi)有函數(shù)類(lèi)型,也沒(méi)有函數(shù)參數(shù)。因此它不能被重載。一個(gè)類(lèi)可以有多個(gè)構(gòu)造函數(shù),但只能有一個(gè)析構(gòu)函數(shù)。析構(gòu)函數(shù)一般情況下,類(lèi)的設(shè)計(jì)者應(yīng)當(dāng)在聲明類(lèi)的同時(shí)定義析構(gòu)函數(shù),以指定如何完成“清理”的工作。如果用戶沒(méi)有定義析構(gòu)函數(shù),C++編譯系統(tǒng)會(huì)自動(dòng)生成一個(gè)析構(gòu)函數(shù),但它只是徒有析構(gòu)函數(shù)的名稱(chēng)和形式,實(shí)際上什麼操作都不進(jìn)行。想讓析構(gòu)函數(shù)完成任何工作,都必須在定義的析構(gòu)函數(shù)中指定。析構(gòu)函數(shù)125析構(gòu)函數(shù)析構(gòu)函數(shù)的作用與構(gòu)造函數(shù)相反。析構(gòu)函數(shù)的特點(diǎn):(1)析構(gòu)函數(shù)不能接受任何參數(shù),也沒(méi)有返回類(lèi)型說(shuō)明;(2)一個(gè)類(lèi)只有一個(gè)析構(gòu)函數(shù),如果用戶未編寫(xiě)析構(gòu)函數(shù),編譯系統(tǒng)會(huì)自動(dòng)生成一個(gè)缺省的析構(gòu)函數(shù),此函數(shù)不做任何事情;(3)析構(gòu)函數(shù)不能重載。構(gòu)造函數(shù)和析構(gòu)函數(shù)126何時(shí)執(zhí)行析構(gòu)函數(shù)?(1)一個(gè)函數(shù)中定義的對(duì)象(自動(dòng)局部的),在這個(gè)函數(shù)結(jié)束調(diào)用時(shí),對(duì)象應(yīng)該釋放,並在對(duì)象釋放前自動(dòng)執(zhí)行析構(gòu)函數(shù);(2)static類(lèi)型的局部對(duì)象在函數(shù)調(diào)用結(jié)束時(shí)並不釋放,也不調(diào)用析構(gòu)函數(shù),只在main函數(shù)結(jié)束或調(diào)用exit函數(shù)結(jié)束程式時(shí),才調(diào)用static局部對(duì)象的析構(gòu)函數(shù);(3)一個(gè)全局對(duì)象,在程式離開(kāi)其作用域時(shí)(如main函數(shù)結(jié)束或調(diào)用exit函數(shù)),調(diào)用該全局對(duì)象的析構(gòu)函數(shù);(4)用new運(yùn)算符動(dòng)態(tài)建立的對(duì)象,當(dāng)用delete運(yùn)算符釋放該對(duì)象時(shí),先調(diào)用該對(duì)象的析構(gòu)函數(shù);(5)如果用戶沒(méi)定義析構(gòu)函數(shù),C++編譯系統(tǒng)會(huì)自動(dòng)生成一個(gè)析構(gòu)函數(shù),只是它實(shí)際上不執(zhí)行任何操作。127構(gòu)造函數(shù)和析構(gòu)函數(shù)共同點(diǎn)都沒(méi)有返回值,無(wú)需指出返回類(lèi)型;不能被繼承;構(gòu)造函數(shù)可以有缺省參數(shù);不能用常規(guī)調(diào)用方法調(diào)用構(gòu)造函數(shù);當(dāng)使用完全的限定名(包括對(duì)象名、類(lèi)名、函數(shù)名)時(shí)可以調(diào)用析構(gòu)函數(shù);定義對(duì)象時(shí),編譯程序自動(dòng)調(diào)用構(gòu)造函數(shù),刪除對(duì)象時(shí),編譯程序自動(dòng)調(diào)用析構(gòu)函數(shù)。構(gòu)造函數(shù)和析構(gòu)函數(shù)128
構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用順序調(diào)用析構(gòu)函數(shù)的次序正好與調(diào)用構(gòu)造函數(shù)的次序相反,最先被調(diào)用的構(gòu)造函數(shù),其對(duì)應(yīng)的(同一對(duì)象中的)析構(gòu)函數(shù)最後被調(diào)用,而最後被調(diào)用的構(gòu)造函數(shù),其對(duì)應(yīng)的析構(gòu)函數(shù)最先被調(diào)用;“先構(gòu)造的後析構(gòu)、後構(gòu)造的先析構(gòu)”的先進(jìn)後出的特徵。構(gòu)造函數(shù)和析構(gòu)函數(shù)129圖2.7.1構(gòu)造函數(shù)與析構(gòu)函數(shù)調(diào)用順序調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序構(gòu)造函數(shù)和析構(gòu)函數(shù)
例2.6.1
包含構(gòu)造函數(shù)和析構(gòu)函數(shù)的C++程式。130
指向?qū)ο蟮闹羔槍?duì)象存儲(chǔ)空間的起始地址叫對(duì)象指針;可以定義一個(gè)指針變數(shù),存放對(duì)象空間的起始地址,如:
Timet1;//創(chuàng)建Time類(lèi)對(duì)象t1Time*pt=&t1;//定義指向Time類(lèi)對(duì)象
//的指針pt,並將t1的起始地址賦給pt對(duì)象指針131
指向?qū)ο蟮闹羔樋梢酝ㄟ^(guò)對(duì)象指針訪問(wèn)對(duì)象和對(duì)象的成員,如:
*pt//pt所指向?qū)ο髏1
(*pt).hour//pt所指向?qū)ο笾械膆our成員,即t1.hourpt->hour//pt所指向?qū)ο笾械膆our成員,即t1.hour
(*pt).get_time()//調(diào)用pt所指向的對(duì)象中的get_time函數(shù),即t1.get_time
pt->get_time()//調(diào)用pt所指向的對(duì)象中的
get_time函數(shù),即t1.get_time對(duì)象指針132
指向?qū)ο蟪蓡T的指針指向?qū)ο髷?shù)據(jù)成員的指針:數(shù)據(jù)類(lèi)型名*指針變數(shù)名;
p1=&t1.hour;
//將對(duì)象t1的數(shù)據(jù)成員hour的地址賦給p1,p1指向t1.hourcout<<*p1<<endl;
//輸出t1.hour的值對(duì)象指針133
指向?qū)ο蟪蓡T的指針指向?qū)ο蟪蓡T函數(shù)的指針:1、普通函數(shù):數(shù)據(jù)類(lèi)型名(*指針變數(shù)名)(參數(shù)表列);
2、指向公用成員函數(shù)的指針變數(shù):數(shù)據(jù)類(lèi)型名(類(lèi)::*指針變數(shù)名)(參數(shù)表列);3、使指針變數(shù)指向一個(gè)公用成員函數(shù)的一般形式為:
指針變數(shù)名=&類(lèi)名::成員函數(shù)名;例2.8.1。對(duì)象指針每個(gè)對(duì)象中的數(shù)據(jù)成員都分別佔(zhàn)有存儲(chǔ)空間,如果對(duì)同一個(gè)類(lèi)定義了n個(gè)對(duì)象,則有n組同樣大小的空間以存放n個(gè)對(duì)象中的數(shù)據(jù)成員。但是,不同對(duì)象都調(diào)用同一個(gè)函數(shù)代碼段。當(dāng)不同對(duì)象的成員函數(shù)引用數(shù)據(jù)成員時(shí),怎麼能保證引用的是所指定的對(duì)象的數(shù)據(jù)成員呢?假如,對(duì)於定義的Box類(lèi),定義了3個(gè)同類(lèi)對(duì)象a,b,c。如果有a.volume(),應(yīng)該是引用對(duì)象a中的height,width和length,計(jì)算出長(zhǎng)方體a的體積。如果有b.volume(),應(yīng)該是引用對(duì)象b中的height,width和length,計(jì)算出長(zhǎng)方體b的體積。而現(xiàn)在都用同一個(gè)函數(shù)段,系統(tǒng)怎樣使它分別引用a或b中的數(shù)據(jù)成員呢?this指針在每一個(gè)成員函數(shù)中都包含一個(gè)特殊的指針,這個(gè)指針的名字是固定的,稱(chēng)為this。它是指向本類(lèi)對(duì)象的指針,它的值是當(dāng)前被調(diào)用的成員函數(shù)所在的對(duì)象的起始地址。例如,當(dāng)調(dià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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國(guó)大型三機(jī)一體除濕干燥機(jī)境外融資報(bào)告
- 2024-2030年中國(guó)型鋼行業(yè)產(chǎn)量預(yù)測(cè)及投資規(guī)模分析報(bào)告
- 2024-2030年中國(guó)地質(zhì)錘行業(yè)應(yīng)用動(dòng)態(tài)與前景趨勢(shì)預(yù)測(cè)報(bào)告
- 2024-2030年中國(guó)呼吸麻醉機(jī)行業(yè)發(fā)展形勢(shì)及投資潛力研究報(bào)告
- 2024-2030年中國(guó)雙桿掛燙機(jī)行業(yè)銷(xiāo)售狀況及營(yíng)銷(xiāo)渠道策略報(bào)告
- 集團(tuán)公司危險(xiǎn)作業(yè)指導(dǎo)手冊(cè) 第15項(xiàng)-高輻射作業(yè)安全指導(dǎo)手冊(cè)
- 2024年度企業(yè)勞動(dòng)合同勞動(dòng)合同續(xù)簽及變更管理規(guī)范6篇
- 2024年環(huán)保設(shè)備與鋼材交易之居間委托合同
- 2024年房地產(chǎn)開(kāi)發(fā)項(xiàng)目投資入股合同范本3篇
- 2024年度教育產(chǎn)業(yè)聯(lián)營(yíng)合作協(xié)議書(shū)3篇
- 圖文轉(zhuǎn)換-圖表(小題訓(xùn)練)(解析版)-2025年部編版中考語(yǔ)文一輪復(fù)習(xí)
- 七上語(yǔ)文期末考試復(fù)習(xí)計(jì)劃表
- 2024兒童青少年抑郁治療與康復(fù)痛點(diǎn)調(diào)研報(bào)告 -基于患者家長(zhǎng)群體的調(diào)研
- 大數(shù)據(jù)+治理智慧樹(shù)知到期末考試答案章節(jié)答案2024年廣州大學(xué)
- 江蘇省建筑與裝飾工程計(jì)價(jià)定額(2014)電子表格版
- 山東省煙臺(tái)市2023-2024學(xué)年高二上學(xué)期期末考試數(shù)學(xué)試卷(含答案)
- 2024年中國(guó)鐵路南寧局集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 國(guó)家開(kāi)放大學(xué)化工節(jié)能課程-復(fù)習(xí)資料期末復(fù)習(xí)題
- GB 18613-2020 電動(dòng)機(jī)能效限定值及能效等級(jí)
- 小學(xué)寫(xiě)字閱讀考核實(shí)施方案
- 起重機(jī)傳動(dòng)裝置的設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論