面向?qū)ο蠹夹g(shù)與VC++程序設(shè)計課件_第1頁
面向?qū)ο蠹夹g(shù)與VC++程序設(shè)計課件_第2頁
面向?qū)ο蠹夹g(shù)與VC++程序設(shè)計課件_第3頁
面向?qū)ο蠹夹g(shù)與VC++程序設(shè)計課件_第4頁
面向?qū)ο蠹夹g(shù)與VC++程序設(shè)計課件_第5頁
已閱讀5頁,還剩159頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

面向?qū)ο蠹夹g(shù)概述2面向?qū)ο蠹夹g(shù)的基本概念面向?qū)ο蠹夹g(shù)是一種以對象為基礎(chǔ),以事件或消息來驅(qū)動對象執(zhí)行處理的程式設(shè)計技術(shù)。

面向?qū)ο蟪淌皆O(shè)計從所處理的數(shù)據(jù)入手,以數(shù)據(jù)為中心而不是以功能為中心來描述系統(tǒng),數(shù)據(jù)相對於功能而言具有更強的穩(wěn)定性。3面向?qū)ο蟪淌降闹饕Y(jié)構(gòu)特點第一,程式一般由類的定義和類的使用兩部分組成,在主程序中定義各對象並規(guī)定它們之間傳遞消息的規(guī)律;第二,程式中的一切操作都是通過向?qū)ο蟀l(fā)送消息來實現(xiàn)的,對象接到消息後,啟動有關(guān)函數(shù)完成相應(yīng)的操作。4對象的概念(一)面向?qū)ο蠹夹g(shù)認(rèn)為客觀世界是由各種各樣的對象組成,每種對象都有各自的內(nèi)部狀態(tài)和運動規(guī)律,不同對象間的相互作用和聯(lián)繫就構(gòu)成了各種不同的系統(tǒng),構(gòu)成了客觀世界。對象是組成一個系統(tǒng)的基本邏輯單元,是一個有組織形式的含有資訊的實體。對象既可以表示一個抽象的概念,也可以表示一個具體的模組,既可以表示軟體,也可以表示硬體。5對象的概念(二)對象(Object)由屬性(Attribute)和行為(Action)兩部分組成。屬性是用來描述對象靜態(tài)特徵的一個資料項目。行為是用來描述對象動態(tài)特徵和行為的一個操作。對象是包含客觀世界物體特徵的抽象實體,是屬性和行為的封裝體。6類的確定(一)類(Class)是具有相同屬性和行為的一組對象的集合;類為屬於它的全部對象提供了統(tǒng)一的抽象描述;類的內(nèi)部包括屬性和行為兩個主要部分;類是對象集合的再抽象。劃分原則:尋求一個大系統(tǒng)中事物的共性,將具有共性的系統(tǒng)成分確定為一個類。7類的確定(二)確定某事物是一個類的步驟包括: 第一步,要判斷該事物是否有一個以上的實例,如果有,則它是一個類;第二步,要判斷類的實例中有沒有絕對的不同點,如果沒有,則它是一個類。因為類的每一個實例是相似的,具有相同屬性和行為類別結(jié)構(gòu)。不能把一組函數(shù)組合在一起構(gòu)成類

!

8消息和事件消息(Message)是描述事件發(fā)生的資訊。消息是對象之間發(fā)出的行為請求。多個消息構(gòu)成一個事件。封裝使對象成為一個相對獨立的實體,而消息機制為它們提供了一個相互間動態(tài)聯(lián)繫的途徑,使它們的行為能互相配合,構(gòu)成一個有機的運行系統(tǒng)。9面向?qū)ο蠹夹g(shù)的基本特徵抽象性抽象就是忽略事物中與當(dāng)前目標(biāo)無關(guān)的非本質(zhì)特徵,更充分地注意與當(dāng)前目標(biāo)有關(guān)的本質(zhì)特徵。封裝性封裝就是把對象的屬性和行為結(jié)合成一個獨立的單位,並盡可能隱蔽對象的內(nèi)部細(xì)節(jié)。繼承性繼承是一種聯(lián)結(jié)類與類的層次模型。繼承性是指特殊類的對象擁有其一般類的屬性和行為的特性。多態(tài)性多態(tài)是指類中同一函數(shù)名對應(yīng)多個具有相似功能的不同函數(shù)。多態(tài)性是指可以使用相同的調(diào)用方式來調(diào)用這些具有不同功能的同名函數(shù)的特性。10三種常用面向?qū)ο蟪淌皆O(shè)計語言簡介

混合型面向?qū)ο蟪淌皆O(shè)計語言C++純面向?qū)ο蟪淌皆O(shè)計語言Java可視化程式設(shè)計語言VisualBasic11簡單的C++程式C++程式由一個或多個源代碼檔構(gòu)成。C++的源代碼檔分為兩類:頭檔和根源程式檔。C++根源程式包括編譯預(yù)處理、程式主體和注釋幾部分。一般將變數(shù)(對象)、類型及類的定義、函數(shù)的聲明等放在頭檔(擴(kuò)展名為.h);而將使用這些變數(shù)或函數(shù)的程式放在另一個檔中,成為C++根源程式(擴(kuò)展名.cpp)。12C++程式的編譯過程分為預(yù)處理和正式編譯兩個步驟。在編譯C++程式時,編譯系統(tǒng)中的預(yù)處理模組首先根據(jù)預(yù)處理命令對根源程式進(jìn)行適當(dāng)?shù)募庸?,然後再正式編譯。程式主體就是main函數(shù)。每一個C++根源程式都必須且只能有一個main函數(shù),作為程式的入口。注釋是程式員為程式語句所做的說明,是提高程式可讀性的一種手段。注釋一般分為兩種:序言性注釋和注解性注釋。13數(shù)據(jù)類型和運算式空類型void整型int字元型實型邏輯型bool單字符型char寬字元型w_char單精確度型float雙精度型double指針type*結(jié)構(gòu)struct枚舉enum類class非基本數(shù)據(jù)類型數(shù)據(jù)類型基本數(shù)據(jù)類型聯(lián)合union數(shù)組type[]14常量在程式運行過程中,值不能被改變的量稱為常量。常量定義格式為:const<數(shù)據(jù)類型><常量>=<運算式>;15變數(shù)在程式運行過程中,值可以被改變的量稱為變數(shù)。在C++中,任何一個變數(shù)在被使用之前必須被定義。定義格式為:<類型><變數(shù)名表>;16指針和引用指針也是一種變數(shù),指針變數(shù)專門用來存放其他數(shù)據(jù)在內(nèi)存的地址。是一種間接訪問變數(shù)或?qū)ο蟮姆椒?。引用是某個變數(shù)或?qū)ο蟮膭e名,是另一種訪問變數(shù)或?qū)ο蟮姆椒ā?lt;類型>*<變數(shù)>;<類型>&<引用名>=<變數(shù)名或?qū)ο竺?gt;;17數(shù)組數(shù)組是一個由多個同類型變數(shù)組成的集合。數(shù)組元素被引用的格式:<類型><數(shù)組名>[<常量運算式>][[<常量運算式>]…];<數(shù)組名>[<下標(biāo)>][[<下標(biāo)>]…]18結(jié)構(gòu)體C++允許用戶把邏輯上相關(guān)聯(lián)的數(shù)據(jù)組織起來,作為整體使用,這就是結(jié)構(gòu)體數(shù)據(jù)類型。struct<結(jié)構(gòu)類型變數(shù)名>{<類型> <成員名>;<類型> <成員名>;…};19運算符C++運算符包括算術(shù)運算符(+、-、*、/、%)、關(guān)係運算符(>、<、==、>=、<=、!=)、邏輯運算符(&&、||、!)、賦值運算符(=)、複合賦值運算符(+=、-=、*=、/=、%=等)、自加運算符(++)、自減運算符(--)、位運算符(&、^、|、~、<<、>>等)、條件運算符(?:)、逗號運算符(,)、作用域區(qū)分符(::)等。20運算式運算式是由運算符和運算元組成的式子。運算元包含了常量、變數(shù)、函數(shù)和其他一些命名的識別字。算術(shù)運算式關(guān)係運算式邏輯運算式條件運算式賦值運算式逗號運算式21動態(tài)存儲分配堆允許程式在運行時(而不是在編譯時)申請某個大小的記憶體空間。如果要在堆中分配記憶體空間,必須使用特定的函數(shù)或操作符。另外,若不再需要使用的動態(tài)記憶體空間則必須釋放。new運算符從堆中分配一塊與<類型>相適應(yīng)的存儲空間,若分配成功,將這塊記憶體空間的首地址存入<指針>,否則置<指針>的值為NULL(空指針值,即0)。delete操作符用來釋放<指針>指向的動態(tài)存儲空間。22程式的基本控制結(jié)構(gòu)按照結(jié)構(gòu)化程式設(shè)計方法的觀點,任何演算法功能都可以通過由程式模組組成的三種基本程式結(jié)構(gòu)的組合來實現(xiàn),它們是順序結(jié)構(gòu)、分支結(jié)構(gòu)、迴圈結(jié)構(gòu)

