版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
面向?qū)ο蠹夹g(shù)概述2面向?qū)ο蠹夹g(shù)的基本概念面向?qū)ο蠹夹g(shù)是一種以對(duì)象為基礎(chǔ),以事件或消息來(lái)驅(qū)動(dòng)對(duì)象執(zhí)行處理的程式設(shè)計(jì)技術(shù)。
面向?qū)ο蟪淌皆O(shè)計(jì)從所處理的數(shù)據(jù)入手,以數(shù)據(jù)為中心而不是以功能為中心來(lái)描述系統(tǒng),數(shù)據(jù)相對(duì)於功能而言具有更強(qiáng)的穩(wěn)定性。3面向?qū)ο蟪淌降闹饕Y(jié)構(gòu)特點(diǎn)第一,程式一般由類(lèi)的定義和類(lèi)的使用兩部分組成,在主程序中定義各對(duì)象並規(guī)定它們之間傳遞消息的規(guī)律;第二,程式中的一切操作都是通過(guò)向?qū)ο蟀l(fā)送消息來(lái)實(shí)現(xiàn)的,對(duì)象接到消息後,啟動(dòng)有關(guān)函數(shù)完成相應(yīng)的操作。4對(duì)象的概念(一)面向?qū)ο蠹夹g(shù)認(rèn)為客觀世界是由各種各樣的對(duì)象組成,每種對(duì)象都有各自的內(nèi)部狀態(tài)和運(yùn)動(dòng)規(guī)律,不同對(duì)象間的相互作用和聯(lián)繫就構(gòu)成了各種不同的系統(tǒng),構(gòu)成了客觀世界。對(duì)象是組成一個(gè)系統(tǒng)的基本邏輯單元,是一個(gè)有組織形式的含有資訊的實(shí)體。對(duì)象既可以表示一個(gè)抽象的概念,也可以表示一個(gè)具體的模組,既可以表示軟體,也可以表示硬體。5對(duì)象的概念(二)對(duì)象(Object)由屬性(Attribute)和行為(Action)兩部分組成。屬性是用來(lái)描述對(duì)象靜態(tài)特徵的一個(gè)資料項(xiàng)目。行為是用來(lái)描述對(duì)象動(dòng)態(tài)特徵和行為的一個(gè)操作。對(duì)象是包含客觀世界物體特徵的抽象實(shí)體,是屬性和行為的封裝體。6類(lèi)的確定(一)類(lèi)(Class)是具有相同屬性和行為的一組對(duì)象的集合;類(lèi)為屬於它的全部對(duì)象提供了統(tǒng)一的抽象描述;類(lèi)的內(nèi)部包括屬性和行為兩個(gè)主要部分;類(lèi)是對(duì)象集合的再抽象。劃分原則:尋求一個(gè)大系統(tǒng)中事物的共性,將具有共性的系統(tǒng)成分確定為一個(gè)類(lèi)。7類(lèi)的確定(二)確定某事物是一個(gè)類(lèi)的步驟包括: 第一步,要判斷該事物是否有一個(gè)以上的實(shí)例,如果有,則它是一個(gè)類(lèi);第二步,要判斷類(lèi)的實(shí)例中有沒(méi)有絕對(duì)的不同點(diǎn),如果沒(méi)有,則它是一個(gè)類(lèi)。因?yàn)轭?lèi)的每一個(gè)實(shí)例是相似的,具有相同屬性和行為類(lèi)別結(jié)構(gòu)。不能把一組函數(shù)組合在一起構(gòu)成類(lèi)
!
8消息和事件消息(Message)是描述事件發(fā)生的資訊。消息是對(duì)象之間發(fā)出的行為請(qǐng)求。多個(gè)消息構(gòu)成一個(gè)事件。封裝使對(duì)象成為一個(gè)相對(duì)獨(dú)立的實(shí)體,而消息機(jī)制為它們提供了一個(gè)相互間動(dòng)態(tài)聯(lián)繫的途徑,使它們的行為能互相配合,構(gòu)成一個(gè)有機(jī)的運(yùn)行系統(tǒng)。9面向?qū)ο蠹夹g(shù)的基本特徵抽象性抽象就是忽略事物中與當(dāng)前目標(biāo)無(wú)關(guān)的非本質(zhì)特徵,更充分地注意與當(dāng)前目標(biāo)有關(guān)的本質(zhì)特徵。封裝性封裝就是把對(duì)象的屬性和行為結(jié)合成一個(gè)獨(dú)立的單位,並盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié)。繼承性繼承是一種聯(lián)結(jié)類(lèi)與類(lèi)的層次模型。繼承性是指特殊類(lèi)的對(duì)象擁有其一般類(lèi)的屬性和行為的特性。多態(tài)性多態(tài)是指類(lèi)中同一函數(shù)名對(duì)應(yīng)多個(gè)具有相似功能的不同函數(shù)。多態(tài)性是指可以使用相同的調(diào)用方式來(lái)調(diào)用這些具有不同功能的同名函數(shù)的特性。10三種常用面向?qū)ο蟪淌皆O(shè)計(jì)語(yǔ)言簡(jiǎn)介
混合型面向?qū)ο蟪淌皆O(shè)計(jì)語(yǔ)言C++純面向?qū)ο蟪淌皆O(shè)計(jì)語(yǔ)言Java可視化程式設(shè)計(jì)語(yǔ)言VisualBasic11簡(jiǎn)單的C++程式C++程式由一個(gè)或多個(gè)源代碼檔構(gòu)成。C++的源代碼檔分為兩類(lèi):頭檔和根源程式檔。C++根源程式包括編譯預(yù)處理、程式主體和注釋幾部分。一般將變數(shù)(對(duì)象)、類(lèi)型及類(lèi)的定義、函數(shù)的聲明等放在頭檔(擴(kuò)展名為.h);而將使用這些變數(shù)或函數(shù)的程式放在另一個(gè)檔中,成為C++根源程式(擴(kuò)展名.cpp)。12C++程式的編譯過(guò)程分為預(yù)處理和正式編譯兩個(gè)步驟。在編譯C++程式時(shí),編譯系統(tǒng)中的預(yù)處理模組首先根據(jù)預(yù)處理命令對(duì)根源程式進(jìn)行適當(dāng)?shù)募庸?,然後再正式編譯。程式主體就是main函數(shù)。每一個(gè)C++根源程式都必須且只能有一個(gè)main函數(shù),作為程式的入口。注釋是程式員為程式語(yǔ)句所做的說(shuō)明,是提高程式可讀性的一種手段。注釋一般分為兩種:序言性注釋和注解性注釋。13數(shù)據(jù)類(lèi)型和運(yùn)算式空類(lèi)型void整型int字元型實(shí)型邏輯型bool單字符型char寬字元型w_char單精確度型float雙精度型double指針type*結(jié)構(gòu)struct枚舉enum類(lèi)class非基本數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型基本數(shù)據(jù)類(lèi)型聯(lián)合union數(shù)組type[]14常量在程式運(yùn)行過(guò)程中,值不能被改變的量稱(chēng)為常量。常量定義格式為:const<數(shù)據(jù)類(lèi)型><常量>=<運(yùn)算式>;15變數(shù)在程式運(yùn)行過(guò)程中,值可以被改變的量稱(chēng)為變數(shù)。在C++中,任何一個(gè)變數(shù)在被使用之前必須被定義。定義格式為:<類(lèi)型><變數(shù)名表>;16指針和引用指針也是一種變數(shù),指針變數(shù)專(zhuān)門(mén)用來(lái)存放其他數(shù)據(jù)在內(nèi)存的地址。是一種間接訪問(wèn)變數(shù)或?qū)ο蟮姆椒?。引用是某個(gè)變數(shù)或?qū)ο蟮膭e名,是另一種訪問(wèn)變數(shù)或?qū)ο蟮姆椒ā?lt;類(lèi)型>*<變數(shù)>;<類(lèi)型>&<引用名>=<變數(shù)名或?qū)ο竺?gt;;17數(shù)組數(shù)組是一個(gè)由多個(gè)同類(lèi)型變數(shù)組成的集合。數(shù)組元素被引用的格式:<類(lèi)型><數(shù)組名>[<常量運(yùn)算式>][[<常量運(yùn)算式>]…];<數(shù)組名>[<下標(biāo)>][[<下標(biāo)>]…]18結(jié)構(gòu)體C++允許用戶(hù)把邏輯上相關(guān)聯(lián)的數(shù)據(jù)組織起來(lái),作為整體使用,這就是結(jié)構(gòu)體數(shù)據(jù)類(lèi)型。struct<結(jié)構(gòu)類(lèi)型變數(shù)名>{<類(lèi)型> <成員名>;<類(lèi)型> <成員名>;…};19運(yùn)算符C++運(yùn)算符包括算術(shù)運(yùn)算符(+、-、*、/、%)、關(guān)係運(yùn)算符(>、<、==、>=、<=、!=)、邏輯運(yùn)算符(&&、||、!)、賦值運(yùn)算符(=)、複合賦值運(yùn)算符(+=、-=、*=、/=、%=等)、自加運(yùn)算符(++)、自減運(yùn)算符(--)、位運(yùn)算符(&、^、|、~、<<、>>等)、條件運(yùn)算符(?:)、逗號(hào)運(yùn)算符(,)、作用域區(qū)分符(::)等。20運(yùn)算式運(yùn)算式是由運(yùn)算符和運(yùn)算元組成的式子。運(yùn)算元包含了常量、變數(shù)、函數(shù)和其他一些命名的識(shí)別字。算術(shù)運(yùn)算式關(guān)係運(yùn)算式邏輯運(yùn)算式條件運(yùn)算式賦值運(yùn)算式逗號(hào)運(yùn)算式21動(dòng)態(tài)存儲(chǔ)分配堆允許程式在運(yùn)行時(shí)(而不是在編譯時(shí))申請(qǐng)某個(gè)大小的記憶體空間。如果要在堆中分配記憶體空間,必須使用特定的函數(shù)或操作符。另外,若不再需要使用的動(dòng)態(tài)記憶體空間則必須釋放。new運(yùn)算符從堆中分配一塊與<類(lèi)型>相適應(yīng)的存儲(chǔ)空間,若分配成功,將這塊記憶體空間的首地址存入<指針>,否則置<指針>的值為NULL(空指針值,即0)。delete操作符用來(lái)釋放<指針>指向的動(dòng)態(tài)存儲(chǔ)空間。22程式的基本控制結(jié)構(gòu)按照結(jié)構(gòu)化程式設(shè)計(jì)方法的觀點(diǎn),任何演算法功能都可以通過(guò)由程式模組組成的三種基本程式結(jié)構(gòu)的組合來(lái)實(shí)現(xiàn),它們是順序結(jié)構(gòu)、分支結(jié)構(gòu)、迴圈結(jié)構(gòu)
23函數(shù)一個(gè)C++程式是由若干個(gè)根源程式檔構(gòu)成,而一個(gè)根源程式檔是由若干個(gè)函數(shù)構(gòu)成,每個(gè)函數(shù)具有相對(duì)獨(dú)立的功能。一個(gè)根源程式可以由若干函數(shù)構(gòu)成,但有且僅有一個(gè)main函數(shù),函數(shù)與函數(shù)之間通過(guò)輸入?yún)?shù)和返回值來(lái)聯(lián)繫。根源程式從main函數(shù)開(kāi)始執(zhí)行直到main函數(shù)結(jié)束,其他函數(shù)都是由main函數(shù)直接或間接地調(diào)用執(zhí)行。24函數(shù)定義定義函數(shù)的一般格式:<返回值類(lèi)型><函數(shù)名>(<參數(shù)列表>){
<函數(shù)體>}25函數(shù)原型函數(shù)原型即函數(shù)聲明,用來(lái)描述函數(shù)的返回值和參數(shù)類(lèi)型。C++規(guī)定:名字必須先說(shuō)明後使用。因此,當(dāng)一個(gè)函數(shù)調(diào)用出現(xiàn)在函數(shù)定義之前,必須先對(duì)函數(shù)進(jìn)行原型說(shuō)明。函數(shù)原型的功能:確定函數(shù)返回值的類(lèi)型;確定函數(shù)參數(shù)的類(lèi)型和個(gè)數(shù);函數(shù)名代表該函數(shù)的函數(shù)體以及函數(shù)完成的功能。<返回值類(lèi)型><函數(shù)名>(<參數(shù)表>);26函數(shù)調(diào)用C++程式由若干函數(shù)構(gòu)成,各個(gè)函數(shù)的執(zhí)行通過(guò)函數(shù)的調(diào)用來(lái)完成的。在調(diào)用函數(shù)時(shí),大多數(shù)情況下,主調(diào)函數(shù)和被調(diào)函數(shù)之間有數(shù)據(jù)傳遞關(guān)係。函數(shù)之間的數(shù)據(jù)傳遞是靠函數(shù)參數(shù)進(jìn)行,而對(duì)無(wú)參數(shù)函數(shù)的調(diào)用,沒(méi)有數(shù)據(jù)傳遞。在定義函數(shù)時(shí),函數(shù)名後面括弧內(nèi)的變數(shù)名為“形式參數(shù)”(形參)。在調(diào)用函數(shù)時(shí),函數(shù)名後面括弧內(nèi)的運(yùn)算式為“實(shí)際參數(shù)”(實(shí)參)。27引入函數(shù)後,使用者只需要知道函數(shù)的功能和使用方法,而不必關(guān)心函數(shù)的內(nèi)部代碼,從而方便源代碼的共用;使用函數(shù),也可減少程式的冗餘和程式的目標(biāo)代碼。28內(nèi)聯(lián)函數(shù)函數(shù)調(diào)用有一定的時(shí)間和空間開(kāi)銷(xiāo),影響程式的執(zhí)行效率。特別是對(duì)於一些函數(shù)體代碼不是很大,但又頻繁地被調(diào)用的函數(shù),則引入內(nèi)聯(lián)函數(shù)。在程式編譯時(shí),編譯系統(tǒng)將程式中出現(xiàn)內(nèi)聯(lián)函數(shù)調(diào)用的地方用函數(shù)體進(jìn)行替換。引入內(nèi)聯(lián)函數(shù)可以提高程式的運(yùn)行效率,節(jié)省調(diào)用函數(shù)的時(shí)間開(kāi)銷(xiāo),是一種以空間換時(shí)間的方案。
內(nèi)聯(lián)函數(shù)的一般定義格式:inline返回值類(lèi)型函數(shù)名(<參數(shù)列表>){函數(shù)體}29帶缺省參數(shù)的函數(shù)C++允許在定義函數(shù)時(shí)給其中的某個(gè)或某些形參指定缺省值(定義函數(shù)參數(shù)時(shí)賦初值),這樣,當(dāng)發(fā)生函數(shù)調(diào)用時(shí),若指定實(shí)參值則用該值;如果省略了對(duì)應(yīng)位置上的實(shí)參的值時(shí),則在執(zhí)行被調(diào)函數(shù)時(shí),以該形參的缺省值進(jìn)行運(yùn)算。引入缺省參數(shù)的目是為了讓編程簡(jiǎn)單,讓編譯系統(tǒng)做更多的檢查錯(cuò)誤工作,同時(shí)增強(qiáng)了函數(shù)的可重用性。30函數(shù)重載函數(shù)重載是指一個(gè)函數(shù)可以和同一作用域中的其他函數(shù)具有相同的名字,但這些同名函數(shù)的參數(shù)類(lèi)型、參數(shù)個(gè)數(shù)、返回值、函數(shù)功能可以完全不同。編譯系統(tǒng)將根據(jù)函數(shù)參數(shù)的類(lèi)型和個(gè)數(shù)來(lái)判斷使用哪一個(gè)函數(shù)。31作用域識(shí)別字有效性的範(fàn)圍稱(chēng)識(shí)別字的作用域,又稱(chēng)為識(shí)別字的“可見(jiàn)性”。識(shí)別字在某範(fàn)圍內(nèi)是“可見(jiàn)的”是指在該範(fàn)圍內(nèi)可以進(jìn)行訪問(wèn)操作。C++的作用域範(fàn)圍為:局部作用域(塊作用域)函數(shù)作用域函數(shù)原型作用域檔作用域類(lèi)作用域32數(shù)據(jù)類(lèi)型C語(yǔ)言中內(nèi)置數(shù)據(jù)類(lèi)型示例:--int可以對(duì)整數(shù)有:+,-,*,/,求模操作%.
可以用sizeof(),來(lái)求得其在特定的平臺(tái)上的大小,如4位元組.構(gòu)成數(shù)據(jù)類(lèi)型的兩大要素:--存放數(shù)據(jù)對(duì)象需要的記憶體大小
--可使用得數(shù)據(jù)對(duì)象的操作或方法33自定義數(shù)組數(shù)據(jù)類(lèi)型C++對(duì)數(shù)組類(lèi)型提供了內(nèi)置支持,但只限於”只讀寫(xiě)單個(gè)元素”的機(jī)制需要的功能可能有:--把一個(gè)數(shù)組副賦值給另一個(gè)數(shù)組;--對(duì)兩個(gè)數(shù)組進(jìn)行比較;--取得數(shù)組的大小;--數(shù)組內(nèi)元素的排序,等等34類(lèi)
從語(yǔ)言角度來(lái)說(shuō),類(lèi)是一種新的數(shù)據(jù)類(lèi)型,而對(duì)象是具有這種類(lèi)型的變數(shù)。類(lèi)是一種將數(shù)據(jù)和作用於這些數(shù)據(jù)上的函數(shù)組合在一起的複雜數(shù)據(jù)類(lèi)型,是可重用的基本單元。一個(gè)類(lèi)就是一個(gè)用戶(hù)自定義數(shù)據(jù)類(lèi)型。類(lèi)是面向?qū)ο蟪淌皆O(shè)計(jì)的核心,利用它可以實(shí)現(xiàn)對(duì)象的抽象、數(shù)據(jù)和操作的封裝以及資訊的隱蔽。35類(lèi)定義類(lèi)定義一般分為說(shuō)明部分和實(shí)現(xiàn)部分。說(shuō)明部分是說(shuō)明該類(lèi)中的成員,實(shí)現(xiàn)部分是對(duì)成員函數(shù)的定義。類(lèi)定義的一般格式如下class<類(lèi)名>{public:<數(shù)據(jù)成員或成員函數(shù)的聲明>;private:<數(shù)據(jù)成員或成員函數(shù)的聲明>;說(shuō)明部分protected:<數(shù)據(jù)成員或成員函數(shù)的聲明>;};<各個(gè)成員函數(shù)的定義>實(shí)現(xiàn)部分36訪問(wèn)控制訪問(wèn)許可權(quán)有三種類(lèi)型:
private、public和protected。三種訪問(wèn)許可權(quán)的成員與出現(xiàn)的先後順序無(wú)關(guān),並且允許多次出現(xiàn),但是一個(gè)成員只能具有一種訪問(wèn)屬性。37成員函數(shù)的實(shí)現(xiàn)成員函數(shù)是類(lèi)中描述行為的成員,同時(shí)也是對(duì)封裝的數(shù)據(jù)進(jìn)行操作的惟一途徑。類(lèi)定義的格式中,一般在類(lèi)中說(shuō)明成員函數(shù)原型,在類(lèi)外進(jìn)行成員函數(shù)的具體實(shí)現(xiàn),<各個(gè)成員函數(shù)的定義>是類(lèi)的實(shí)現(xiàn)部分。同時(shí),如果成員函數(shù)已經(jīng)在類(lèi)中定義,則不需要在類(lèi)外實(shí)現(xiàn)。需要注意的是,在類(lèi)中定義的成員函數(shù)自動(dòng)成為內(nèi)聯(lián)函數(shù)。38若在類(lèi)體外實(shí)現(xiàn),則需要使用作用域運(yùn)算符“::”,用它來(lái)標(biāo)識(shí)某個(gè)成員函數(shù)是屬於哪個(gè)類(lèi)的,其定義格式如下:<返回值類(lèi)型><類(lèi)名>::<成員函數(shù)名>(<參數(shù)表>){<函數(shù)體>}39
對(duì)象對(duì)象的定義格式與普通變數(shù)相同。定義格式如下:<類(lèi)名><對(duì)象名表>;
其中,<對(duì)象名表>中可以有一個(gè)或多個(gè)對(duì)象名。當(dāng)有多個(gè)對(duì)象名時(shí),用逗號(hào)分隔。<對(duì)象名表>中還可以是指向?qū)ο蟮闹羔樏蛞妹?,也可以是?duì)象數(shù)組名。40類(lèi)成員的訪問(wèn)定義了類(lèi)及其對(duì)象,就可以通過(guò)對(duì)象來(lái)使用其公有成員,從而達(dá)到對(duì)對(duì)象內(nèi)部屬性的訪問(wèn)和修改。對(duì)象對(duì)其成員的訪問(wèn)有圓點(diǎn)訪問(wèn)形式和指針訪問(wèn)形式。<對(duì)象名>.<公有成員><對(duì)象指針名>-><公有成員>41構(gòu)造函數(shù)和析構(gòu)函數(shù)類(lèi)描述了一類(lèi)對(duì)象的共同特徵,而對(duì)象是類(lèi)的特例。每個(gè)對(duì)象區(qū)別於其他對(duì)象的地方就是依靠它自身屬性,即數(shù)據(jù)成員的值。對(duì)象在定義的時(shí)候可以進(jìn)行數(shù)據(jù)成員的設(shè)置,稱(chēng)為對(duì)象的初始化。同樣,在對(duì)象使用結(jié)束時(shí),還可以進(jìn)行一些相關(guān)的清理工作。C++中對(duì)象的初始化和清理工作,分別由兩個(gè)特殊的成員函數(shù)來(lái)完成,它們就是構(gòu)造函數(shù)和析構(gòu)函數(shù)。42構(gòu)造函數(shù)構(gòu)造函數(shù)的功能是在定義對(duì)象時(shí)被編譯系統(tǒng)自動(dòng)調(diào)用來(lái)創(chuàng)建對(duì)象並初始化對(duì)象。其定義格式如下:<類(lèi)名>::<類(lèi)名>(<參數(shù)表>){
<函數(shù)體>}43構(gòu)造函數(shù)的特點(diǎn)構(gòu)造函數(shù)是成員函數(shù),函數(shù)體可寫(xiě)在類(lèi)體內(nèi),也可寫(xiě)在類(lèi)體外。構(gòu)造函數(shù)的函數(shù)名與類(lèi)名相同,且不指定返回值類(lèi)型,它有隱含的返回值,該值由編譯系統(tǒng)內(nèi)部使用。構(gòu)造函數(shù)可以沒(méi)有參數(shù),也可以有參數(shù),因此可以重載,即可以定義參數(shù)不同的多個(gè)構(gòu)造函數(shù)。每個(gè)類(lèi)都必須有一個(gè)構(gòu)造函數(shù)。如果類(lèi)中沒(méi)有顯式定義構(gòu)造函數(shù),則編譯系統(tǒng)自動(dòng)生成一個(gè)缺省形式的構(gòu)造函數(shù),作為該類(lèi)的公有成員。程式中不能直接調(diào)用構(gòu)造函數(shù),在定義對(duì)象時(shí)編譯系統(tǒng)自動(dòng)調(diào)用構(gòu)造函數(shù)。44析構(gòu)函數(shù)析構(gòu)函數(shù)的功能是在對(duì)象的生存期即將結(jié)束的時(shí)刻,由編譯系統(tǒng)自動(dòng)調(diào)用來(lái)完成一些清理工作。它的調(diào)用完成之後,對(duì)象也就消失了,相應(yīng)的記憶體空間也被釋放。析構(gòu)函數(shù)也是類(lèi)的一個(gè)公有成員函數(shù),它的名稱(chēng)是由類(lèi)名前面加“~”構(gòu)成,也不指定返回值類(lèi)型。和構(gòu)造函數(shù)不同的是,析構(gòu)函數(shù)不能有參數(shù),因此不能重載。45其定義格式如下:<類(lèi)名>::~<類(lèi)名>(){
<函數(shù)體>}46析構(gòu)函數(shù)的特點(diǎn)析構(gòu)函數(shù)是成員函數(shù),函數(shù)體可寫(xiě)在類(lèi)體內(nèi),也可以寫(xiě)在類(lèi)體外。析構(gòu)函數(shù)的函數(shù)名與類(lèi)名相同,並在前面加“~”字元,用來(lái)與構(gòu)造函數(shù)加以區(qū)別。析構(gòu)函數(shù)不指定返回值類(lèi)型。析構(gòu)函數(shù)沒(méi)有參數(shù),因此不能重載。一個(gè)類(lèi)中只能定義一個(gè)析構(gòu)函數(shù)。每個(gè)類(lèi)都必須有一個(gè)析構(gòu)函數(shù)。如果類(lèi)中沒(méi)有顯式定義析構(gòu)函數(shù),則編譯系統(tǒng)自動(dòng)生成一個(gè)缺省形式的析構(gòu)函數(shù),作為該類(lèi)的公有成員。析構(gòu)函數(shù)在對(duì)象生存期結(jié)束前由編譯系統(tǒng)自動(dòng)調(diào)用。47拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),它的功能是用一個(gè)已知的對(duì)象來(lái)初始化一個(gè)被定義的同類(lèi)的對(duì)象??截悩?gòu)造函數(shù)的定義格式如下:48class<類(lèi)名>{public:
<類(lèi)名>(<參數(shù)表>);
//構(gòu)造函數(shù)
<類(lèi)名>(const<類(lèi)名>&<對(duì)象名>);//拷貝構(gòu)造函數(shù)…};<類(lèi)名>::<類(lèi)名>(const<類(lèi)名>&<對(duì)象名>);//拷貝構(gòu)造函數(shù)的實(shí)現(xiàn){<函數(shù)體>}49拷貝構(gòu)造函數(shù)的特點(diǎn)拷貝構(gòu)造函數(shù)是成員函數(shù),函數(shù)體可寫(xiě)在類(lèi)體內(nèi),也可以寫(xiě)在類(lèi)體外。拷貝構(gòu)造函數(shù)名與類(lèi)名相同,並且也不指定返回值類(lèi)型??截悩?gòu)造函數(shù)只有一個(gè)參數(shù),並且是對(duì)同類(lèi)對(duì)象的引用。每個(gè)類(lèi)都必須有一個(gè)拷貝構(gòu)造函數(shù)。如果類(lèi)中沒(méi)有顯式定義拷貝構(gòu)造函數(shù),則編譯系統(tǒng)自動(dòng)生成一個(gè)缺省形式的拷貝構(gòu)造函數(shù),作為該類(lèi)的公有成員。拷貝構(gòu)造函數(shù)在三種情況下由編譯系統(tǒng)自動(dòng)調(diào)用。50靜態(tài)成員靜態(tài)成員是解決同一個(gè)類(lèi)的不同對(duì)象之間的數(shù)據(jù)和函數(shù)共用問(wèn)題。靜態(tài)成員是類(lèi)的所有對(duì)象共用的成員,而不是某個(gè)對(duì)象的成員,它在對(duì)象中不占存儲(chǔ)空間,是屬於整個(gè)類(lèi)的成員。靜態(tài)成員分為靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)。其定義格式為:static
<靜態(tài)成員的定義>;51靜態(tài)數(shù)據(jù)成員的初始化靜態(tài)數(shù)據(jù)成員必須進(jìn)行初始化。在程式一開(kāi)始運(yùn)行時(shí)靜態(tài)數(shù)據(jù)成員就必須存在,因?yàn)樵诔淌竭\(yùn)行中要調(diào)用,所以靜態(tài)數(shù)據(jù)成員不能在任何函數(shù)內(nèi)分配空間和初始化。最好在類(lèi)的實(shí)現(xiàn)部分中完成靜態(tài)數(shù)據(jù)成員的初始化。靜態(tài)數(shù)據(jù)成員初始化與一般數(shù)據(jù)成員初始化不同,其格式如下:<數(shù)據(jù)類(lèi)型><類(lèi)名>::<靜態(tài)數(shù)據(jù)成員名>=<值>;52靜態(tài)成員的調(diào)用調(diào)用靜態(tài)成員時(shí),採(cǎi)用如下格式:<類(lèi)名>::<靜態(tài)成員>53友元根據(jù)封裝性,一般將類(lèi)中的數(shù)據(jù)成員聲明為私有成員,外部可以通過(guò)類(lèi)的公有成員函數(shù)對(duì)私有成員進(jìn)行訪問(wèn)。但有時(shí)類(lèi)體外的一些函數(shù)需要直接訪問(wèn)類(lèi)的數(shù)據(jù)成員,又不改變其數(shù)據(jù)成員的訪問(wèn)許可權(quán),這時(shí),需要定義友元。54友元的作用友元提供了不同類(lèi)或?qū)ο蟮某蓡T函數(shù)之間、類(lèi)的成員函數(shù)與普通函數(shù)之間進(jìn)行數(shù)據(jù)共用的機(jī)制。友元可以訪問(wèn)類(lèi)中所有成員,但不是類(lèi)的成員。。友元雖然不是類(lèi)的成員,但它是類(lèi)的朋友,可以直接訪問(wèn)類(lèi)的所有成員。55友元的定義如果友元是普通函數(shù)或另一個(gè)類(lèi)的成員函數(shù),稱(chēng)為友元函數(shù);如果友元是一個(gè)類(lèi),則稱(chēng)為友元類(lèi),友元類(lèi)的所有成員函數(shù)都成為友元函數(shù)。友元函數(shù)和友元類(lèi)在被訪問(wèn)的類(lèi)中聲明,其格式分別如下:friend<返回值類(lèi)型><函數(shù)名>(<參數(shù)表>);friend<類(lèi)名>;56繼承的概念類(lèi)的繼承就是根據(jù)一個(gè)類(lèi)創(chuàng)建一個(gè)新類(lèi)的過(guò)程。新類(lèi)自動(dòng)具有已有類(lèi)的所有成員,並可根據(jù)需要添加更多的成員。換個(gè)角度,從已有類(lèi)產(chǎn)生新類(lèi)的過(guò)程就是類(lèi)的派生。通常將用來(lái)派生新類(lèi)的類(lèi)稱(chēng)為基類(lèi),又稱(chēng)為父類(lèi),而將派生出來(lái)的新類(lèi)稱(chēng)為派生類(lèi),又稱(chēng)為子類(lèi)。57派生類(lèi)派生類(lèi)是特殊的基類(lèi),基類(lèi)是派生類(lèi)的抽象描述。派生類(lèi)繼承了基類(lèi)的所有特性,但不等同於基類(lèi),否則就沒(méi)有派生的必要了。繼承的作用就是體現(xiàn)特殊與一般的關(guān)係,尋找有共性的事物間的差異,求其發(fā)展;另一個(gè)作用是代碼重用,從基類(lèi)派生子類(lèi),無(wú)需修改基類(lèi)的代碼,就可以直接調(diào)用基類(lèi)的成員,而自己的代碼只需在派生類(lèi)中實(shí)現(xiàn)即可。58派生類(lèi)的定義class<派生類(lèi)名>:<繼承方式><基類(lèi)名>{<派生類(lèi)新定義成員>};其中,<繼承方式>有三種:公有繼承、私有繼承和保護(hù)繼承,分別用關(guān)鍵字public、private和protected表示。缺省情況下為私有繼承。59派生類(lèi)的生成過(guò)程分析派生新類(lèi)的過(guò)程可知,派生類(lèi)的生成經(jīng)歷了三個(gè)步驟:吸收基類(lèi)成員改造基類(lèi)成員添加派生類(lèi)新成員60訪問(wèn)許可權(quán)控制不論哪種繼承方式,派生類(lèi)新定義成員均不能直接訪問(wèn)基類(lèi)的私有成員,只能通過(guò)基類(lèi)的公有成員函數(shù)或保護(hù)成員函數(shù)訪問(wèn)基類(lèi)的私有數(shù)據(jù)成員,而基類(lèi)的私有成員函數(shù)根本就不會(huì)繼承,更談不上使用。所以,除非僅限於本類(lèi)使用,否則,一般不將成員函數(shù)定義為私有成員。61公有繼承的訪問(wèn)許可權(quán)控制類(lèi)的繼承方式為公有繼承時(shí),在派生類(lèi)中,繼承的基類(lèi)的公有成員和保護(hù)成員的訪問(wèn)屬性不變,而對(duì)基類(lèi)的私有成員不可訪問(wèn)。即基類(lèi)的公有成員和保護(hù)成員被繼承後分別作為派生類(lèi)的公有成員和保護(hù)成員,派生類(lèi)的成員可以直接訪問(wèn)它們,而派生類(lèi)的成員無(wú)法訪問(wèn)基類(lèi)的私有成員。在類(lèi)外,派生類(lèi)的對(duì)象可以訪問(wèn)繼承下來(lái)的基類(lèi)公有成員。62私有繼承的訪問(wèn)許可權(quán)控制當(dāng)類(lèi)的繼承方式為私有繼承時(shí),在派生類(lèi)中,繼承的基類(lèi)的公有成員和保護(hù)成員變?yōu)樗接谐蓡T,而對(duì)基類(lèi)的私有成員不可訪問(wèn)。即基類(lèi)的公有成員和保護(hù)成員被繼承以後作為派生類(lèi)的私有成員,派生類(lèi)的成員可以直接訪問(wèn)它們,而派生類(lèi)的成員無(wú)法訪問(wèn)基類(lèi)的私有成員。在類(lèi)外,派生類(lèi)的對(duì)象無(wú)法訪問(wèn)基類(lèi)的所有成員。因此,私有繼承之後,基類(lèi)的成員再也無(wú)法在以後的派生類(lèi)中發(fā)揮作用,出於這種原因,一般不使用私有繼承方式。63保護(hù)繼承的訪問(wèn)許可權(quán)控制當(dāng)類(lèi)的繼承方式為保護(hù)繼承時(shí),在派生類(lèi)中,繼承的基類(lèi)的公有成員和保護(hù)成員變?yōu)楸Wo(hù)成員,而對(duì)基類(lèi)的私有成員不可訪問(wèn)。即基類(lèi)的公有成員和保護(hù)成員被繼承以後作為派生類(lèi)的保護(hù)成員,派生類(lèi)的成員可以直接訪問(wèn)它們,而派生類(lèi)的成員無(wú)法訪問(wèn)基類(lèi)的私有成員。在類(lèi)外,派生類(lèi)的對(duì)象無(wú)法訪問(wèn)基類(lèi)的所有成員。64派生類(lèi)的構(gòu)造函數(shù)派生類(lèi)構(gòu)造函數(shù)的一般格式如下:<派生類(lèi)名>(<總參數(shù)表>):<基類(lèi)名>(<參數(shù)表1>),<子對(duì)象名>(<參數(shù)表2>){<派生類(lèi)數(shù)據(jù)成員的初始化>};65派生類(lèi)的析構(gòu)函數(shù)
由於基類(lèi)的析構(gòu)函數(shù)也不能被繼承,因此,派生類(lèi)的析構(gòu)函數(shù)必須通過(guò)調(diào)用基類(lèi)的析構(gòu)函數(shù)來(lái)做基類(lèi)的一些清理工作。調(diào)用順序是:先調(diào)用派生類(lèi)的析構(gòu)函數(shù),再調(diào)用對(duì)象成員類(lèi)的析構(gòu)函數(shù)(如果有對(duì)象成員),最後調(diào)用基類(lèi)的析構(gòu)函數(shù),其順序與調(diào)用構(gòu)造函數(shù)的順序相反。66多繼承根據(jù)派生類(lèi)繼承基類(lèi)的個(gè)數(shù),將繼承分為單繼承和多繼承。當(dāng)派生類(lèi)只有一個(gè)基類(lèi)時(shí)稱(chēng)為單繼承,以上所討論的都是單繼承。當(dāng)派生類(lèi)有多個(gè)基類(lèi)時(shí)稱(chēng)為多繼承。單繼承可以看作是多繼承的一個(gè)特例,多繼承可以看作是多個(gè)單繼承的組合,它們有很多相同特性。67多繼承的定義格式
多繼承可以看作是單繼承的擴(kuò)展,派生類(lèi)與每個(gè)基類(lèi)之間的關(guān)係可以看作是一個(gè)單繼承。在C++中,多繼承的定義格式如下:class<派生類(lèi)名>:<繼承方式><基類(lèi)名1>,…,<繼承方式><基類(lèi)名n>{<派生類(lèi)新定義成員>};68多繼承的構(gòu)造函數(shù)<派生類(lèi)名>(<總參數(shù)表>):<基類(lèi)名1>(<參數(shù)表1>),…,<基類(lèi)名n>(<參數(shù)表n>){<派生類(lèi)數(shù)據(jù)成員的初始化>};69虛基類(lèi)在派生類(lèi)中對(duì)基類(lèi)成員的訪問(wèn)應(yīng)該是唯一的。但是,在多繼承方式下,可能造成對(duì)基類(lèi)中某個(gè)成員的訪問(wèn)出現(xiàn)不唯一的情況,稱(chēng)為對(duì)基類(lèi)成員訪問(wèn)的二義性問(wèn)題。解決的辦法是用作用域運(yùn)算符“::”進(jìn)行限定,另外還可以設(shè)置虛基類(lèi)來(lái)解決此問(wèn)題。70虛基類(lèi)的定義格式class<派生類(lèi)名>:virtual<繼承方式><共同基類(lèi)名>71多態(tài)性的概念多態(tài)性是指具有相似功能的不同函數(shù)使用同一個(gè)名稱(chēng)來(lái)實(shí)現(xiàn),從而可以使用相同的調(diào)用方式來(lái)調(diào)用這些具有不同功能的同名函數(shù)的特性。C++的多態(tài)性是指對(duì)同一條消息,被不同類(lèi)型的對(duì)象接收將產(chǎn)生不同的行為。多態(tài)性是實(shí)現(xiàn)“一種介面,多種方法”的技術(shù)。這裏的“一種介面”是指相同函數(shù)名,而“多種方法”是指多種函數(shù)實(shí)現(xiàn)。72多態(tài)的類(lèi)型C++支持的多態(tài)可以分為四種類(lèi)型:重載多態(tài)強(qiáng)制多態(tài)包含多態(tài)參數(shù)多態(tài)73聯(lián)編多態(tài)性的實(shí)現(xiàn)過(guò)程中,確定調(diào)用哪個(gè)同名函數(shù)的過(guò)程就是聯(lián)編(binding),又稱(chēng)綁定。聯(lián)編是指電腦程式自身彼此關(guān)聯(lián)的過(guò)程,也就是把一個(gè)識(shí)別字名和一個(gè)存儲(chǔ)地址聯(lián)繫在一起的過(guò)程。用面向?qū)ο蟮男g(shù)語(yǔ)講,就是把一條消息和一個(gè)對(duì)象的方法相結(jié)合的過(guò)程。按照聯(lián)編進(jìn)行的階段的不同,可以分為靜態(tài)聯(lián)編和動(dòng)態(tài)聯(lián)編,這兩種聯(lián)編過(guò)程分別對(duì)應(yīng)著多態(tài)性的兩種實(shí)現(xiàn)方式。74靜態(tài)聯(lián)編在編譯階段完成的聯(lián)編稱(chēng)為靜態(tài)聯(lián)編。在編譯過(guò)程中,編譯系統(tǒng)可以根據(jù)類(lèi)型匹配等特徵來(lái)確定程式中調(diào)用操作與執(zhí)行某個(gè)同名函數(shù)實(shí)現(xiàn)之間的關(guān)係,即確定某一個(gè)同名函數(shù)到底是要調(diào)用哪一段函數(shù)實(shí)現(xiàn)代碼。函數(shù)重載和運(yùn)算符重載就是通過(guò)靜態(tài)聯(lián)編方式實(shí)現(xiàn)的編譯時(shí)的多態(tài)的體現(xiàn)。靜態(tài)聯(lián)編的優(yōu)點(diǎn)是函數(shù)調(diào)用速度快、效率較高,缺點(diǎn)是編程不夠靈活75動(dòng)態(tài)聯(lián)編只有在運(yùn)行程式時(shí)才能確定將要調(diào)用的函數(shù)。這種在運(yùn)行階段進(jìn)行的聯(lián)編稱(chēng)為動(dòng)態(tài)聯(lián)編。動(dòng)態(tài)聯(lián)編的優(yōu)點(diǎn)是提供了更好的編程靈活性、問(wèn)題抽象性和程式易維護(hù)性,缺點(diǎn)是與靜態(tài)聯(lián)編相比,函數(shù)調(diào)用速度慢。76虛函數(shù)虛函數(shù)是動(dòng)態(tài)聯(lián)編的基礎(chǔ)。虛函數(shù)是非靜態(tài)的成員函數(shù),經(jīng)過(guò)派生之後,虛函數(shù)在類(lèi)族中可以實(shí)現(xiàn)運(yùn)行時(shí)的多態(tài)性。77虛函數(shù)的聲明虛函數(shù)是一個(gè)在某基類(lèi)中聲明為virtual並在一個(gè)或多個(gè)派生類(lèi)中被重新定義的成員函數(shù)。聲明虛函數(shù)的格式如下:virtual<返回值類(lèi)型><函數(shù)名>(<參數(shù)表>);78虛函數(shù)的使用如果某類(lèi)中的一個(gè)成員函數(shù)被說(shuō)明為虛函數(shù),這就意味著該成員函數(shù)在派生類(lèi)中可能有不同的函數(shù)實(shí)現(xiàn)。當(dāng)使用對(duì)象指針或?qū)ο笠谜{(diào)用虛函數(shù)時(shí),採(cǎi)用動(dòng)態(tài)聯(lián)編方式,即在運(yùn)行時(shí)進(jìn)行關(guān)聯(lián)或綁定。79抽象類(lèi)抽象類(lèi)是一種特殊的類(lèi),專(zhuān)門(mén)作為基類(lèi)派生新類(lèi),自身無(wú)法實(shí)例化,也就是無(wú)法定義抽象類(lèi)的對(duì)象,它為一類(lèi)族提供統(tǒng)一的操作介面。抽象類(lèi)是為了抽象和設(shè)計(jì)的目的而建立的,可以說(shuō),建立抽象類(lèi),就是為了通過(guò)它多態(tài)地使用其中的成員函數(shù)。抽象類(lèi)處?kù)额?lèi)層次的上層,由它派生新類(lèi),然後再實(shí)例化。80純虛函數(shù)在C++中,有一個(gè)僅為該多態(tài)機(jī)制提供一個(gè)介面而沒(méi)有任何實(shí)體定義的函數(shù),被稱(chēng)為純虛函數(shù)。聲明純虛函數(shù)的一般格式如下:virtual<返回值類(lèi)型><函數(shù)名>(<參數(shù)表>)=0;81
抽象類(lèi)抽象類(lèi)只能用作其他類(lèi)的基類(lèi),不能建立抽象類(lèi)對(duì)象。抽象類(lèi)不能用作參數(shù)類(lèi)型、函數(shù)返回值類(lèi)型或顯式轉(zhuǎn)換的類(lèi)型,但可以說(shuō)明指向抽象類(lèi)的指針或引用,該指針或引用可以指向抽象類(lèi)的派生類(lèi),進(jìn)而實(shí)現(xiàn)多態(tài)性。抽象類(lèi)的主要作用是將有關(guān)的派生類(lèi)組織在一個(gè)繼承層次結(jié)構(gòu)中,由抽象類(lèi)為它們提供一個(gè)公共的根,相關(guān)的派生類(lèi)就從這個(gè)根派生出來(lái)。82運(yùn)算符重載運(yùn)算符重載就是賦予系統(tǒng)預(yù)定義的運(yùn)算符多重含義,使同一個(gè)運(yùn)算符作用於不同類(lèi)型的數(shù)據(jù)導(dǎo)致不同的行為。運(yùn)算符重載的實(shí)質(zhì)就是函數(shù)重載。運(yùn)算符重載使得系統(tǒng)預(yù)定義的運(yùn)算符能作用於用戶(hù)自定義類(lèi)型的數(shù)據(jù),進(jìn)行類(lèi)似運(yùn)算。83運(yùn)算符重載規(guī)則C++的運(yùn)算符除了少數(shù)幾個(gè)之外,全部可以重載,而且只能重載已有的運(yùn)算符,不可臆造新的運(yùn)算符。重載之後運(yùn)算符的優(yōu)先順序和結(jié)合性都不會(huì)改變,並且要保持原運(yùn)算符的語(yǔ)法結(jié)構(gòu)。參數(shù)和返回值類(lèi)型可以重新說(shuō)明。運(yùn)算符重載是針對(duì)新類(lèi)型數(shù)據(jù)的實(shí)際需要,對(duì)原有運(yùn)算符進(jìn)行適當(dāng)?shù)母脑?。運(yùn)算符重載有兩種方式:重載為類(lèi)的成員函數(shù)和重載為類(lèi)的友元函數(shù)。84當(dāng)運(yùn)算符重載為類(lèi)的成員函數(shù)時(shí),由於單目運(yùn)算除了對(duì)象以外沒(méi)有其他參數(shù),因此重載“++”和“--”運(yùn)算符,不能區(qū)分是首碼操作還是尾碼操作。C++約定,在參數(shù)表中放上一個(gè)整型參數(shù),表示尾碼運(yùn)算符。85運(yùn)算符重載為成員函數(shù)運(yùn)算符重載為類(lèi)的成員函數(shù)的一般格式如下:其中,operator是定義運(yùn)算符重載函數(shù)的關(guān)鍵字。<參數(shù)表>中最多有一個(gè)形參。<返回值類(lèi)型>operator<運(yùn)算符>(<參數(shù)表>){<函數(shù)體>;}86範(fàn)本是面向?qū)ο蟪淌皆O(shè)計(jì)提高軟體開(kāi)發(fā)效率的一個(gè)重要手段,是C++語(yǔ)言一個(gè)重要特徵。採(cǎi)用範(fàn)本編程使程式員能夠迅速建立具有類(lèi)型安全的類(lèi)庫(kù)集合和函數(shù)集合,它的實(shí)現(xiàn)提高了代碼的重用性,更方便大規(guī)模地軟體開(kāi)發(fā)。本章先介紹了範(fàn)本的概念,再介紹了函數(shù)範(fàn)本和類(lèi)範(fàn)本的定義與使用,以便能正確使用C++系統(tǒng)中標(biāo)準(zhǔn)範(fàn)本庫(kù)STL。87範(fàn)本的概念範(fàn)本作為一種C++語(yǔ)言支持參數(shù)化多態(tài)性的工具,可以為邏輯功能相同而類(lèi)型不同的數(shù)據(jù)程式提供一種代碼共用的機(jī)制。一個(gè)範(fàn)本並非一個(gè)實(shí)實(shí)在在的類(lèi)或函數(shù),僅僅是一個(gè)類(lèi)或函數(shù)的描述,是參數(shù)化的函數(shù)和類(lèi)。範(fàn)本分為函數(shù)範(fàn)本和類(lèi)範(fàn)本,通過(guò)參數(shù)實(shí)例化可以再構(gòu)造出具體的函數(shù)或類(lèi),稱(chēng)為範(fàn)本函數(shù)和範(fàn)本類(lèi)。88函數(shù)範(fàn)本函數(shù)範(fàn)本的定義格式:template<類(lèi)型參數(shù)表><返回值類(lèi)型><函數(shù)名>(<參數(shù)表>){<函數(shù)體>
}89範(fàn)本函數(shù)的生成函數(shù)範(fàn)本是對(duì)一組函數(shù)的描述,它以任意類(lèi)型T為參數(shù)及函數(shù)返回值。它不是一個(gè)實(shí)實(shí)在在的函數(shù),編譯系統(tǒng)並不產(chǎn)生任何執(zhí)行代碼。當(dāng)編譯系統(tǒng)在程式中發(fā)現(xiàn)有與函數(shù)範(fàn)本中相匹配的函數(shù)調(diào)用時(shí),便生成一個(gè)重載函數(shù),該重載函的函數(shù)體與函數(shù)範(fàn)本的函數(shù)體相同。該重載函數(shù)稱(chēng)為範(fàn)本函數(shù)。它是函數(shù)範(fàn)本的一個(gè)具體實(shí)例,只處理一種惟一的數(shù)據(jù)類(lèi)型。90類(lèi)範(fàn)本定義類(lèi)範(fàn)本的一般格式:template<類(lèi)型參數(shù)表>class<類(lèi)範(fàn)本名>{<類(lèi)成員的聲明>};91類(lèi)範(fàn)本中的成員函數(shù)的定義可以放在類(lèi)範(fàn)本的定義體中(此時(shí)與類(lèi)中的成員函數(shù)的定義方法一致)也可以放在類(lèi)範(fàn)本的外部定義成員函數(shù),此時(shí)成員函數(shù)的定義格式如下:template<類(lèi)型參數(shù)表><返回值類(lèi)型><類(lèi)範(fàn)本名><類(lèi)型名表>::<函數(shù)名>(<參數(shù)表>){<函數(shù)體>}92類(lèi)範(fàn)本的使用利用類(lèi)範(fàn)本定義的只是對(duì)類(lèi)的描述,它本身還不是一個(gè)實(shí)實(shí)在在的類(lèi)。要定義類(lèi)範(fàn)本的對(duì)象(即實(shí)例),需要用下列格式的語(yǔ)句:類(lèi)範(fàn)本名<實(shí)際的類(lèi)型>類(lèi)範(fàn)本名<實(shí)際的類(lèi)型><對(duì)象名>[(實(shí)際參數(shù)表)];93標(biāo)準(zhǔn)範(fàn)本庫(kù)STLSTL是C++標(biāo)準(zhǔn)庫(kù)中的重要一員,利用STL開(kāi)發(fā)程式可以提高代碼的重用性,讓程式更加穩(wěn)定,便於維護(hù),提高編寫(xiě)程式的效率。STL是StandardTemplateLibrary的縮寫(xiě),即標(biāo)準(zhǔn)範(fàn)本庫(kù)。它是由泛型演算法和數(shù)據(jù)結(jié)構(gòu)組成的通用庫(kù)。在運(yùn)用STL之前,必須掌握範(fàn)本的使用。94STL的組成STL主要由六大部分組成:迭代器(iterators)演算法(algorithms)容器(containers)函數(shù)對(duì)象(functionobjects)記憶體分配器(allocators)適配器(adapter)95流的概念在C++中,將數(shù)據(jù)從一個(gè)對(duì)象到另一個(gè)對(duì)象的流動(dòng)抽象為“流”。流動(dòng)的方向不同,構(gòu)成輸入/輸出流,即I/O流。在C++程式中,數(shù)據(jù)可以從鍵盤(pán)流入到程式,也可以從程式流向螢?zāi)换虼牌瑱n。從流中獲取數(shù)據(jù)的操作稱(chēng)為提取操作向流中添加數(shù)據(jù)的操作稱(chēng)為插入操作。數(shù)據(jù)的輸入/輸出就是通過(guò)I/O流來(lái)實(shí)現(xiàn)的。96C++編譯系統(tǒng)提供的I/O流庫(kù)含有兩個(gè)平行基類(lèi):streambuf和ios,所有的流類(lèi)都是由它們派生出來(lái)的。ios類(lèi)有4個(gè)直接派生類(lèi),即輸入流類(lèi)istream、輸出流類(lèi)ostream、檔流類(lèi)fstreambase、串流類(lèi)strstreambase,這4種流作為流庫(kù)中的基本流類(lèi)。97I/O流庫(kù)中各個(gè)類(lèi)之間的層次關(guān)係stdiostreamiosistrstreamistreamifstreamistream_withassignostreamfstreamostream_withassignstrstreamiostreamofstreamostrstreamstreambufstrstreambuffilebufstdiobuffstreambasestrstreambase98非格式化輸入/輸出非格式化輸入/輸出就是按系統(tǒng)預(yù)定義的格式進(jìn)行的輸入/輸出。按默認(rèn)約定,每個(gè)C++程式都能使用標(biāo)準(zhǔn)I/O流,如標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出。cin用來(lái)處理標(biāo)準(zhǔn)輸入,即鍵盤(pán)輸入;cout用來(lái)處理標(biāo)準(zhǔn)輸出,即螢?zāi)惠敵?。它們被定義在iostream.h頭檔中。在使用cout和cin前,要用編譯預(yù)處理命令將所使用的頭檔包含到根源程式中,其格式如下:#include<iostream.h>99非格式化輸出“<<”是預(yù)定義的插入運(yùn)算符,作用在流類(lèi)對(duì)象cout上,實(shí)現(xiàn)默認(rèn)格式的螢?zāi)惠敵?。使用cout輸出運(yùn)算式值到螢?zāi)簧系母袷饺缦拢?/p>
cout<<E1<<E2<<…<<Em;其中,E1、E2、…、Em為均為運(yùn)算式。功能是計(jì)算各運(yùn)算式的值,並將結(jié)果輸出到螢?zāi)划?dāng)前游標(biāo)位置處。cout是ostream流類(lèi)的對(duì)象,它在iostream.h頭檔中作為全局對(duì)象定義:
ostreamcout(stdout);其中,stdout表示標(biāo)準(zhǔn)輸出設(shè)備名(螢?zāi)唬?00非格式化輸入“>>”是預(yù)定義的提取運(yùn)算符,作用在流類(lèi)對(duì)象cin上,實(shí)現(xiàn)默認(rèn)格式的鍵盤(pán)輸入。使用cin將數(shù)據(jù)輸入到變數(shù)的格式如下:
cin>>V1>>V2>>…>>Vn;其中,V1、V2、…、Vn都是變數(shù)。功能是暫停執(zhí)行程式,等待用戶(hù)從鍵盤(pán)輸入數(shù)據(jù),各數(shù)據(jù)間用空格或Tab鍵分隔,輸入數(shù)據(jù)類(lèi)型要與接受變數(shù)類(lèi)型一致,輸完後,按回車(chē)鍵結(jié)束。cin是istream流類(lèi)的對(duì)象,它在iostream.h頭檔中作為全局對(duì)象定義:
istreamcin(stdin);其中,stdin表示標(biāo)準(zhǔn)輸入設(shè)備名(鍵盤(pán))。101格式化輸入/輸出C++提供了兩種進(jìn)行輸入/輸出格式化的方法:一種是用ios類(lèi)成員函數(shù)進(jìn)行格式化。另一種是用專(zhuān)門(mén)的操作符函數(shù)進(jìn)行格式化。102
用ios類(lèi)成員函數(shù)格式化ios類(lèi)成員函數(shù)主要是通過(guò)對(duì)狀態(tài)標(biāo)誌、輸出寬度、填充字元以及輸出精度的操作來(lái)完成輸入/輸出格式化。枚舉量定義在ios類(lèi)中,因此引用時(shí)必須包含ios::首碼。使用時(shí)應(yīng)該全部用符號(hào)名,絕不要用數(shù)值。103用ios成員函數(shù)對(duì)狀態(tài)標(biāo)誌進(jìn)行操作ios類(lèi)有3個(gè)成員函數(shù)可以對(duì)狀態(tài)標(biāo)誌進(jìn)行操作,並且定義了一個(gè)long型數(shù)據(jù)成員記錄當(dāng)前狀態(tài)標(biāo)誌。這些狀態(tài)標(biāo)誌可用位或運(yùn)算符“|”進(jìn)行組合。設(shè)置狀態(tài)標(biāo)誌用setf函數(shù)設(shè)置狀態(tài)標(biāo)誌,其一般格式如下:longios::setf(longflags)清除狀態(tài)標(biāo)誌用unsetf函數(shù)清除狀態(tài)標(biāo)誌,其一般格式如下:longios::unsetf(longflags)取狀態(tài)標(biāo)誌用函數(shù)flaps取狀態(tài)標(biāo)誌有兩種形式,其格式分別如下:longios::flags()longios::flags(longflag)104用ios成員函數(shù)設(shè)置輸出寬度設(shè)置輸出寬度函數(shù)有兩種形式,其格式分別如下:
intios::width(intlen) intios::width()第一種形式是設(shè)置輸出寬度,並返回原來(lái)的輸出寬度;第二種形式是返回當(dāng)前輸出寬度,輸出寬度為0。105設(shè)置填充字元填充字元的作用是當(dāng)輸出值不滿輸出寬度時(shí)用填充字元來(lái)填充,默認(rèn)填充字元為空格。它與width()函數(shù)配合使用,否則沒(méi)有意義。設(shè)置填充字元函數(shù)有兩種形式,其格式分別如下:
charios::fill(charch)charios::fill()第一種形式是重新設(shè)置填充字元,並返回設(shè)置前的填充字元;第二種形式是返回當(dāng)前的填充字元。106設(shè)置輸出精度設(shè)置浮點(diǎn)數(shù)輸出精度有兩種形式,其格式分別如下:
intios::precision(intp)intios::precision()第一種形式是重新設(shè)置輸出精度,並返回設(shè)置前的輸出精度;第二種形式是返回當(dāng)前的輸出精度。107用操作符函數(shù)格式化為了不直接以標(biāo)誌位的方式去處理流的狀態(tài),c++標(biāo)準(zhǔn)庫(kù)提供了標(biāo)準(zhǔn)的操作符函數(shù)專(zhuān)門(mén)操控這些狀態(tài)。這組函數(shù)不屬於任何類(lèi)成員,定義在iomanip.h頭檔中。將它們用在提取運(yùn)算符“>>”或插入運(yùn)算符“<<”後面來(lái)設(shè)定輸入/輸出格式,即在讀寫(xiě)對(duì)象之間插入一個(gè)修改狀態(tài)的操作。其中有些函數(shù)沒(méi)有參數(shù),所以又叫操作符。108設(shè)置輸入/輸出寬度函數(shù)setw(int)設(shè)置輸出填充字元函數(shù)setfill(int)設(shè)置輸出精度函數(shù)setprecision(int)設(shè)置輸入/輸出整型數(shù)數(shù)制函數(shù)dec、hex和oct取消輸入結(jié)束符函數(shù)ws控制換行操作符endl代表輸出單字符“\0”的操作符ends109
檔的輸入/輸出C++把檔看作是一個(gè)字元(位元組)的序列,即由一個(gè)個(gè)字元(位元組)順序組成。根據(jù)數(shù)據(jù)的組織形式,可分為ASCII碼檔和二進(jìn)位檔。ASCII碼檔又稱(chēng)為文本檔,它的每一個(gè)位元組存放一個(gè)ASCII碼,代表一個(gè)字元。二進(jìn)位檔是把記憶體中的數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式原樣輸出到磁片檔存放。110C++有三種檔流類(lèi):輸入/輸出檔流類(lèi)fstream輸入檔流類(lèi)ifstream輸出檔流類(lèi)ofstream它們分別從I/O流中的iostream、istream、ostream流類(lèi)中派生而來(lái)。這些檔流類(lèi)都定義在fstream.h頭檔中,因此,要使用檔流類(lèi),必須在程式開(kāi)始包含該頭檔。111C++中進(jìn)行檔操作的一般步驟為檔定義一個(gè)流類(lèi)對(duì)象;使用open()函數(shù)建立(或打開(kāi))檔。如果檔不存在,則建立該檔;如果磁片上已存在該檔,則打開(kāi)該檔;進(jìn)行讀寫(xiě)操作。在建立(或打開(kāi))的檔上執(zhí)行所要求的輸入/輸出操作。一般來(lái)說(shuō),在內(nèi)存與外設(shè)的數(shù)據(jù)傳輸中,由記憶體到外設(shè)稱(chēng)為輸出或?qū)?,反之則稱(chēng)為輸入或讀;使用close()函數(shù)關(guān)閉檔。當(dāng)完成操作後,應(yīng)把打開(kāi)的檔關(guān)閉,避免誤操作。112在C++中,打開(kāi)一個(gè)檔就是將這個(gè)檔與一個(gè)流建立關(guān)聯(lián);關(guān)閉一個(gè)檔就是取消這種關(guān)聯(lián)。open()函數(shù)的原型在fstream.h中定義。另外,在fstream、ifstream和ofstream流類(lèi)中均有定義。其原型為:voidopen(char*filename,intmod,intaccess);其中第一個(gè)參數(shù)是用來(lái)傳遞檔案名;第二個(gè)參數(shù)的值決定檔的使用方式,如表7-4所示;第三個(gè)參數(shù)的值決定檔的訪問(wèn)方式。113異常處理概述
在程式能正確支持所設(shè)計(jì)的正常情況之後,再添加語(yǔ)句來(lái)處理異常情況,這種思想就是異常處理。在C++中專(zhuān)門(mén)提供了這種機(jī)制,程式員在編寫(xiě)程式的時(shí)候首先需要假裝不會(huì)產(chǎn)生任何異常寫(xiě)好用於處理正常情況的語(yǔ)句,之後,利用C++的異常處理機(jī)制,添加用於處理異常情況的語(yǔ)句。114異常處理實(shí)現(xiàn)
C++語(yǔ)言提供對(duì)處理異常情況的內(nèi)部支持。try,throw和catch語(yǔ)句就是C++語(yǔ)言中用於實(shí)現(xiàn)異常處理的機(jī)制。有了C++異常處理,程式可以向更高的執(zhí)行上下文傳遞意想不到的事件,從而使程式能更好地從這些異常事件中恢復(fù)過(guò)來(lái)。115異常處理的語(yǔ)法try-throw-catch是拋出和捕獲異常的基本機(jī)制。Throw語(yǔ)句拋出異常(一個(gè)值),catch捕獲異常。拋出一個(gè)異常後,try塊會(huì)終止,轉(zhuǎn)而執(zhí)行catch塊中的語(yǔ)句。catch塊結(jié)束之後,會(huì)繼續(xù)執(zhí)行catch塊之後的語(yǔ)句(前提是catch塊中沒(méi)有終止程式或者執(zhí)行另外一些特殊的操作)。如果try塊中沒(méi)有拋出異常,那麼在try塊結(jié)束之後,程式將從catch塊之後的語(yǔ)句繼續(xù)執(zhí)行。換言之,如果沒(méi)有拋出異常,catch塊會(huì)被忽略。116try塊
如果在函數(shù)內(nèi)直接用throw拋出一個(gè)異常(或在函數(shù)調(diào)用時(shí)拋出一個(gè)異常),將在異常拋出時(shí)退出函數(shù)。如果不想在異常拋出時(shí)退出函數(shù),可以在函數(shù)體內(nèi)創(chuàng)建一個(gè)特殊塊用於解決程式中潛在的錯(cuò)誤,在這個(gè)塊中可以測(cè)試各種錯(cuò)誤發(fā)生的可能性,通常稱(chēng)為測(cè)試塊,它由關(guān)鍵字try引導(dǎo)。其定義格式如下:try{<語(yǔ)句>}117拋出異常
通常將拋出的值直接稱(chēng)為一個(gè)異常,所以執(zhí)行throw語(yǔ)句就稱(chēng)為拋出異常,可以拋出任意類(lèi)型的一個(gè)值。其定義的格式如下:
throw<拋出值的運(yùn)算式>
執(zhí)行throw語(yǔ)句時(shí),週邊的try塊就會(huì)停止執(zhí)行。如果try塊之後跟有一個(gè)合適的catch塊,那麼控制權(quán)就會(huì)轉(zhuǎn)交給那個(gè)catch塊。一般說(shuō)來(lái),throw語(yǔ)句幾乎肯定要嵌入一個(gè)分支語(yǔ)句(比如if語(yǔ)句)中。118捕獲異常
拋出一個(gè)異常後,週邊的try塊會(huì)停止執(zhí)行,並開(kāi)始執(zhí)行另一個(gè)部分的語(yǔ)句,也就是catch塊。執(zhí)行catch的過(guò)程稱(chēng)為捕獲異常或者異常處理。一個(gè)異常被拋出以後,最終應(yīng)該由某個(gè)catch塊來(lái)處理。119一般說(shuō)來(lái),catch塊參數(shù)主要完成兩件事情:catch塊參數(shù)前要加一個(gè)類(lèi)型名,表示catch塊可以捕獲什麼類(lèi)型的異常拋出值;catch塊參數(shù)為捕獲的異常拋出值指定了一個(gè)名稱(chēng),所以在catch塊中,又可以對(duì)這個(gè)異常拋出值進(jìn)行相應(yīng)的處理。120Windows編程基礎(chǔ)Windows操作系統(tǒng)是一個(gè)多任務(wù)、面向?qū)ο蟮膱D形操作系統(tǒng)。在Windows操作環(huán)境中,Windows應(yīng)用程式採(cǎi)用“基於消息的事件驅(qū)動(dòng)”運(yùn)行機(jī)制,這是它與過(guò)去的面向過(guò)程的應(yīng)用程式機(jī)制的不同之處。121窗口窗口是由應(yīng)用程式創(chuàng)建的一個(gè)用於接收用戶(hù)輸入和顯示輸出的矩形區(qū)域。窗口由“非客戶(hù)區(qū)”和“客戶(hù)區(qū)”組成。非客戶(hù)區(qū)由系統(tǒng)繪製,包括菜單、工具欄、最大化按鈕等??蛻?hù)區(qū)由應(yīng)用程式繪製,用於輸出數(shù)據(jù)和接受用戶(hù)的輸入。Windows應(yīng)用程式可以有多個(gè)窗口,每一個(gè)窗口都可以具有不同的功能。122事件和消息Windows操作環(huán)境中,無(wú)論是系統(tǒng)產(chǎn)生的動(dòng)作或是用戶(hù)運(yùn)行應(yīng)用程式產(chǎn)生的動(dòng)作,都稱(chēng)為事件產(chǎn)生的消息。Windows應(yīng)用程式利用消息與其他的Windows應(yīng)用程式及Windows系統(tǒng)進(jìn)行資訊交換。Windows的消息由三部分組成:消息號(hào)、字參數(shù)和長(zhǎng)參數(shù)。消息號(hào)是預(yù)先定義的消息名標(biāo)誌符字參數(shù)和長(zhǎng)參數(shù)是與消息號(hào)相關(guān)的值,提供一些附加資訊。123句柄Windows應(yīng)用程式中,句柄是標(biāo)識(shí)諸如菜單、圖示、窗口、記憶體塊、輸出設(shè)備等對(duì)象的識(shí)別字號(hào),Windows系統(tǒng)的各種資源都是通過(guò)句柄來(lái)訪問(wèn)的。句柄是作為Windows系統(tǒng)內(nèi)部表的索引值來(lái)使用的,而並非對(duì)象所在的記憶體地址。通過(guò)句柄只能夠安全的訪問(wèn)對(duì)象,而不能直接訪問(wèn)對(duì)象的內(nèi)部結(jié)構(gòu)。124GDI簡(jiǎn)介許多MS-DOS程式都直接向視頻存儲(chǔ)區(qū)或印表機(jī)端口輸送數(shù)據(jù),這樣做就需要為不同的輸出設(shè)備編寫(xiě)不同的程式。Windows提供了一個(gè)抽象的圖形介面介面,稱(chēng)為圖形設(shè)備介面,或簡(jiǎn)稱(chēng)GDI。它組成了Windows操作系統(tǒng)的核心部分。125設(shè)備環(huán)境設(shè)備環(huán)境(DeviceContext),也被稱(chēng)為DC,是由GDI保存的一個(gè)數(shù)據(jù)結(jié)構(gòu),設(shè)備環(huán)境包含了輸出設(shè)備的繪圖特徵。不同設(shè)備有不同的設(shè)備環(huán)境,在輸出設(shè)備上輸出的先決條件是獲得該設(shè)備的設(shè)備環(huán)境。126畫(huà)筆畫(huà)筆指的是一種用於畫(huà)線及繪製有形邊框的工具,用戶(hù)可以指定它的顏色及寬度,並且可以指定它畫(huà)實(shí)線、點(diǎn)線或虛線等。畫(huà)刷定義了一種位圖形式的像素,利用它可對(duì)封閉區(qū)域內(nèi)部填充顏色或樣式。字體是一種具有某種風(fēng)格和尺寸的所有字元的完整集合。127資源游標(biāo)、位圖、對(duì)話框和菜單都是資源。資源即數(shù)據(jù),包含在應(yīng)用程式的.exe檔中。當(dāng)Windows把程式裝入記憶體執(zhí)行的時(shí)候,它通常將資源留在磁片上。只有當(dāng)Windows需要某一資源時(shí),它才將資源裝入記憶體。資源在資源描述檔中定義。資源描述檔是以.rc為擴(kuò)展名的ASCII碼檔。資源描述檔可以包含用ASCII碼表示的資源,也可以引用其他資源描述檔(ASCII或二進(jìn)位檔)。128Windows環(huán)境下的資源主要有以下幾類(lèi):加速鍵、工具欄、游標(biāo)、對(duì)話框、圖示、字串和菜單等。VisualC++為所有類(lèi)型的資源都提供了資源編輯器進(jìn)行可視化的編輯。129Windows編程中的數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)描述MSG應(yīng)用程式消息的結(jié)構(gòu)WNDCLASS定義窗口類(lèi)PAINTSTRUCT定義窗口用戶(hù)域的繪製消息RECT定義矩形130用MFC創(chuàng)建Windows應(yīng)用程式MFC的框架結(jié)構(gòu)提供如下優(yōu)點(diǎn):MFC按照C++類(lèi)的層次形式組織在一起,類(lèi)封裝了WindowsAPI函數(shù)並提供Windows應(yīng)用程式常見(jiàn)任務(wù)的缺省處理代碼。幾個(gè)基類(lèi)提供一般功能,由基類(lèi)派生的類(lèi)實(shí)現(xiàn)更具體的行為。MFC提供了文檔和視圖模型以實(shí)現(xiàn)數(shù)據(jù)和顯示的分離。文檔類(lèi)(Document)用來(lái)維護(hù)、管理數(shù)據(jù),包括數(shù)據(jù)的讀取、存儲(chǔ)與修改;視圖類(lèi)(View)用來(lái)接收並顯示數(shù)據(jù),將這些數(shù)據(jù)交給文檔類(lèi)來(lái)處理。MFC庫(kù)提供了自動(dòng)消息處理功能。MFC的框架結(jié)構(gòu)通過(guò)消息映射機(jī)制,將Windows消息直接映射到—個(gè)成員函數(shù)進(jìn)行處理,簡(jiǎn)化了消息的處理方式。131MFC類(lèi)的層次結(jié)構(gòu)MFC類(lèi)庫(kù)是一個(gè)功能強(qiáng)大、結(jié)構(gòu)複雜和龐大的類(lèi)庫(kù)。MFC的類(lèi)可以分為兩種:從CObject派生的類(lèi)及非CObject派生類(lèi)。MFC有100種以上的類(lèi)。132Windows應(yīng)用程式類(lèi)型用VisualC++創(chuàng)建MFC程式的典型結(jié)構(gòu)一共有三種:基於單文檔的應(yīng)用程式基於多文檔的應(yīng)用程式基於對(duì)話框的應(yīng)用程式133創(chuàng)建單文檔應(yīng)用程式MFC的文檔/視圖結(jié)構(gòu)將Windows應(yīng)用程式的功能劃分在不同的類(lèi)中。利用MFC提供的運(yùn)行機(jī)制和消息傳遞機(jī)制,構(gòu)成應(yīng)用程式的類(lèi)通過(guò)傳遞消息、調(diào)用介面函數(shù),共同完成程式的功能。134AppWizard嚮導(dǎo)創(chuàng)建的類(lèi)和文件AppWizard嚮導(dǎo)為生成的派生類(lèi)創(chuàng)建單獨(dú)的原始檔案,缺省情況下,類(lèi)名和類(lèi)原始檔案名是基於專(zhuān)案名的(可以在AppWizard嚮導(dǎo)創(chuàng)建應(yīng)用程式過(guò)程中指定其他名稱(chēng))。AppWizard嚮導(dǎo)為單文檔應(yīng)用程式創(chuàng)建4個(gè)派生類(lèi)和其他一些檔。這4個(gè)類(lèi)分別是文檔類(lèi)、視圖類(lèi)、主框架窗口類(lèi)和應(yīng)用程式類(lèi)。135應(yīng)用程式的運(yùn)行機(jī)制MFC應(yīng)用程式有自己特殊的運(yùn)行機(jī)制,下麵以WinHello程式為例,列出應(yīng)用程式的執(zhí)行過(guò)程。用CWinApp的構(gòu)造函數(shù);程式入口函數(shù)WinMain接受控制;WinMain調(diào)用應(yīng)用程式類(lèi)的InitInstance函數(shù);WinMain進(jìn)入消息迴圈;WinMain退出,程式中止。136消息處理機(jī)制MFC應(yīng)用程式與其他任何Windows程式一樣,也使用消息驅(qū)動(dòng)機(jī)制,但MFC提供的消息處理機(jī)制使得消息的處理更加容易。MFC中消息可以分為三類(lèi):Windows消息:包括以WM_開(kāi)頭的消息,但WM_COMMAND除外。Windows消息由窗口和視圖處理。這種消息通常附帶一些參數(shù)傳遞給處理函數(shù),這些參數(shù)為處理函數(shù)正確地處理消息提供了必要的資訊。控件通知消息:當(dāng)控件的狀態(tài)發(fā)生改變(例如用戶(hù)利用利用控件進(jìn)行輸入)時(shí),控件就會(huì)向其父窗口發(fā)送控件通知消息。MFC對(duì)控件通知消息的傳遞方式與其他以WM_開(kāi)頭的Windows消息一樣,但BN_CLICKED是個(gè)例外,該消息的傳遞方式與命令消息的傳遞機(jī)制一樣。命令消息:包括來(lái)自於菜單、工具欄中的按鈕和加速鍵等用戶(hù)介面對(duì)象的WM_COMMAND通知消息。137
輸入輸出處理輸入輸出處理是應(yīng)用程式最基本的功能。Windows應(yīng)用程式通過(guò)GDI提供的繪圖函數(shù)在窗口的客戶(hù)區(qū)輸出數(shù)據(jù),通過(guò)對(duì)鍵盤(pán)消息和滑鼠消息的回應(yīng),完成對(duì)用戶(hù)輸入的處理。138文本輸出文本輸出函數(shù)鍵盤(pán)字元消息滑鼠139虛擬鍵代碼鍵盤(pán)類(lèi)型根據(jù)語(yǔ)言或國(guó)家的不同而不同,為了避免依賴(lài)於特定國(guó)家的鍵盤(pán)佈局虛擬鍵代碼Windows識(shí)別字鍵盤(pán)VK_INSERTInsert(插入鍵)VK_LEFT↑左箭頭鍵VK_NEXTPageDown鍵VK_BACKBackspace鍵VK_RETURNEnter鍵140滑鼠消息當(dāng)用戶(hù)移動(dòng)滑鼠或釋放鬆開(kāi)滑鼠按鈕時(shí),將產(chǎn)生滑鼠消息。滑鼠消息可以分成兩類(lèi):客戶(hù)區(qū)滑鼠消息和非客戶(hù)區(qū)滑鼠消息。非客戶(hù)區(qū)包括窗口的邊界、標(biāo)題欄、菜單、滾動(dòng)條、最大化最小化按鈕。客戶(hù)區(qū)滑鼠消息指的是滑鼠在這些區(qū)域的操作而產(chǎn)生的消息。這種消息一般由系統(tǒng)處理。應(yīng)用程式主要處理滑鼠在客戶(hù)區(qū)的操作而產(chǎn)生的消息。141菜單菜單(Menu)以可視的方式提供了對(duì)應(yīng)用程式功能的選擇,是用戶(hù)與應(yīng)用程式之間進(jìn)行交互的主要方式之一。142菜單簡(jiǎn)介菜單主要有彈出式和下拉式兩種。彈出式菜單可以出現(xiàn)在螢?zāi)坏娜魏挝恢茫菫榱嘶貞?yīng)滑鼠右鍵按鈕而啟動(dòng)彈出式菜單。下拉式菜單可以看成由一個(gè)頂層菜單和彈出式菜單裝配而成。當(dāng)選擇頂層菜單項(xiàng)時(shí),下拉出一個(gè)子菜單,子菜單中是具體的菜單項(xiàng)。在子菜單項(xiàng)中選擇時(shí),還可以再下拉出另一個(gè)子菜單,形成級(jí)聯(lián)菜單。143菜單的建立和實(shí)現(xiàn)菜單編輯器的使用。為程式加入菜單的操作分為以下幾步:通過(guò)菜單編輯器生成菜單介面;建立菜單項(xiàng)和消息處理函數(shù)的映射;在處理函數(shù)中添加菜單項(xiàng)功能代碼。144滾動(dòng)條滾動(dòng)功能使用戶(hù)可以閱讀和編輯大於視圖窗口的任何東西--無(wú)論是文本、表格、資料庫(kù)記錄還是圖像。只要它所需的空間超出了客戶(hù)區(qū)域所能提供的空間,就可以使用滾動(dòng)條。145在程式中加入滾動(dòng)功能CScrollView是從CView類(lèi)派生的專(zhuān)用視圖類(lèi)。從CScrollView類(lèi)派生的視圖類(lèi)自動(dòng)將滾動(dòng)條加入視圖窗口,並提供了支持滾動(dòng)操作的大多數(shù)代碼。所有的GDI函數(shù)都使用邏輯座標(biāo),Windows將GDI函數(shù)中指定邏輯座標(biāo)映射為設(shè)備座標(biāo)。146在程式中實(shí)現(xiàn)分割功能
動(dòng)讓用戶(hù)閱讀超過(guò)窗口的長(zhǎng)文檔,但用戶(hù)也只能看文檔的某一部分,如果用戶(hù)想同時(shí)閱讀文檔中相隔很遠(yuǎn)的部分,就只能同時(shí)打開(kāi)兩個(gè)窗口,分別滾動(dòng)到相應(yīng)的位置閱讀。Windows提供窗口分割功能,實(shí)現(xiàn)同時(shí)閱讀長(zhǎng)文檔的不同部分。在窗口的垂直滾動(dòng)條的上部和水準(zhǔn)滾動(dòng)條的底部,存在一個(gè)分割框區(qū)域,雙擊分割框或拖動(dòng)分割框到所需的位置,窗口被垂直或水準(zhǔn)地分成兩個(gè)獨(dú)立的窗口,被分割後的窗口稱(chēng)為面板,用以顯示同一文檔或圖形的不同部分。147工具欄和狀態(tài)欄工具欄和狀態(tài)欄是Widows應(yīng)用程式中常見(jiàn)的用戶(hù)介面。工具欄是一種快捷操作的工具,常用的命令通常放在工具欄中,方便操作。而狀態(tài)欄則用於顯示目前程式的執(zhí)行狀態(tài)和說(shuō)明。148工具欄的實(shí)現(xiàn)具欄包含一系列的位圖按鈕,通常情況下,單擊按鈕等價(jià)於從菜單中選擇相應(yīng)的菜單項(xiàng)。工具欄可以??吭诟复翱诘捻敳?,也可以??吭诟复翱诘娜魏慰窟叺奈恢茫蛘呙撾x父窗口,移動(dòng)到自己的框架窗口內(nèi)。??抗ぞ邫冢―ockingToolbars)指的是和父窗口相連的工具欄。與之相對(duì)就就是浮動(dòng)工具欄(FloatingToolbars)。149ToolbarDemo程式的圖形菜單有直線、矩形和圓形三種選擇,相應(yīng)的,在工具欄中需要建立這三種按鈕。具體操作步驟如下:打開(kāi)工具欄編輯器,修改AppWizard嚮導(dǎo)生成的預(yù)定義工具欄。在工具欄面板中刪除嚮導(dǎo)生成的缺省按鈕,只留下一個(gè)空白按鈕。用滑鼠將按鈕拖出工具欄面板就刪除該按鈕。創(chuàng)建直線按鈕。選擇圖形工具欄中的直線,在按鈕繪製區(qū)域從左上角到右下角畫(huà)直線。完成後,雙擊生成的直線按鈕,彈出ToolbarButtonProperties對(duì)話框。在ToolbarButtonProperties對(duì)話框中設(shè)置按鈕的ID(識(shí)別字)以及Prompt(提示資訊)。在ID框中,輸入ID_LINE。一旦編輯完第一個(gè)按鈕的內(nèi)容,在它右面會(huì)出現(xiàn)一個(gè)新的空白按鈕。單擊這個(gè)空白按鈕,繼續(xù)編輯下一個(gè)按鈕。創(chuàng)建矩形按鈕。選擇圖形工具條中的矩形,在空白按鈕中繪出一個(gè)矩形。按鈕的ID取值為ID_RECTANGLE。按以上步驟,再添加一個(gè)圓形按鈕。ID取值為ID_CIRCLE。完成工具欄的設(shè)計(jì)。150狀態(tài)欄的實(shí)現(xiàn)
狀態(tài)欄一般都??吭谥骺蚣艽翱诘牡撞浚鄠€(gè)面板,用做文本輸出或指示器,而且也無(wú)須改變其位置。如果在AppWizard嚮導(dǎo)的Step4對(duì)話框中選擇了Initialstatusbar項(xiàng),AppWizard嚮導(dǎo)生成的應(yīng)用程式就擁有一個(gè)缺省的狀態(tài)欄。設(shè)計(jì)狀態(tài)欄的任務(wù)是:定義提示資訊,建立特定狀態(tài)和提示資訊的聯(lián)繫。151對(duì)話框和控件對(duì)話框用於顯示消息和取得用戶(hù)數(shù)據(jù),是Windows應(yīng)用程式中最常用的用戶(hù)介面。對(duì)話框作為一個(gè)容器,通常包括各種控件,如編輯框、按鈕、組合框和列表框等。用戶(hù)通過(guò)在編輯框中輸入資訊,通過(guò)對(duì)列表框、單選框等的選擇,為應(yīng)用程式提供必要的數(shù)據(jù)。對(duì)話框有兩種類(lèi)型:模式對(duì)話框和非模式對(duì)話框。這兩種形式的對(duì)話框在打開(kāi)和關(guān)閉方式上存在區(qū)別。MFC的Dialog類(lèi)是對(duì)話框類(lèi)的基類(lèi),提供了對(duì)話框的打開(kāi)、關(guān)閉和管理對(duì)話框及對(duì)話框中的控件等功能。152控件簡(jiǎn)介控件是Windows應(yīng)用程式和用戶(hù)進(jìn)行交互的常用手段。在VisualC++中,控件可以分成三類(lèi):Windows標(biāo)準(zhǔn)控件、ActiveX控件和其他MFC控件類(lèi)。Windows標(biāo)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 陜西經(jīng)濟(jì)管理職業(yè)技術(shù)學(xué)院《導(dǎo)游基礎(chǔ)知識(shí)和現(xiàn)場(chǎng)導(dǎo)游》2023-2024學(xué)年第一學(xué)期期末試卷
- 政府農(nóng)業(yè)種植補(bǔ)貼合同范例
- 訂貨安裝安全合同范例
- 內(nèi)架鋼管租賃合同范例
- 預(yù)算審核 合同范例
- 生產(chǎn)材料買(mǎi)賣(mài)合同范例
- 兼職外聘合同范例
- 藥品交易合同范例
- 2024年港琪月餅代理運(yùn)營(yíng)管理合同
- 學(xué)校做欄桿合同范例
- 2023-2024學(xué)年廣東省深圳市南山區(qū)八年級(jí)(上)期末英語(yǔ)試卷
- 電工安全技術(shù)交底表格模板
- 實(shí)驗(yàn)一 伐倒木材積測(cè)定
- 提高產(chǎn)蛋性能的專(zhuān)利產(chǎn)品(增蛋素)的綜合應(yīng)用-PPT課件
- 《廚余垃圾處理廠運(yùn)行監(jiān)管標(biāo)準(zhǔn)》(征求意見(jiàn)稿)
- 面癱診治指南
- 精品專(zhuān)題資料(2022-2023年收藏)廣東省教育科學(xué)規(guī)劃項(xiàng)目中期檢查報(bào)告書(shū)馬遠(yuǎn)生
- 《混凝土結(jié)構(gòu)》(樓蓋)課程設(shè)計(jì)任務(wù)書(shū)
- 邵雍河洛理數(shù)解卦
- 趙本山《賣(mài)拐》臺(tái)詞
- 上海建設(shè)工程通用硅酸鹽水泥質(zhì)量檢驗(yàn)報(bào)告 - 上海水泥行業(yè)協(xié)會(huì)
評(píng)論
0/150
提交評(píng)論