23函數(shù)一個C++程式是由若干個根源程式檔構(gòu)成,而一個根源程式檔是由若干個函數(shù)構(gòu)成,每個函數(shù)具有相對獨立的功能。一個根源程式可以由若干函數(shù)構(gòu)成,但有且僅有一個main函數(shù),函數(shù)與函數(shù)之間通過輸入?yún)?shù)和返回值來聯(lián)繫。根源程式從main函數(shù)開始執(zhí)行直到main函數(shù)結(jié)束,其他函數(shù)都是由main函數(shù)直接或間接地調(diào)用執(zhí)行。24函數(shù)定義定義函數(shù)的一般格式:<返回值類型><函數(shù)名>(<參數(shù)列表>){

<函數(shù)體>}25函數(shù)原型函數(shù)原型即函數(shù)聲明,用來描述函數(shù)的返回值和參數(shù)類型。C++規(guī)定:名字必須先說明後使用。因此,當(dāng)一個函數(shù)調(diào)用出現(xiàn)在函數(shù)定義之前,必須先對函數(shù)進(jìn)行原型說明。函數(shù)原型的功能:確定函數(shù)返回值的類型;確定函數(shù)參數(shù)的類型和個數(shù);函數(shù)名代表該函數(shù)的函數(shù)體以及函數(shù)完成的功能。<返回值類型><函數(shù)名>(<參數(shù)表>);26函數(shù)調(diào)用C++程式由若干函數(shù)構(gòu)成,各個函數(shù)的執(zhí)行通過函數(shù)的調(diào)用來完成的。在調(diào)用函數(shù)時,大多數(shù)情況下,主調(diào)函數(shù)和被調(diào)函數(shù)之間有數(shù)據(jù)傳遞關(guān)係。函數(shù)之間的數(shù)據(jù)傳遞是靠函數(shù)參數(shù)進(jìn)行,而對無參數(shù)函數(shù)的調(diào)用,沒有數(shù)據(jù)傳遞。在定義函數(shù)時,函數(shù)名後面括弧內(nèi)的變數(shù)名為“形式參數(shù)”(形參)。在調(diào)用函數(shù)時,函數(shù)名後面括弧內(nèi)的運算式為“實際參數(shù)”(實參)。27引入函數(shù)後,使用者只需要知道函數(shù)的功能和使用方法,而不必關(guān)心函數(shù)的內(nèi)部代碼,從而方便源代碼的共用;使用函數(shù),也可減少程式的冗餘和程式的目標(biāo)代碼。28內(nèi)聯(lián)函數(shù)函數(shù)調(diào)用有一定的時間和空間開銷,影響程式的執(zhí)行效率。特別是對於一些函數(shù)體代碼不是很大,但又頻繁地被調(diào)用的函數(shù),則引入內(nèi)聯(lián)函數(shù)。在程式編譯時,編譯系統(tǒng)將程式中出現(xiàn)內(nèi)聯(lián)函數(shù)調(diào)用的地方用函數(shù)體進(jìn)行替換。引入內(nèi)聯(lián)函數(shù)可以提高程式的運行效率,節(jié)省調(diào)用函數(shù)的時間開銷,是一種以空間換時間的方案。

內(nèi)聯(lián)函數(shù)的一般定義格式:inline返回值類型函數(shù)名(<參數(shù)列表>){函數(shù)體}29帶缺省參數(shù)的函數(shù)C++允許在定義函數(shù)時給其中的某個或某些形參指定缺省值(定義函數(shù)參數(shù)時賦初值),這樣,當(dāng)發(fā)生函數(shù)調(diào)用時,若指定實參值則用該值;如果省略了對應(yīng)位置上的實參的值時,則在執(zhí)行被調(diào)函數(shù)時,以該形參的缺省值進(jìn)行運算。引入缺省參數(shù)的目是為了讓編程簡單,讓編譯系統(tǒng)做更多的檢查錯誤工作,同時增強了函數(shù)的可重用性。30函數(shù)重載函數(shù)重載是指一個函數(shù)可以和同一作用域中的其他函數(shù)具有相同的名字,但這些同名函數(shù)的參數(shù)類型、參數(shù)個數(shù)、返回值、函數(shù)功能可以完全不同。編譯系統(tǒng)將根據(jù)函數(shù)參數(shù)的類型和個數(shù)來判斷使用哪一個函數(shù)。31作用域識別字有效性的範(fàn)圍稱識別字的作用域,又稱為識別字的“可見性”。識別字在某範(fàn)圍內(nèi)是“可見的”是指在該範(fàn)圍內(nèi)可以進(jìn)行訪問操作。C++的作用域範(fàn)圍為:局部作用域(塊作用域)函數(shù)作用域函數(shù)原型作用域檔作用域類作用域32數(shù)據(jù)類型C語言中內(nèi)置數(shù)據(jù)類型示例:--int可以對整數(shù)有:+,-,*,/,求模操作%.

可以用sizeof(),來求得其在特定的平臺上的大小,如4位元組.構(gòu)成數(shù)據(jù)類型的兩大要素:--存放數(shù)據(jù)對象需要的記憶體大小

--可使用得數(shù)據(jù)對象的操作或方法33自定義數(shù)組數(shù)據(jù)類型C++對數(shù)組類型提供了內(nèi)置支持,但只限於”只讀寫單個元素”的機制需要的功能可能有:--把一個數(shù)組副賦值給另一個數(shù)組;--對兩個數(shù)組進(jìn)行比較;--取得數(shù)組的大小;--數(shù)組內(nèi)元素的排序,等等34類

從語言角度來說,類是一種新的數(shù)據(jù)類型,而對象是具有這種類型的變數(shù)。類是一種將數(shù)據(jù)和作用於這些數(shù)據(jù)上的函數(shù)組合在一起的複雜數(shù)據(jù)類型,是可重用的基本單元。一個類就是一個用戶自定義數(shù)據(jù)類型。類是面向?qū)ο蟪淌皆O(shè)計的核心,利用它可以實現(xiàn)對象的抽象、數(shù)據(jù)和操作的封裝以及資訊的隱蔽。35類定義類定義一般分為說明部分和實現(xiàn)部分。說明部分是說明該類中的成員,實現(xiàn)部分是對成員函數(shù)的定義。類定義的一般格式如下class<類名>{public:<數(shù)據(jù)成員或成員函數(shù)的聲明>;private:<數(shù)據(jù)成員或成員函數(shù)的聲明>;說明部分protected:<數(shù)據(jù)成員或成員函數(shù)的聲明>;};<各個成員函數(shù)的定義>實現(xiàn)部分36訪問控制訪問許可權(quán)有三種類型:

private、public和protected。三種訪問許可權(quán)的成員與出現(xiàn)的先後順序無關(guān),並且允許多次出現(xiàn),但是一個成員只能具有一種訪問屬性。37成員函數(shù)的實現(xiàn)成員函數(shù)是類中描述行為的成員,同時也是對封裝的數(shù)據(jù)進(jìn)行操作的惟一途徑。類定義的格式中,一般在類中說明成員函數(shù)原型,在類外進(jìn)行成員函數(shù)的具體實現(xiàn),<各個成員函數(shù)的定義>是類的實現(xiàn)部分。同時,如果成員函數(shù)已經(jīng)在類中定義,則不需要在類外實現(xiàn)。需要注意的是,在類中定義的成員函數(shù)自動成為內(nèi)聯(lián)函數(shù)。38若在類體外實現(xiàn),則需要使用作用域運算符“::”,用它來標(biāo)識某個成員函數(shù)是屬於哪個類的,其定義格式如下:<返回值類型><類名>::<成員函數(shù)名>(<參數(shù)表>){<函數(shù)體>}39

對象對象的定義格式與普通變數(shù)相同。定義格式如下:<類名><對象名表>;

其中,<對象名表>中可以有一個或多個對象名。當(dāng)有多個對象名時,用逗號分隔。<對象名表>中還可以是指向?qū)ο蟮闹羔樏蛞妹部梢允菍ο髷?shù)組名。40類成員的訪問定義了類及其對象,就可以通過對象來使用其公有成員,從而達(dá)到對對象內(nèi)部屬性的訪問和修改。對象對其成員的訪問有圓點訪問形式和指針訪問形式。<對象名>.<公有成員><對象指針名>-><公有成員>41構(gòu)造函數(shù)和析構(gòu)函數(shù)類描述了一類對象的共同特徵,而對象是類的特例。每個對象區(qū)別於其他對象的地方就是依靠它自身屬性,即數(shù)據(jù)成員的值。對象在定義的時候可以進(jìn)行數(shù)據(jù)成員的設(shè)置,稱為對象的初始化。同樣,在對象使用結(jié)束時,還可以進(jìn)行一些相關(guān)的清理工作。C++中對象的初始化和清理工作,分別由兩個特殊的成員函數(shù)來完成,它們就是構(gòu)造函數(shù)和析構(gòu)函數(shù)。42構(gòu)造函數(shù)構(gòu)造函數(shù)的功能是在定義對象時被編譯系統(tǒng)自動調(diào)用來創(chuàng)建對象並初始化對象。其定義格式如下:<類名>::<類名>(<參數(shù)表>){

<函數(shù)體>}43構(gòu)造函數(shù)的特點構(gòu)造函數(shù)是成員函數(shù),函數(shù)體可寫在類體內(nèi),也可寫在類體外。構(gòu)造函數(shù)的函數(shù)名與類名相同,且不指定返回值類型,它有隱含的返回值,該值由編譯系統(tǒng)內(nèi)部使用。構(gòu)造函數(shù)可以沒有參數(shù),也可以有參數(shù),因此可以重載,即可以定義參數(shù)不同的多個構(gòu)造函數(shù)。每個類都必須有一個構(gòu)造函數(shù)。如果類中沒有顯式定義構(gòu)造函數(shù),則編譯系統(tǒng)自動生成一個缺省形式的構(gòu)造函數(shù),作為該類的公有成員。程式中不能直接調(diào)用構(gòu)造函數(shù),在定義對象時編譯系統(tǒng)自動調(diào)用構(gòu)造函數(shù)。44析構(gòu)函數(shù)析構(gòu)函數(shù)的功能是在對象的生存期即將結(jié)束的時刻,由編譯系統(tǒng)自動調(diào)用來完成一些清理工作。它的調(diào)用完成之後,對象也就消失了,相應(yīng)的記憶體空間也被釋放。析構(gòu)函數(shù)也是類的一個公有成員函數(shù),它的名稱是由類名前面加“~”構(gòu)成,也不指定返回值類型。和構(gòu)造函數(shù)不同的是,析構(gòu)函數(shù)不能有參數(shù),因此不能重載。45其定義格式如下:<類名>::~<類名>(){

<函數(shù)體>}46析構(gòu)函數(shù)的特點析構(gòu)函數(shù)是成員函數(shù),函數(shù)體可寫在類體內(nèi),也可以寫在類體外。析構(gòu)函數(shù)的函數(shù)名與類名相同,並在前面加“~”字元,用來與構(gòu)造函數(shù)加以區(qū)別。析構(gòu)函數(shù)不指定返回值類型。析構(gòu)函數(shù)沒有參數(shù),因此不能重載。一個類中只能定義一個析構(gòu)函數(shù)。每個類都必須有一個析構(gòu)函數(shù)。如果類中沒有顯式定義析構(gòu)函數(shù),則編譯系統(tǒng)自動生成一個缺省形式的析構(gòu)函數(shù),作為該類的公有成員。析構(gòu)函數(shù)在對象生存期結(jié)束前由編譯系統(tǒng)自動調(diào)用。47拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),它的功能是用一個已知的對象來初始化一個被定義的同類的對象??截悩?gòu)造函數(shù)的定義格式如下:48class<類名>{public:

<類名>(<參數(shù)表>);

//構(gòu)造函數(shù)

<類名>(const<類名>&<對象名>);//拷貝構(gòu)造函數(shù)…};<類名>::<類名>(const<類名>&<對象名>);//拷貝構(gòu)造函數(shù)的實現(xiàn){<函數(shù)體>}49拷貝構(gòu)造函數(shù)的特點拷貝構(gòu)造函數(shù)是成員函數(shù),函數(shù)體可寫在類體內(nèi),也可以寫在類體外??截悩?gòu)造函數(shù)名與類名相同,並且也不指定返回值類型??截悩?gòu)造函數(shù)只有一個參數(shù),並且是對同類對象的引用。每個類都必須有一個拷貝構(gòu)造函數(shù)。如果類中沒有顯式定義拷貝構(gòu)造函數(shù),則編譯系統(tǒng)自動生成一個缺省形式的拷貝構(gòu)造函數(shù),作為該類的公有成員??截悩?gòu)造函數(shù)在三種情況下由編譯系統(tǒng)自動調(diào)用。50靜態(tài)成員靜態(tài)成員是解決同一個類的不同對象之間的數(shù)據(jù)和函數(shù)共用問題。靜態(tài)成員是類的所有對象共用的成員,而不是某個對象的成員,它在對象中不占存儲空間,是屬於整個類的成員。靜態(tài)成員分為靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)。其定義格式為:static

<靜態(tài)成員的定義>;51靜態(tài)數(shù)據(jù)成員的初始化靜態(tài)數(shù)據(jù)成員必須進(jìn)行初始化。在程式一開始運行時靜態(tài)數(shù)據(jù)成員就必須存在,因為在程式運行中要調(diào)用,所以靜態(tài)數(shù)據(jù)成員不能在任何函數(shù)內(nèi)分配空間和初始化。最好在類的實現(xiàn)部分中完成靜態(tài)數(shù)據(jù)成員的初始化。靜態(tài)數(shù)據(jù)成員初始化與一般數(shù)據(jù)成員初始化不同,其格式如下:<數(shù)據(jù)類型><類名>::<靜態(tài)數(shù)據(jù)成員名>=<值>;52靜態(tài)成員的調(diào)用調(diào)用靜態(tài)成員時,採用如下格式:<類名>::<靜態(tài)成員>53友元根據(jù)封裝性,一般將類中的數(shù)據(jù)成員聲明為私有成員,外部可以通過類的公有成員函數(shù)對私有成員進(jìn)行訪問。但有時類體外的一些函數(shù)需要直接訪問類的數(shù)據(jù)成員,又不改變其數(shù)據(jù)成員的訪問許可權(quán),這時,需要定義友元。54友元的作用友元提供了不同類或?qū)ο蟮某蓡T函數(shù)之間、類的成員函數(shù)與普通函數(shù)之間進(jìn)行數(shù)據(jù)共用的機制。友元可以訪問類中所有成員,但不是類的成員。。友元雖然不是類的成員,但它是類的朋友,可以直接訪問類的所有成員。55友元的定義如果友元是普通函數(shù)或另一個類的成員函數(shù),稱為友元函數(shù);如果友元是一個類,則稱為友元類,友元類的所有成員函數(shù)都成為友元函數(shù)。友元函數(shù)和友元類在被訪問的類中聲明,其格式分別如下:friend<返回值類型><函數(shù)名>(<參數(shù)表>);friend<類名>;56繼承的概念類的繼承就是根據(jù)一個類創(chuàng)建一個新類的過程。新類自動具有已有類的所有成員,並可根據(jù)需要添加更多的成員。換個角度,從已有類產(chǎn)生新類的過程就是類的派生。通常將用來派生新類的類稱為基類,又稱為父類,而將派生出來的新類稱為派生類,又稱為子類。57派生類派生類是特殊的基類,基類是派生類的抽象描述。派生類繼承了基類的所有特性,但不等同於基類,否則就沒有派生的必要了。繼承的作用就是體現(xiàn)特殊與一般的關(guān)係,尋找有共性的事物間的差異,求其發(fā)展;另一個作用是代碼重用,從基類派生子類,無需修改基類的代碼,就可以直接調(diào)用基類的成員,而自己的代碼只需在派生類中實現(xiàn)即可。58派生類的定義class<派生類名>:<繼承方式><基類名>{<派生類新定義成員>};其中,<繼承方式>有三種:公有繼承、私有繼承和保護(hù)繼承,分別用關(guān)鍵字public、private和protected表示。缺省情況下為私有繼承。59派生類的生成過程分析派生新類的過程可知,派生類的生成經(jīng)歷了三個步驟:吸收基類成員改造基類成員添加派生類新成員60訪問許可權(quán)控制不論哪種繼承方式,派生類新定義成員均不能直接訪問基類的私有成員,只能通過基類的公有成員函數(shù)或保護(hù)成員函數(shù)訪問基類的私有數(shù)據(jù)成員,而基類的私有成員函數(shù)根本就不會繼承,更談不上使用。所以,除非僅限於本類使用,否則,一般不將成員函數(shù)定義為私有成員。61公有繼承的訪問許可權(quán)控制類的繼承方式為公有繼承時,在派生類中,繼承的基類的公有成員和保護(hù)成員的訪問屬性不變,而對基類的私有成員不可訪問。即基類的公有成員和保護(hù)成員被繼承後分別作為派生類的公有成員和保護(hù)成員,派生類的成員可以直接訪問它們,而派生類的成員無法訪問基類的私有成員。在類外,派生類的對象可以訪問繼承下來的基類公有成員。62私有繼承的訪問許可權(quán)控制當(dāng)類的繼承方式為私有繼承時,在派生類中,繼承的基類的公有成員和保護(hù)成員變?yōu)樗接谐蓡T,而對基類的私有成員不可訪問。即基類的公有成員和保護(hù)成員被繼承以後作為派生類的私有成員,派生類的成員可以直接訪問它們,而派生類的成員無法訪問基類的私有成員。在類外,派生類的對象無法訪問基類的所有成員。因此,私有繼承之後,基類的成員再也無法在以後的派生類中發(fā)揮作用,出於這種原因,一般不使用私有繼承方式。63保護(hù)繼承的訪問許可權(quán)控制當(dāng)類的繼承方式為保護(hù)繼承時,在派生類中,繼承的基類的公有成員和保護(hù)成員變?yōu)楸Wo(hù)成員,而對基類的私有成員不可訪問。即基類的公有成員和保護(hù)成員被繼承以後作為派生類的保護(hù)成員,派生類的成員可以直接訪問它們,而派生類的成員無法訪問基類的私有成員。在類外,派生類的對象無法訪問基類的所有成員。64派生類的構(gòu)造函數(shù)派生類構(gòu)造函數(shù)的一般格式如下:<派生類名>(<總參數(shù)表>):<基類名>(<參數(shù)表1>),<子對象名>(<參數(shù)表2>){<派生類數(shù)據(jù)成員的初始化>};65派生類的析構(gòu)函數(shù)

由於基類的析構(gòu)函數(shù)也不能被繼承,因此,派生類的析構(gòu)函數(shù)必須通過調(diào)用基類的析構(gòu)函數(shù)來做基類的一些清理工作。調(diào)用順序是:先調(diào)用派生類的析構(gòu)函數(shù),再調(diào)用對象成員類的析構(gòu)函數(shù)(如果有對象成員),最後調(diào)用基類的析構(gòu)函數(shù),其順序與調(diào)用構(gòu)造函數(shù)的順序相反。66多繼承根據(jù)派生類繼承基類的個數(shù),將繼承分為單繼承和多繼承。當(dāng)派生類只有一個基類時稱為單繼承,以上所討論的都是單繼承。當(dāng)派生類有多個基類時稱為多繼承。單繼承可以看作是多繼承的一個特例,多繼承可以看作是多個單繼承的組合,它們有很多相同特性。67多繼承的定義格式

多繼承可以看作是單繼承的擴(kuò)展,派生類與每個基類之間的關(guān)係可以看作是一個單繼承。在C++中,多繼承的定義格式如下:class<派生類名>:<繼承方式><基類名1>,…,<繼承方式><基類名n>{<派生類新定義成員>};68多繼承的構(gòu)造函數(shù)<派生類名>(<總參數(shù)表>):<基類名1>(<參數(shù)表1>),…,<基類名n>(<參數(shù)表n>){<派生類數(shù)據(jù)成員的初始化>};69虛基類在派生類中對基類成員的訪問應(yīng)該是唯一的。但是,在多繼承方式下,可能造成對基類中某個成員的訪問出現(xiàn)不唯一的情況,稱為對基類成員訪問的二義性問題。解決的辦法是用作用域運算符“::”進(jìn)行限定,另外還可以設(shè)置虛基類來解決此問題。70虛基類的定義格式class<派生類名>:virtual<繼承方式><共同基類名>71多態(tài)性的概念多態(tài)性是指具有相似功能的不同函數(shù)使用同一個名稱來實現(xiàn),從而可以使用相同的調(diào)用方式來調(diào)用這些具有不同功能的同名函數(shù)的特性。C++的多態(tài)性是指對同一條消息,被不同類型的對象接收將產(chǎn)生不同的行為。多態(tài)性是實現(xiàn)“一種介面,多種方法”的技術(shù)。這裏的“一種介面”是指相同函數(shù)名,而“多種方法”是指多種函數(shù)實現(xiàn)。72多態(tài)的類型C++支持的多態(tài)可以分為四種類型:重載多態(tài)強制多態(tài)包含多態(tài)參數(shù)多態(tài)73聯(lián)編多態(tài)性的實現(xiàn)過程中,確定調(diào)用哪個同名函數(shù)的過程就是聯(lián)編(binding),又稱綁定。聯(lián)編是指電腦程式自身彼此關(guān)聯(lián)的過程,也就是把一個識別字名和一個存儲地址聯(lián)繫在一起的過程。用面向?qū)ο蟮男g(shù)語講,就是把一條消息和一個對象的方法相結(jié)合的過程。按照聯(lián)編進(jìn)行的階段的不同,可以分為靜態(tài)聯(lián)編和動態(tài)聯(lián)編,這兩種聯(lián)編過程分別對應(yīng)著多態(tài)性的兩種實現(xiàn)方式。74靜態(tài)聯(lián)編在編譯階段完成的聯(lián)編稱為靜態(tài)聯(lián)編。在編譯過程中,編譯系統(tǒng)可以根據(jù)類型匹配等特徵來確定程式中調(diào)用操作與執(zhí)行某個同名函數(shù)實現(xiàn)之間的關(guān)係,即確定某一個同名函數(shù)到底是要調(diào)用哪一段函數(shù)實現(xiàn)代碼。函數(shù)重載和運算符重載就是通過靜態(tài)聯(lián)編方式實現(xiàn)的編譯時的多態(tài)的體現(xiàn)。靜態(tài)聯(lián)編的優(yōu)點是函數(shù)調(diào)用速度快、效率較高,缺點是編程不夠靈活75動態(tài)聯(lián)編只有在運行程式時才能確定將要調(diào)用的函數(shù)。這種在運行階段進(jìn)行的聯(lián)編稱為動態(tài)聯(lián)編。動態(tài)聯(lián)編的優(yōu)點是提供了更好的編程靈活性、問題抽象性和程式易維護(hù)性,缺點是與靜態(tài)聯(lián)編相比,函數(shù)調(diào)用速度慢。76虛函數(shù)虛函數(shù)是動態(tài)聯(lián)編的基礎(chǔ)。虛函數(shù)是非靜態(tài)的成員函數(shù),經(jīng)過派生之後,虛函數(shù)在類族中可以實現(xiàn)運行時的多態(tài)性。77虛函數(shù)的聲明虛函數(shù)是一個在某基類中聲明為virtual並在一個或多個派生類中被重新定義的成員函數(shù)。聲明虛函數(shù)的格式如下:virtual<返回值類型><函數(shù)名>(<參數(shù)表>);78虛函數(shù)的使用如果某類中的一個成員函數(shù)被說明為虛函數(shù),這就意味著該成員函數(shù)在派生類中可能有不同的函數(shù)實現(xiàn)。當(dāng)使用對象指針或?qū)ο笠谜{(diào)用虛函數(shù)時,採用動態(tài)聯(lián)編方式,即在運行時進(jìn)行關(guān)聯(lián)或綁定。79抽象類抽象類是一種特殊的類,專門作為基類派生新類,自身無法實例化,也就是無法定義抽象類的對象,它為一類族提供統(tǒng)一的操作介面。抽象類是為了抽象和設(shè)計的目的而建立的,可以說,建立抽象類,就是為了通過它多態(tài)地使用其中的成員函數(shù)。抽象類處於類層次的上層,由它派生新類,然後再實例化。80純虛函數(shù)在C++中,有一個僅為該多態(tài)機制提供一個介面而沒有任何實體定義的函數(shù),被稱為純虛函數(shù)。聲明純虛函數(shù)的一般格式如下:virtual<返回值類型><函數(shù)名>(<參數(shù)表>)=0;81

抽象類抽象類只能用作其他類的基類,不能建立抽象類對象。抽象類不能用作參數(shù)類型、函數(shù)返回值類型或顯式轉(zhuǎn)換的類型,但可以說明指向抽象類的指針或引用,該指針或引用可以指向抽象類的派生類,進(jìn)而實現(xiàn)多態(tài)性。抽象類的主要作用是將有關(guān)的派生類組織在一個繼承層次結(jié)構(gòu)中,由抽象類為它們提供一個公共的根,相關(guān)的派生類就從這個根派生出來。82運算符重載運算符重載就是賦予系統(tǒng)預(yù)定義的運算符多重含義,使同一個運算符作用於不同類型的數(shù)據(jù)導(dǎo)致不同的行為。運算符重載的實質(zhì)就是函數(shù)重載。運算符重載使得系統(tǒng)預(yù)定義的運算符能作用於用戶自定義類型的數(shù)據(jù),進(jìn)行類似運算。83運算符重載規(guī)則C++的運算符除了少數(shù)幾個之外,全部可以重載,而且只能重載已有的運算符,不可臆造新的運算符。重載之後運算符的優(yōu)先順序和結(jié)合性都不會改變,並且要保持原運算符的語法結(jié)構(gòu)。參數(shù)和返回值類型可以重新說明。運算符重載是針對新類型數(shù)據(jù)的實際需要,對原有運算符進(jìn)行適當(dāng)?shù)母脑?。運算符重載有兩種方式:重載為類的成員函數(shù)和重載為類的友元函數(shù)。84當(dāng)運算符重載為類的成員函數(shù)時,由於單目運算除了對象以外沒有其他參數(shù),因此重載“++”和“--”運算符,不能區(qū)分是首碼操作還是尾碼操作。C++約定,在參數(shù)表中放上一個整型參數(shù),表示尾碼運算符。85運算符重載為成員函數(shù)運算符重載為類的成員函數(shù)的一般格式如下:其中,operator是定義運算符重載函數(shù)的關(guān)鍵字。<參數(shù)表>中最多有一個形參。<返回值類型>operator<運算符>(<參數(shù)表>){<函數(shù)體>;}86範(fàn)本是面向?qū)ο蟪淌皆O(shè)計提高軟體開發(fā)效率的一個重要手段,是C++語言一個重要特徵。採用範(fàn)本編程使程式員能夠迅速建立具有類型安全的類庫集合和函數(shù)集合,它的實現(xiàn)提高了代碼的重用性,更方便大規(guī)模地軟體開發(fā)。本章先介紹了範(fàn)本的概念,再介紹了函數(shù)範(fàn)本和類範(fàn)本的定義與使用,以便能正確使用C++系統(tǒng)中標(biāo)準(zhǔn)範(fàn)本庫STL。87範(fàn)本的概念範(fàn)本作為一種C++語言支持參數(shù)化多態(tài)性的工具,可以為邏輯功能相同而類型不同的數(shù)據(jù)程式提供一種代碼共用的機制。一個範(fàn)本並非一個實實在在的類或函數(shù),僅僅是一個類或函數(shù)的描述,是參數(shù)化的函數(shù)和類。範(fàn)本分為函數(shù)範(fàn)本和類範(fàn)本,通過參數(shù)實例化可以再構(gòu)造出具體的函數(shù)或類,稱為範(fàn)本函數(shù)和範(fàn)本類。88函數(shù)範(fàn)本函數(shù)範(fàn)本的定義格式:template<類型參數(shù)表><返回值類型><函數(shù)名>(<參數(shù)表>){<函數(shù)體>

}89範(fàn)本函數(shù)的生成函數(shù)範(fàn)本是對一組函數(shù)的描述,它以任意類型T為參數(shù)及函數(shù)返回值。它不是一個實實在在的函數(shù),編譯系統(tǒng)並不產(chǎn)生任何執(zhí)行代碼。當(dāng)編譯系統(tǒng)在程式中發(fā)現(xiàn)有與函數(shù)範(fàn)本中相匹配的函數(shù)調(diào)用時,便生成一個重載函數(shù),該重載函的函數(shù)體與函數(shù)範(fàn)本的函數(shù)體相同。該重載函數(shù)稱為範(fàn)本函數(shù)。它是函數(shù)範(fàn)本的一個具體實例,只處理一種惟一的數(shù)據(jù)類型。90類範(fàn)本定義類範(fàn)本的一般格式:template<類型參數(shù)表>class<類範(fàn)本名>{<類成員的聲明>};91類範(fàn)本中的成員函數(shù)的定義可以放在類範(fàn)本的定義體中(此時與類中的成員函數(shù)的定義方法一致)也可以放在類範(fàn)本的外部定義成員函數(shù),此時成員函數(shù)的定義格式如下:template<類型參數(shù)表><返回值類型><類範(fàn)本名><類型名表>::<函數(shù)名>(<參數(shù)表>){<函數(shù)體>}92類範(fàn)本的使用利用類範(fàn)本定義的只是對類的描述,它本身還不是一個實實在在的類。要定義類範(fàn)本的對象(即實例),需要用下列格式的語句:類範(fàn)本名<實際的類型>類範(fàn)本名<實際的類型><對象名>[(實際參數(shù)表)];93標(biāo)準(zhǔn)範(fàn)本庫STLSTL是C++標(biāo)準(zhǔn)庫中的重要一員,利用STL開發(fā)程式可以提高代碼的重用性,讓程式更加穩(wěn)定,便於維護(hù),提高編寫程式的效率。STL是StandardTemplateLibrary的縮寫,即標(biāo)準(zhǔn)範(fàn)本庫。它是由泛型演算法和數(shù)據(jù)結(jié)構(gòu)組成的通用庫。在運用STL之前,必須掌握範(fàn)本的使用。94STL的組成STL主要由六大部分組成:迭代器(iterators)演算法(algorithms)容器(containers)函數(shù)對象(functionobjects)記憶體分配器(allocators)適配器(adapter)95流的概念在C++中,將數(shù)據(jù)從一個對象到另一個對象的流動抽象為“流”。流動的方向不同,構(gòu)成輸入/輸出流,即I/O流。在C++程式中,數(shù)據(jù)可以從鍵盤流入到程式,也可以從程式流向螢?zāi)换虼牌瑱n。從流中獲取數(shù)據(jù)的操作稱為提取操作向流中添加數(shù)據(jù)的操作稱為插入操作。數(shù)據(jù)的輸入/輸出就是通過I/O流來實現(xiàn)的。96C++編譯系統(tǒng)提供的I/O流庫含有兩個平行基類:streambuf和ios,所有的流類都是由它們派生出來的。ios類有4個直接派生類,即輸入流類istream、輸出流類ostream、檔流類fstreambase、串流類strstreambase,這4種流作為流庫中的基本流類。97I/O流庫中各個類之間的層次關(guān)係stdiostreamiosistrstreamistreamifstreamistream_withassignostreamfstreamostream_withassignstrstreamiostreamofstreamostrstreamstreambufstrstreambuffilebufstdiobuffstreambasestrstreambase98非格式化輸入/輸出非格式化輸入/輸出就是按系統(tǒng)預(yù)定義的格式進(jìn)行的輸入/輸出。按默認(rèn)約定,每個C++程式都能使用標(biāo)準(zhǔn)I/O流,如標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出。cin用來處理標(biāo)準(zhǔn)輸入,即鍵盤輸入;cout用來處理標(biāo)準(zhǔn)輸出,即螢?zāi)惠敵?。它們被定義在iostream.h頭檔中。在使用cout和cin前,要用編譯預(yù)處理命令將所使用的頭檔包含到根源程式中,其格式如下:#include<iostream.h>99非格式化輸出“<<”是預(yù)定義的插入運算符,作用在流類對象cout上,實現(xiàn)默認(rèn)格式的螢?zāi)惠敵?。使用cout輸出運算式值到螢?zāi)簧系母袷饺缦拢?/p>

cout<<E1<<E2<<…<<Em;其中,E1、E2、…、Em為均為運算式。功能是計算各運算式的值,並將結(jié)果輸出到螢?zāi)划?dāng)前游標(biāo)位置處。cout是ostream流類的對象,它在iostream.h頭檔中作為全局對象定義:

ostreamcout(stdout);其中,stdout表示標(biāo)準(zhǔn)輸出設(shè)備名(螢?zāi)唬?00非格式化輸入“>>”是預(yù)定義的提取運算符,作用在流類對象cin上,實現(xiàn)默認(rèn)格式的鍵盤輸入。使用cin將數(shù)據(jù)輸入到變數(shù)的格式如下:

cin>>V1>>V2>>…>>Vn;其中,V1、V2、…、Vn都是變數(shù)。功能是暫停執(zhí)行程式,等待用戶從鍵盤輸入數(shù)據(jù),各數(shù)據(jù)間用空格或Tab鍵分隔,輸入數(shù)據(jù)類型要與接受變數(shù)類型一致,輸完後,按回車鍵結(jié)束。cin是istream流類的對象,它在iostream.h頭檔中作為全局對象定義:

istreamcin(stdin);其中,stdin表示標(biāo)準(zhǔn)輸入設(shè)備名(鍵盤)。101格式化輸入/輸出C++提供了兩種進(jìn)行輸入/輸出格式化的方法:一種是用ios類成員函數(shù)進(jìn)行格式化。另一種是用專門的操作符函數(shù)進(jìn)行格式化。102

用ios類成員函數(shù)格式化ios類成員函數(shù)主要是通過對狀態(tài)標(biāo)誌、輸出寬度、填充字元以及輸出精度的操作來完成輸入/輸出格式化。枚舉量定義在ios類中,因此引用時必須包含ios::首碼。使用時應(yīng)該全部用符號名,絕不要用數(shù)值。103用ios成員函數(shù)對狀態(tài)標(biāo)誌進(jìn)行操作ios類有3個成員函數(shù)可以對狀態(tài)標(biāo)誌進(jìn)行操作,並且定義了一個long型數(shù)據(jù)成員記錄當(dāng)前狀態(tài)標(biāo)誌。這些狀態(tài)標(biāo)誌可用位或運算符“|”進(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è)置輸出寬度,並返回原來的輸出寬度;第二種形式是返回當(dāng)前輸出寬度,輸出寬度為0。105設(shè)置填充字元填充字元的作用是當(dāng)輸出值不滿輸出寬度時用填充字元來填充,默認(rèn)填充字元為空格。它與width()函數(shù)配合使用,否則沒有意義。設(shè)置填充字元函數(shù)有兩種形式,其格式分別如下:

charios::fill(charch)charios::fill()第一種形式是重新設(shè)置填充字元,並返回設(shè)置前的填充字元;第二種形式是返回當(dāng)前的填充字元。106設(shè)置輸出精度設(shè)置浮點數(shù)輸出精度有兩種形式,其格式分別如下:

intios::precision(intp)intios::precision()第一種形式是重新設(shè)置輸出精度,並返回設(shè)置前的輸出精度;第二種形式是返回當(dāng)前的輸出精度。107用操作符函數(shù)格式化為了不直接以標(biāo)誌位的方式去處理流的狀態(tài),c++標(biāo)準(zhǔn)庫提供了標(biāo)準(zhǔn)的操作符函數(shù)專門操控這些狀態(tài)。這組函數(shù)不屬於任何類成員,定義在iomanip.h頭檔中。將它們用在提取運算符“>>”或插入運算符“<<”後面來設(shè)定輸入/輸出格式,即在讀寫對象之間插入一個修改狀態(tài)的操作。其中有些函數(shù)沒有參數(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++把檔看作是一個字元(位元組)的序列,即由一個個字元(位元組)順序組成。根據(jù)數(shù)據(jù)的組織形式,可分為ASCII碼檔和二進(jìn)位檔。ASCII碼檔又稱為文本檔,它的每一個位元組存放一個ASCII碼,代表一個字元。二進(jìn)位檔是把記憶體中的數(shù)據(jù)按其在內(nèi)存中的存儲形式原樣輸出到磁片檔存放。110C++有三種檔流類:輸入/輸出檔流類fstream輸入檔流類ifstream輸出檔流類ofstream它們分別從I/O流中的iostream、istream、ostream流類中派生而來。這些檔流類都定義在fstream.h頭檔中,因此,要使用檔流類,必須在程式開始包含該頭檔。111C++中進(jìn)行檔操作的一般步驟為檔定義一個流類對象;使用open()函數(shù)建立(或打開)檔。如果檔不存在,則建立該檔;如果磁片上已存在該檔,則打開該檔;進(jìn)行讀寫操作。在建立(或打開)的檔上執(zhí)行所要求的輸入/輸出操作。一般來說,在內(nèi)存與外設(shè)的數(shù)據(jù)傳輸中,由記憶體到外設(shè)稱為輸出或?qū)?,反之則稱為輸入或讀;使用close()函數(shù)關(guān)閉檔。當(dāng)完成操作後,應(yīng)把打開的檔關(guān)閉,避免誤操作。112在C++中,打開一個檔就是將這個檔與一個流建立關(guān)聯(lián);關(guān)閉一個檔就是取消這種關(guān)聯(lián)。open()函數(shù)的原型在fstream.h中定義。另外,在fstream、ifstream和ofstream流類中均有定義。其原型為:voidopen(char*filename,intmod,intaccess);其中第一個參數(shù)是用來傳遞檔案名;第二個參數(shù)的值決定檔的使用方式,如表7-4所示;第三個參數(shù)的值決定檔的訪問方式。113異常處理概述

在程式能正確支持所設(shè)計的正常情況之後,再添加語句來處理異常情況,這種思想就是異常處理。在C++中專門提供了這種機制,程式員在編寫程式的時候首先需要假裝不會產(chǎn)生任何異常寫好用於處理正常情況的語句,之後,利用C++的異常處理機制,添加用於處理異常情況的語句。114異常處理實現(xiàn)

C++語言提供對處理異常情況的內(nèi)部支持。try,throw和catch語句就是C++語言中用於實現(xiàn)異常處理的機制。有了C++異常處理,程式可以向更高的執(zhí)行上下文傳遞意想不到的事件,從而使程式能更好地從這些異常事件中恢復(fù)過來。115異常處理的語法try-throw-catch是拋出和捕獲異常的基本機制。Throw語句拋出異常(一個值),catch捕獲異常。拋出一個異常後,try塊會終止,轉(zhuǎn)而執(zhí)行catch塊中的語句。catch塊結(jié)束之後,會繼續(xù)執(zhí)行catch塊之後的語句(前提是catch塊中沒有終止程式或者執(zhí)行另外一些特殊的操作)。如果try塊中沒有拋出異常,那麼在try塊結(jié)束之後,程式將從catch塊之後的語句繼續(xù)執(zhí)行。換言之,如果沒有拋出異常,catch塊會被忽略。116try塊

如果在函數(shù)內(nèi)直接用throw拋出一個異常(或在函數(shù)調(diào)用時拋出一個異常),將在異常拋出時退出函數(shù)。如果不想在異常拋出時退出函數(shù),可以在函數(shù)體內(nèi)創(chuàng)建一個特殊塊用於解決程式中潛在的錯誤,在這個塊中可以測試各種錯誤發(fā)生的可能性,通常稱為測試塊,它由關(guān)鍵字try引導(dǎo)。其定義格式如下:try{<語句>}117拋出異常

通常將拋出的值直接稱為一個異常,所以執(zhí)行throw語句就稱為拋出異常,可以拋出任意類型的一個值。其定義的格式如下:

throw<拋出值的運算式>

執(zhí)行throw語句時,週邊的try塊就會停止執(zhí)行。如果try塊之後跟有一個合適的catch塊,那麼控制權(quán)就會轉(zhuǎn)交給那個catch塊。一般說來,throw語句幾乎肯定要嵌入一個分支語句(比如if語句)中。118捕獲異常

拋出一個異常後,週邊的try塊會停止執(zhí)行,並開始執(zhí)行另一個部分的語句,也就是catch塊。執(zhí)行catch的過程稱為捕獲異?;蛘弋惓L幚?。一個異常被拋出以後,最終應(yīng)該由某個catch塊來處理。119一般說來,catch塊參數(shù)主要完成兩件事情:catch塊參數(shù)前要加一個類型名,表示catch塊可以捕獲什麼類型的異常拋出值;catch塊參數(shù)為捕獲的異常拋出值指定了一個名稱,所以在catch塊中,又可以對這個異常拋出值進(jìn)行相應(yīng)的處理。120Windows編程基礎(chǔ)Windows操作系統(tǒng)是一個多任務(wù)、面向?qū)ο蟮膱D形操作系統(tǒng)。在Windows操作環(huán)境中,Windows應(yīng)用程式採用“基於消息的事件驅(qū)動”運行機制,這是它與過去的面向過程的應(yīng)用程式機制的不同之處。121窗口窗口是由應(yīng)用程式創(chuàng)建的一個用於接收用戶輸入和顯示輸出的矩形區(qū)域。窗口由“非客戶區(qū)”和“客戶區(qū)”組成。非客戶區(qū)由系統(tǒng)繪製,包括菜單、工具欄、最大化按鈕等??蛻魠^(qū)由應(yīng)用程式繪製,用於輸出數(shù)據(jù)和接受用戶的輸入。Windows應(yīng)用程式可以有多個窗口,每一個窗口都可以具有不同的功能。122事件和消息Windows操作環(huán)境中,無論是系統(tǒng)產(chǎn)生的動作或是用戶運行應(yīng)用程式產(chǎn)生的動作,都稱為事件產(chǎn)生的消息。Windows應(yīng)用程式利用消息與其他的Windows應(yīng)用程式及Windows系統(tǒng)進(jìn)行資訊交換。Windows的消息由三部分組成:消息號、字參數(shù)和長參數(shù)。消息號是預(yù)先定義的消息名標(biāo)誌符字參數(shù)和長參數(shù)是與消息號相關(guān)的值,提供一些附加資訊。123句柄Windows應(yīng)用程式中,句柄是標(biāo)識諸如菜單、圖示、窗口、記憶體塊、輸出設(shè)備等對象的識別字號,Windows系統(tǒng)的各種資源都是通過句柄來訪問的。句柄是作為Windows系統(tǒng)內(nèi)部表的索引值來使用的,而並非對象所在的記憶體地址。通過句柄只能夠安全的訪問對象,而不能直接訪問對象的內(nèi)部結(jié)構(gòu)。124GDI簡介許多MS-DOS程式都直接向視頻存儲區(qū)或印表機端口輸送數(shù)據(jù),這樣做就需要為不同的輸出設(shè)備編寫不同的程式。Windows提供了一個抽象的圖形介面介面,稱為圖形設(shè)備介面,或簡稱GDI。它組成了Windows操作系統(tǒng)的核心部分。125設(shè)備環(huán)境設(shè)備環(huán)境(DeviceContext),也被稱為DC,是由GDI保存的一個數(shù)據(jù)結(jié)構(gòu),設(shè)備環(huán)境包含了輸出設(shè)備的繪圖特徵。不同設(shè)備有不同的設(shè)備環(huán)境,在輸出設(shè)備上輸出的先決條件是獲得該設(shè)備的設(shè)備環(huán)境。126畫筆畫筆指的是一種用於畫線及繪製有形邊框的工具,用戶可以指定它的顏色及寬度,並且可以指定它畫實線、點線或虛線等。畫刷定義了一種位圖形式的像素,利用它可對封閉區(qū)域內(nèi)部填充顏色或樣式。字體是一種具有某種風(fēng)格和尺寸的所有字元的完整集合。127資源游標(biāo)、位圖、對話框和菜單都是資源。資源即數(shù)據(jù),包含在應(yīng)用程式的.exe檔中。當(dāng)Windows把程式裝入記憶體執(zhí)行的時候,它通常將資源留在磁片上。只有當(dāng)Windows需要某一資源時,它才將資源裝入記憶體。資源在資源描述檔中定義。資源描述檔是以.rc為擴(kuò)展名的ASCII碼檔。資源描述檔可以包含用ASCII碼表示的資源,也可以引用其他資源描述檔(ASCII或二進(jìn)位檔)。128Windows環(huán)境下的資源主要有以下幾類:加速鍵、工具欄、游標(biāo)、對話框、圖示、字串和菜單等。VisualC++為所有類型的資源都提供了資源編輯器進(jìn)行可視化的編輯。129Windows編程中的數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)描述MSG應(yīng)用程式消息的結(jié)構(gòu)WNDCLASS定義窗口類PAINTSTRUCT定義窗口用戶域的繪製消息RECT定義矩形130用MFC創(chuàng)建Windows應(yīng)用程式MFC的框架結(jié)構(gòu)提供如下優(yōu)點:MFC按照C++類的層次形式組織在一起,類封裝了WindowsAPI函數(shù)並提供Windows應(yīng)用程式常見任務(wù)的缺省處理代碼。幾個基類提供一般功能,由基類派生的類實現(xiàn)更具體的行為。MFC提供了文檔和視圖模型以實現(xiàn)數(shù)據(jù)和顯示的分離。文檔類(Document)用來維護(hù)、管理數(shù)據(jù),包括數(shù)據(jù)的讀取、存儲與修改;視圖類(View)用來接收並顯示數(shù)據(jù),將這些數(shù)據(jù)交給文檔類來處理。MFC庫提供了自動消息處理功能。MFC的框架結(jié)構(gòu)通過消息映射機制,將Windows消息直接映射到—個成員函數(shù)進(jìn)行處理,簡化了消息的處理方式。131MFC類的層次結(jié)構(gòu)MFC類庫是一個功能強大、結(jié)構(gòu)複雜和龐大的類庫。MFC的類可以分為兩種:從CObject派生的類及非CObject派生類。MFC有100種以上的類。132Windows應(yīng)用程式類型用VisualC++創(chuàng)建MFC程式的典型結(jié)構(gòu)一共有三種:基於單文檔的應(yīng)用程式基於多文檔的應(yīng)用程式基於對話框的應(yīng)用程式133創(chuàng)建單文檔應(yīng)用程式MFC的文檔/視圖結(jié)構(gòu)將Windows應(yīng)用程式的功能劃分在不同的類中。利用MFC提供的運行機制和消息傳遞機制,構(gòu)成應(yīng)用程式的類通過傳遞消息、調(diào)用介面函數(shù),共同完成程式的功能。134AppWizard嚮導(dǎo)創(chuàng)建的類和文件AppWizard嚮導(dǎo)為生成的派生類創(chuàng)建單獨的原始檔案,缺省情況下,類名和類原始檔案名是基於專案名的(可以在AppWizard嚮導(dǎo)創(chuàng)建應(yīng)用程式過程中指定其他名稱)。AppWizard嚮導(dǎo)為單文檔應(yīng)用程式創(chuàng)建4個派生類和其他一些檔。這4個類分別是文檔類、視圖類、主框架窗口類和應(yīng)用程式類。135應(yīng)用程式的運行機制MFC應(yīng)用程式有自己特殊的運行機制,下麵以WinHello程式為例,列出應(yīng)用程式的執(zhí)行過程。用CWinApp的構(gòu)造函數(shù);程式入口函數(shù)WinMain接受控制;WinMain調(diào)用應(yīng)用程式類的InitInstance函數(shù);WinMain進(jìn)入消息迴圈;WinMain退出,程式中止。136消息處理機制MFC應(yīng)用程式與其他任何Windows程式一樣,也使用消息驅(qū)動機制,但MFC提供的消息處理機制使得消息的處理更加容易。MFC中消息可以分為三類:Windows消息:包括以WM_開頭的消息,但WM_COMMAND除外。Windows消息由窗口和視圖處理。這種消息通常附帶一些參數(shù)傳遞給處理函數(shù),這些參數(shù)為處理函數(shù)正確地處理消息提供了必要的資訊??丶ㄖⅲ寒?dāng)控件的狀態(tài)發(fā)生改變(例如用戶利用利用控件進(jìn)行輸入)時,控件就會向其父窗口發(fā)送控件通知消息。MFC對控件通知消息的傳遞方式與其他以WM_開頭的Windows消息一樣,但BN_CLICKED是個例外,該消息的傳遞方式與命令消息的傳遞機制一樣。命令消息:包括來自於菜單、工具欄中的按鈕和加速鍵等用戶介面對象的WM_COMMAND通知消息。137

輸入輸出處理輸入輸出處理是應(yīng)用程式最基本的功能。Windows應(yīng)用程式通過GDI提供的繪圖函數(shù)在窗口的客戶區(qū)輸出數(shù)據(jù),通過對鍵盤消息和滑鼠消息的回應(yīng),完成對用戶輸入的處理。138文本輸出文本輸出函數(shù)鍵盤字元消息滑鼠139虛擬鍵代碼鍵盤類型根據(jù)語言或國家的不同而不同,為了避免依賴於特定國家的鍵盤佈局虛擬鍵代碼Windows識別字鍵盤VK_INSERTInsert(插入鍵)VK_LEFT↑左箭頭鍵VK_NEXTPageDown鍵VK_BACKBackspace鍵VK_RETURNEnter鍵140滑鼠消息當(dāng)用戶移動滑鼠或釋放鬆開滑鼠按鈕時,將產(chǎn)生滑鼠消息?;笙⒖梢苑殖蓛深悾嚎蛻魠^(qū)滑鼠消息和非客戶區(qū)滑鼠消息。非客戶區(qū)包括窗口的邊界、標(biāo)題欄、菜單、滾動條、最大化最小化按鈕??蛻魠^(qū)滑鼠消息指的是滑鼠在這些區(qū)域的操作而產(chǎn)生的消息。這種消息一般由系統(tǒng)處理。應(yīng)用程式主要處理滑鼠在客戶區(qū)的操作而產(chǎn)生的消息。141菜單菜單(Menu)以可視的方式提供了對應(yīng)用程式功能的選擇,是用戶與應(yīng)用程式之間進(jìn)行交互的主要方式之一。142菜單簡介菜單主要有彈出式和下拉式兩種。彈出式菜單可以出現(xiàn)在螢?zāi)坏娜魏挝恢?,是為了回?yīng)滑鼠右鍵按鈕而啟動彈出式菜單。下拉式菜單可以看成由一個頂層菜單和彈出式菜單裝配而成。當(dāng)選擇頂層菜單項時,下拉出一個子菜單,子菜單中是具體的菜單項。在子菜單項中選擇時,還可以再下拉出另一個子菜單,形成級聯(lián)菜單。143菜單的建立和實現(xiàn)菜單編輯器的使用。為程式加入菜單的操作分為以下幾步:通過菜單編輯器生成菜單介面;建立菜單項和消息處理函數(shù)的映射;在處理函數(shù)中添加菜單項功能代碼。144滾動條滾動功能使用戶可以閱讀和編輯大於視圖窗口的任何東西--無論是文本、表格、資料庫記錄還是圖像。只要它所需的空間超出了客戶區(qū)域所能提供的空間,就可以使用滾動條。145在程式中加入滾動功能CScrollView是從CView類派生的專用視圖類。從CScrollView類派生的視圖類自動將滾動條加入視圖窗口,並提供了支持滾動操作的大多數(shù)代碼。所有的GDI函數(shù)都使用邏輯座標(biāo),Windows將GDI函數(shù)中指定邏輯座標(biāo)映射為設(shè)備座標(biāo)。146在程式中實現(xiàn)分割功能

動讓用戶閱讀超過窗口的長文檔,但用戶也只能看文檔的某一部分,如果用戶想同時閱讀文檔中相隔很遠(yuǎn)的部分,就只能同時打開兩個窗口,分別滾動到相應(yīng)的位置閱讀。Windows提供窗口分割功能,實現(xiàn)同時閱讀長文檔的不同部分。在窗口的垂直滾動條的上部和水準(zhǔn)滾動條的底部,存在一個分割框區(qū)域,雙擊分割框或拖動分割框到所需的位置,窗口被垂直或水準(zhǔn)地分成兩個獨立的窗口,被分割後的窗口稱為面板,用以顯示同一文檔或圖形的不同部分。147工具欄和狀態(tài)欄工具欄和狀態(tài)欄是Widows應(yīng)用程式中常見的用戶介面。工具欄是一種快捷操作的工具,常用的命令通常放在工具欄中,方便操作。而狀態(tài)欄則用於顯示目前程式的執(zhí)行狀態(tài)和說明。148工具欄的實現(xiàn)具欄包含一系列的位圖按鈕,通常情況下,單擊按鈕等價於從菜單中選擇相應(yīng)的菜單項。工具欄可以??吭诟复翱诘捻敳?,也可以??吭诟复翱诘娜魏慰窟叺奈恢?,或者脫離父窗口,移動到自己的框架窗口內(nèi)。??抗ぞ邫冢―ockingToolbars)指的是和父窗口相連的工具欄。與之相對就就是浮動工具欄(FloatingToolbars)。149ToolbarDemo程式的圖形菜單有直線、矩形和圓形三種選擇,相應(yīng)的,在工具欄中需要建立這三種按鈕。具體操作步驟如下:打開工具欄編輯器,修改AppWizard嚮導(dǎo)生成的預(yù)定義工具欄。在工具欄面板中刪除嚮導(dǎo)生成的缺省按鈕,只留下一個空白按鈕。用滑鼠將按鈕拖出工具欄面板就刪除該按鈕。創(chuàng)建直線按鈕。選擇圖形工具欄中的直線,在按鈕繪製區(qū)域從左上角到右下角畫直線。完成後,雙擊生成的直線按鈕,彈出ToolbarButtonProperties對話框。在ToolbarButtonProperties對話框中設(shè)置按鈕的ID(識別字)以及Prompt(提示資訊)。在ID框中,輸入ID_LINE。一旦編輯完第一個按鈕的內(nèi)容,在它右面會出現(xiàn)一個新的空白按鈕。單擊這個空白按鈕,繼續(xù)編輯下一個按鈕。創(chuàng)建矩形按鈕。選擇圖形工具條中的矩形,在空白按鈕中繪出一個矩形。按鈕的ID取值為ID_RECTANGLE。按以上步驟,再添加一個圓形按鈕。ID取值為ID_CIRCLE。完成工具欄的設(shè)計。150狀態(tài)欄的實現(xiàn)

狀態(tài)欄一般都??吭谥骺蚣艽翱诘牡撞?,包含多個面板,用做文本輸出或指示器,而且也無須改變其位置。如果在AppWizard嚮導(dǎo)的Step4對話框中選擇了Initialstatusbar項,AppWizard嚮導(dǎo)生成的應(yīng)用程式就擁有一個缺省的狀態(tài)欄。設(shè)計狀態(tài)欄的任務(wù)是:定義提示資訊,建立特定狀態(tài)和提示資訊的聯(lián)繫。151對話框和控件對話框用於顯示消息和取得用戶數(shù)據(jù),是Windows應(yīng)用程式中最常用的用戶介面。對話框作為一個容器,通常包括各種控件,如編輯框、按鈕、組合框和列表框等。用戶通過在編輯框中輸入資訊,通過對列表框、單選框等的選擇,為應(yīng)用程式提供必要的數(shù)據(jù)。對話框有兩種類型:模式對話框和非模式對話框。這兩種形式的對話框在打開和關(guān)閉方式上存在區(qū)別。MFC的Dialog類是對話框類的基類,提供了對話框的打開、關(guān)閉和管理對話框及對話框中的控件等功能。152控件簡介控件是Windows應(yīng)用程式和用戶進(jìn)行交互的常用手段。在VisualC++中,控件可以分成三類:Windows標(biāo)準(zhǔn)控件、ActiveX控件和其他MFC控件類。Windows標(biāo)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論