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

下載本文檔

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

文檔簡介

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

面向?qū)ο蟪绦蛟O計從所處理的數(shù)據(jù)入手,以數(shù)據(jù)為中心而不是以功能為中心來描述系統(tǒng),數(shù)據(jù)相對于功能而言具有更強的穩(wěn)定性。3面向?qū)ο蟪绦虻闹饕Y(jié)構(gòu)特點第一,程序一般由類的定義和類的使用兩部分組成,在主程序中定義各對象并規(guī)定它們之間傳遞消息的規(guī)律;第二,程序中的一切操作都是通過向?qū)ο蟀l(fā)送消息來實現(xiàn)的,對象接到消息后,啟動有關函數(shù)完成相應的操作。4對象的概念(一)面向?qū)ο蠹夹g認為客觀世界是由各種各樣的對象組成,每種對象都有各自的內(nèi)部狀態(tài)和運動規(guī)律,不同對象間的相互作用和聯(lián)系就構(gòu)成了各種不同的系統(tǒng),構(gòu)成了客觀世界。對象是組成一個系統(tǒng)的基本邏輯單元,是一個有組織形式的含有信息的實體。對象既可以表示一個抽象的概念,也可以表示一個具體的模塊,既可以表示軟件,也可以表示硬件。5對象的概念(二)對象(Object)由屬性(Attribute)和行為(Action)兩部分組成。屬性是用來描述對象靜態(tài)特征的一個數(shù)據(jù)項。行為是用來描述對象動態(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的基本特征抽象性抽象就是忽略事物中與當前目標無關的非本質(zhì)特征,更充分地注意與當前目標有關的本質(zhì)特征。封裝性封裝就是把對象的屬性和行為結(jié)合成一個獨立的單位,并盡可能隱蔽對象的內(nèi)部細節(jié)。繼承性繼承是一種聯(lián)結(jié)類與類的層次模型。繼承性是指特殊類的對象擁有其一般類的屬性和行為的特性。多態(tài)性多態(tài)是指類中同一函數(shù)名對應多個具有相似功能的不同函數(shù)。多態(tài)性是指可以使用相同的調(diào)用方式來調(diào)用這些具有不同功能的同名函數(shù)的特性。10三種常用面向?qū)ο蟪绦蛟O計語言簡介

混合型面向?qū)ο蟪绦蛟O計語言C++純面向?qū)ο蟪绦蛟O計語言Java可視化程序設計語言VisualBasic11簡單的C++程序C++程序由一個或多個源代碼文件構(gòu)成。C++的源代碼文件分為兩類:頭文件和源程序文件。C++源程序包括編譯預處理、程序主體和注釋幾部分。一般將變量(對象)、類型及類的定義、函數(shù)的聲明等放在頭文件(擴展名為.h);而將使用這些變量或函數(shù)的程序放在另一個文件中,成為C++源程序(擴展名.cpp)。12C++程序的編譯過程分為預處理和正式編譯兩個步驟。在編譯C++程序時,編譯系統(tǒng)中的預處理模塊首先根據(jù)預處理命令對源程序進行適當?shù)募庸ぃ缓笤僬骄幾g。程序主體就是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變量在程序運行過程中,值可以被改變的量稱為變量。在C++中,任何一個變量在被使用之前必須被定義。定義格式為:<類型><變量名表>;16指針和引用指針也是一種變量,指針變量專門用來存放其它數(shù)據(jù)在內(nèi)存的地址。是一種間接訪問變量或?qū)ο蟮姆椒?。引用是某個變量或?qū)ο蟮膭e名,是另一種訪問變量或?qū)ο蟮姆椒ā?lt;類型>*<變量>;<類型>&<引用名>=<變量名或?qū)ο竺?gt;;17數(shù)組數(shù)組是一個由多個同類型變量組成的集合。數(shù)組元素被引用的格式:<類型><數(shù)組名>[<常量表達式>][[<常量表達式>]…];<數(shù)組名>[<下標>][[<下標>]…]18結(jié)構(gòu)體C++允許用戶把邏輯上相關聯(lián)的數(shù)據(jù)組織起來,作為整體使用,這就是結(jié)構(gòu)體數(shù)據(jù)類型。struct<結(jié)構(gòu)類型變量名>{<類型> <成員名>;<類型> <成員名>;…};19運算符C++運算符包括算術運算符(+、-、*、/、%)、關系運算符(>、<、==、>=、<=、!=)、邏輯運算符(&&、||、!)、賦值運算符(=)、復合賦值運算符(+=、-=、*=、/=、%=等)、自加運算符(++)、自減運算符(--)、位運算符(&、^、|、~、<<、>>等)、條件運算符(?:)、逗號運算符(,)、作用域區(qū)分符(::)等。20表達式表達式是由運算符和操作數(shù)組成的式子。操作數(shù)包含了常量、變量、函數(shù)和其他一些命名的標識符。算術表達式關系表達式邏輯表達式條件表達式賦值表達式逗號表達式21動態(tài)存儲分配堆允許程序在運行時(而不是在編譯時)申請某個大小的內(nèi)存空間。如果要在堆中分配內(nèi)存空間,必須使用特定的函數(shù)或操作符。另外,若不再需要使用的動態(tài)內(nèi)存空間則必須釋放。new運算符從堆中分配一塊與<類型>相適應的存儲空間,若分配成功,將這塊內(nèi)存空間的首地址存入<指針>,否則置<指針>的值為NULL(空指針值,即0)。delete操作符用來釋放<指針>指向的動態(tài)存儲空間。22程序的基本控制結(jié)構(gòu)按照結(jié)構(gòu)化程序設計方法的觀點,任何算法功能都可以通過由程序模塊組成的三種基本程序結(jié)構(gòu)的組合來實現(xiàn),它們是順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(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ī)定:名字必須先說明后使用。因此,當一個函數(shù)調(diào)用出現(xiàn)在函數(shù)定義之前,必須先對函數(shù)進行原型說明。函數(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ù)傳遞關系。函數(shù)之間的數(shù)據(jù)傳遞是靠函數(shù)參數(shù)進行,而對無參數(shù)函數(shù)的調(diào)用,沒有數(shù)據(jù)傳遞。在定義函數(shù)時,函數(shù)名后面括號內(nèi)的變量名為“形式參數(shù)”(形參)。在調(diào)用函數(shù)時,函數(shù)名后面括號內(nèi)的表達式為“實際參數(shù)”(實參)。27引入函數(shù)后,使用者只需要知道函數(shù)的功能和使用方法,而不必關心函數(shù)的內(nèi)部代碼,從而方便源代碼的共享;使用函數(shù),也可減少程序的冗余和程序的目標代碼。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ù)體進行替換。引入內(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ù)時賦初值),這樣,當發(fā)生函數(shù)調(diào)用時,若指定實參值則用該值;如果省略了對應位置上的實參的值時,則在執(zhí)行被調(diào)函數(shù)時,以該形參的缺省值進行運算。引入缺省參數(shù)的目是為了讓編程簡單,讓編譯系統(tǒng)做更多的檢查錯誤工作,同時增強了函數(shù)的可重用性。30函數(shù)重載函數(shù)重載是指一個函數(shù)可以和同一作用域中的其他函數(shù)具有相同的名字,但這些同名函數(shù)的參數(shù)類型、參數(shù)個數(shù)、返回值、函數(shù)功能可以完全不同。編譯系統(tǒng)將根據(jù)函數(shù)參數(shù)的類型和個數(shù)來判斷使用哪一個函數(shù)。31作用域標識符有效性的范圍稱標識符的作用域,又稱為標識符的“可見性”。標識符在某范圍內(nèi)是“可見的”是指在該范圍內(nèi)可以進行訪問操作。C++的作用域范圍為:局部作用域(塊作用域)函數(shù)作用域函數(shù)原型作用域文件作用域類作用域32數(shù)據(jù)類型C語言中內(nèi)置數(shù)據(jù)類型示例:--int可以對整數(shù)有:+,-,*,/,求模操作%.

可以用sizeof(),來求得其在特定的平臺上的大小,如4字節(jié).構(gòu)成數(shù)據(jù)類型的兩大要素:--存放數(shù)據(jù)對象需要的內(nèi)存大小

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

從語言角度來說,類是一種新的數(shù)據(jù)類型,而對象是具有這種類型的變量。類是一種將數(shù)據(jù)和作用于這些數(shù)據(jù)上的函數(shù)組合在一起的復雜數(shù)據(jù)類型,是可重用的基本單元。一個類就是一個用戶自定義數(shù)據(jù)類型。類是面向?qū)ο蟪绦蛟O計的核心,利用它可以實現(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)的先后順序無關,并且允許多次出現(xiàn),但是一個成員只能具有一種訪問屬性。37成員函數(shù)的實現(xiàn)成員函數(shù)是類中描述行為的成員,同時也是對封裝的數(shù)據(jù)進行操作的惟一途徑。類定義的格式中,一般在類中說明成員函數(shù)原型,在類外進行成員函數(shù)的具體實現(xiàn),<各個成員函數(shù)的定義>是類的實現(xiàn)部分。同時,如果成員函數(shù)已經(jīng)在類中定義,則不需要在類外實現(xiàn)。需要注意的是,在類中定義的成員函數(shù)自動成為內(nèi)聯(lián)函數(shù)。38若在類體外實現(xiàn),則需要使用作用域運算符“::”,用它來標識某個成員函數(shù)是屬于哪個類的,其定義格式如下:<返回值類型><類名>::<成員函數(shù)名>(<參數(shù)表>){<函數(shù)體>}39

對象對象的定義格式與普通變量相同。定義格式如下:<類名><對象名表>;

其中,<對象名表>中可以有一個或多個對象名。當有多個對象名時,用逗號分隔。<對象名表>中還可以是指向?qū)ο蟮闹羔樏蛞妹?,也可以是對象?shù)組名。40類成員的訪問定義了類及其對象,就可以通過對象來使用其公有成員,從而達到對對象內(nèi)部屬性的訪問和修改。對象對其成員的訪問有圓點訪問形式和指針訪問形式。<對象名>.<公有成員><對象指針名>-><公有成員>41構(gòu)造函數(shù)和析構(gòu)函數(shù)類描述了一類對象的共同特征,而對象是類的特例。每個對象區(qū)別于其他對象的地方就是依靠它自身屬性,即數(shù)據(jù)成員的值。對象在定義的時候可以進行數(shù)據(jù)成員的設置,稱為對象的初始化。同樣,在對象使用結(jié)束時,還可以進行一些相關的清理工作。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)用完成之后,對象也就消失了,相應的內(nèi)存空間也被釋放。析構(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ù)成員必須進行初始化。在程序一開始運行時靜態(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ù)對私有成員進行訪問。但有時類體外的一些函數(shù)需要直接訪問類的數(shù)據(jù)成員,又不改變其數(shù)據(jù)成員的訪問權(quán)限,這時,需要定義友元。54友元的作用友元提供了不同類或?qū)ο蟮某蓡T函數(shù)之間、類的成員函數(shù)與普通函數(shù)之間進行數(shù)據(jù)共享的機制。友元可以訪問類中所有成員,但不是類的成員。。友元雖然不是類的成員,但它是類的朋友,可以直接訪問類的所有成員。55友元的定義如果友元是普通函數(shù)或另一個類的成員函數(shù),稱為友元函數(shù);如果友元是一個類,則稱為友元類,友元類的所有成員函數(shù)都成為友元函數(shù)。友元函數(shù)和友元類在被訪問的類中聲明,其格式分別如下:friend<返回值類型><函數(shù)名>(<參數(shù)表>);friend<類名>;56繼承的概念類的繼承就是根據(jù)一個類創(chuàng)建一個新類的過程。新類自動具有已有類的所有成員,并可根據(jù)需要添加更多的成員。換個角度,從已有類產(chǎn)生新類的過程就是類的派生。通常將用來派生新類的類稱為基類,又稱為父類,而將派生出來的新類稱為派生類,又稱為子類。57派生類派生類是特殊的基類,基類是派生類的抽象描述。派生類繼承了基類的所有特性,但不等同于基類,否則就沒有派生的必要了。繼承的作用就是體現(xiàn)特殊與一般的關系,尋找有共性的事物間的差異,求其發(fā)展;另一個作用是代碼重用,從基類派生子類,無需修改基類的代碼,就可以直接調(diào)用基類的成員,而自己的代碼只需在派生類中實現(xiàn)即可。58派生類的定義class<派生類名>:<繼承方式><基類名>{<派生類新定義成員>};其中,<繼承方式>有三種:公有繼承、私有繼承和保護繼承,分別用關鍵字public、private和protected表示。缺省情況下為私有繼承。59派生類的生成過程分析派生新類的過程可知,派生類的生成經(jīng)歷了三個步驟:吸收基類成員改造基類成員添加派生類新成員60訪問權(quán)限控制不論哪種繼承方式,派生類新定義成員均不能直接訪問基類的私有成員,只能通過基類的公有成員函數(shù)或保護成員函數(shù)訪問基類的私有數(shù)據(jù)成員,而基類的私有成員函數(shù)根本就不會繼承,更談不上使用。所以,除非僅限于本類使用,否則,一般不將成員函數(shù)定義為私有成員。61公有繼承的訪問權(quán)限控制類的繼承方式為公有繼承時,在派生類中,繼承的基類的公有成員和保護成員的訪問屬性不變,而對基類的私有成員不可訪問。即基類的公有成員和保護成員被繼承后分別作為派生類的公有成員和保護成員,派生類的成員可以直接訪問它們,而派生類的成員無法訪問基類的私有成員。在類外,派生類的對象可以訪問繼承下來的基類公有成員。62私有繼承的訪問權(quán)限控制當類的繼承方式為私有繼承時,在派生類中,繼承的基類的公有成員和保護成員變?yōu)樗接谐蓡T,而對基類的私有成員不可訪問。即基類的公有成員和保護成員被繼承以后作為派生類的私有成員,派生類的成員可以直接訪問它們,而派生類的成員無法訪問基類的私有成員。在類外,派生類的對象無法訪問基類的所有成員。因此,私有繼承之后,基類的成員再也無法在以后的派生類中發(fā)揮作用,出于這種原因,一般不使用私有繼承方式。63保護繼承的訪問權(quán)限控制當類的繼承方式為保護繼承時,在派生類中,繼承的基類的公有成員和保護成員變?yōu)楸Wo成員,而對基類的私有成員不可訪問。即基類的公有成員和保護成員被繼承以后作為派生類的保護成員,派生類的成員可以直接訪問它們,而派生類的成員無法訪問基類的私有成員。在類外,派生類的對象無法訪問基類的所有成員。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ù),將繼承分為單繼承和多繼承。當派生類只有一個基類時稱為單繼承,以上所討論的都是單繼承。當派生類有多個基類時稱為多繼承。單繼承可以看作是多繼承的一個特例,多繼承可以看作是多個單繼承的組合,它們有很多相同特性。67多繼承的定義格式

多繼承可以看作是單繼承的擴展,派生類與每個基類之間的關系可以看作是一個單繼承。在C++中,多繼承的定義格式如下:class<派生類名>:<繼承方式><基類名1>,…,<繼承方式><基類名n>{<派生類新定義成員>};68多繼承的構(gòu)造函數(shù)<派生類名>(<總參數(shù)表>):<基類名1>(<參數(shù)表1>),…,<基類名n>(<參數(shù)表n>){<派生類數(shù)據(jù)成員的初始化>};69虛基類在派生類中對基類成員的訪問應該是唯一的。但是,在多繼承方式下,可能造成對基類中某個成員的訪問出現(xiàn)不唯一的情況,稱為對基類成員訪問的二義性問題。解決的辦法是用作用域運算符“::”進行限定,另外還可以設置虛基類來解決此問題。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ù)實現(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)編是指計算機程序自身彼此關聯(lián)的過程,也就是把一個標識符名和一個存儲地址聯(lián)系在一起的過程。用面向?qū)ο蟮男g語講,就是把一條消息和一個對象的方法相結(jié)合的過程。按照聯(lián)編進行的階段的不同,可以分為靜態(tài)聯(lián)編和動態(tài)聯(lián)編,這兩種聯(lián)編過程分別對應著多態(tài)性的兩種實現(xiàn)方式。74靜態(tài)聯(lián)編在編譯階段完成的聯(lián)編稱為靜態(tài)聯(lián)編。在編譯過程中,編譯系統(tǒng)可以根據(jù)類型匹配等特征來確定程序中調(diào)用操作與執(zhí)行某個同名函數(shù)實現(xià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ù)。這種在運行階段進行的聯(lián)編稱為動態(tài)聯(lián)編。動態(tài)聯(lián)編的優(yōu)點是提供了更好的編程靈活性、問題抽象性和程序易維護性,缺點是與靜態(tài)聯(lián)編相比,函數(shù)調(diào)用速度慢。76虛函數(shù)虛函數(shù)是動態(tài)聯(lián)編的基礎。虛函數(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)。當使用對象指針或?qū)ο笠谜{(diào)用虛函數(shù)時,采用動態(tài)聯(lián)編方式,即在運行時進行關聯(lián)或綁定。79抽象類抽象類是一種特殊的類,專門作為基類派生新類,自身無法實例化,也就是無法定義抽象類的對象,它為一類族提供統(tǒng)一的操作界面。抽象類是為了抽象和設計的目的而建立的,可以說,建立抽象類,就是為了通過它多態(tài)地使用其中的成員函數(shù)。抽象類處于類層次的上層,由它派生新類,然后再實例化。80純虛函數(shù)在C++中,有一個僅為該多態(tài)機制提供一個接口而沒有任何實體定義的函數(shù),被稱為純虛函數(shù)。聲明純虛函數(shù)的一般格式如下:virtual<返回值類型><函數(shù)名>(<參數(shù)表>)=0;81

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

}89模板函數(shù)的生成函數(shù)模板是對一組函數(shù)的描述,它以任意類型T為參數(shù)及函數(shù)返回值。它不是一個實實在在的函數(shù),編譯系統(tǒng)并不產(chǎn)生任何執(zhí)行代碼。當編譯系統(tǒng)在程序中發(fā)現(xiàn)有與函數(shù)模板中相匹配的函數(shù)調(diào)用時,便生成一個重載函數(shù),該重載函的函數(shù)體與函數(shù)模板的函數(shù)體相同。該重載函數(shù)稱為模板函數(shù)。它是函數(shù)模板的一個具體實例,只處理一種惟一的數(shù)據(jù)類型。90類模板定義類模板的一般格式:template<類型參數(shù)表>class<類模板名>{<類成員的聲明>};91類模板中的成員函數(shù)的定義可以放在類模板的定義體中(此時與類中的成員函數(shù)的定義方法一致)也可以放在類模板的外部定義成員函數(shù),此時成員函數(shù)的定義格式如下:template<類型參數(shù)表><返回值類型><類模板名><類型名表>::<函數(shù)名>(<參數(shù)表>){<函數(shù)體>}92類模板的使用利用類模板定義的只是對類的描述,它本身還不是一個實實在在的類。要定義類模板的對象(即實例),需要用下列格式的語句:類模板名<實際的類型>類模板名<實際的類型><對象名>[(實際參數(shù)表)];93標準模板庫STLSTL是C++標準庫中的重要一員,利用STL開發(fā)程序可以提高代碼的重用性,讓程序更加穩(wěn)定,便于維護,提高編寫程序的效率。STL是StandardTemplateLibrary的縮寫,即標準模板庫。它是由泛型算法和數(shù)據(jù)結(jié)構(gòu)組成的通用庫。在運用STL之前,必須掌握模板的使用。94STL的組成STL主要由六大部分組成:迭代器(iterators)算法(algorithms)容器(containers)函數(shù)對象(functionobjects)內(nèi)存分配器(allocators)適配器(adapter)95流的概念在C++中,將數(shù)據(jù)從一個對象到另一個對象的流動抽象為“流”。流動的方向不同,構(gòu)成輸入/輸出流,即I/O流。在C++程序中,數(shù)據(jù)可以從鍵盤流入到程序,也可以從程序流向屏幕或磁盤文件。從流中獲取數(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流庫中各個類之間的層次關系stdiostreamiosistrstreamistreamifstreamistream_withassignostreamfstreamostream_withassignstrstreamiostreamofstreamostrstreamstreambufstrstreambuffilebufstdiobuffstreambasestrstreambase98非格式化輸入/輸出非格式化輸入/輸出就是按系統(tǒng)預定義的格式進行的輸入/輸出。按默認約定,每個C++程序都能使用標準I/O流,如標準輸入、標準輸出。cin用來處理標準輸入,即鍵盤輸入;cout用來處理標準輸出,即屏幕輸出。它們被定義在iostream.h頭文件中。在使用cout和cin前,要用編譯預處理命令將所使用的頭文件包含到源程序中,其格式如下:#include<iostream.h>99非格式化輸出“<<”是預定義的插入運算符,作用在流類對象cout上,實現(xiàn)默認格式的屏幕輸出。使用cout輸出表達式值到屏幕上的格式如下:

cout<<E1<<E2<<…<<Em;其中,E1、E2、…、Em為均為表達式。功能是計算各表達式的值,并將結(jié)果輸出到屏幕當前光標位置處。cout是ostream流類的對象,它在iostream.h頭文件中作為全局對象定義:

ostreamcout(stdout);其中,stdout表示標準輸出設備名(屏幕)。100非格式化輸入“>>”是預定義的提取運算符,作用在流類對象cin上,實現(xiàn)默認格式的鍵盤輸入。使用cin將數(shù)據(jù)輸入到變量的格式如下:

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

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

用ios類成員函數(shù)格式化ios類成員函數(shù)主要是通過對狀態(tài)標志、輸出寬度、填充字符以及輸出精度的操作來完成輸入/輸出格式化。枚舉量定義在ios類中,因此引用時必須包含ios::前綴。使用時應該全部用符號名,絕不要用數(shù)值。103用ios成員函數(shù)對狀態(tài)標志進行操作ios類有3個成員函數(shù)可以對狀態(tài)標志進行操作,并且定義了一個long型數(shù)據(jù)成員記錄當前狀態(tài)標志。這些狀態(tài)標志可用位或運算符“|”進行組合。設置狀態(tài)標志用setf函數(shù)設置狀態(tài)標志,其一般格式如下:longios::setf(longflags)清除狀態(tài)標志用unsetf函數(shù)清除狀態(tài)標志,其一般格式如下:longios::unsetf(longflags)取狀態(tài)標志用函數(shù)flaps取狀態(tài)標志有兩種形式,其格式分別如下:longios::flags()longios::flags(longflag)104用ios成員函數(shù)設置輸出寬度設置輸出寬度函數(shù)有兩種形式,其格式分別如下:

intios::width(intlen) intios::width()第一種形式是設置輸出寬度,并返回原來的輸出寬度;第二種形式是返回當前輸出寬度,輸出寬度為0。105設置填充字符填充字符的作用是當輸出值不滿輸出寬度時用填充字符來填充,默認填充字符為空格。它與width()函數(shù)配合使用,否則沒有意義。設置填充字符函數(shù)有兩種形式,其格式分別如下:

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

intios::precision(intp)intios::precision()第一種形式是重新設置輸出精度,并返回設置前的輸出精度;第二種形式是返回當前的輸出精度。107用操作符函數(shù)格式化為了不直接以標志位的方式去處理流的狀態(tài),c++標準庫提供了標準的操作符函數(shù)專門操控這些狀態(tài)。這組函數(shù)不屬于任何類成員,定義在iomanip.h頭文件中。將它們用在提取運算符“>>”或插入運算符“<<”后面來設定輸入/輸出格式,即在讀寫對象之間插入一個修改狀態(tài)的操作。其中有些函數(shù)沒有參數(shù),所以又叫操作符。108設置輸入/輸出寬度函數(shù)setw(int)設置輸出填充字符函數(shù)setfill(int)設置輸出精度函數(shù)setprecision(int)設置輸入/輸出整型數(shù)數(shù)制函數(shù)dec、hex和oct取消輸入結(jié)束符函數(shù)ws控制換行操作符endl代表輸出單字符“\0”的操作符ends109

文件的輸入/輸出C++把文件看作是一個字符(字節(jié))的序列,即由一個個字符(字節(jié))順序組成。根據(jù)數(shù)據(jù)的組織形式,可分為ASCII碼文件和二進制文件。ASCII碼文件又稱為文本文件,它的每一個字節(jié)存放一個ASCII碼,代表一個字符。二進制文件是把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲形式原樣輸出到磁盤文件存放。110C++有三種文件流類:輸入/輸出文件流類fstream輸入文件流類ifstream輸出文件流類ofstream它們分別從I/O流中的iostream、istream、ostream流類中派生而來。這些文件流類都定義在fstream.h頭文件中,因此,要使用文件流類,必須在程序開始包含該頭文件。111C++中進行文件操作的一般步驟為文件定義一個流類對象;使用open()函數(shù)建立(或打開)文件。如果文件不存在,則建立該文件;如果磁盤上已存在該文件,則打開該文件;進行讀寫操作。在建立(或打開)的文件上執(zhí)行所要求的輸入/輸出操作。一般來說,在內(nèi)存與外設的數(shù)據(jù)傳輸中,由內(nèi)存到外設稱為輸出或?qū)?,反之則稱為輸入或讀;使用close()函數(shù)關閉文件。當完成操作后,應把打開的文件關閉,避免誤操作。112在C++中,打開一個文件就是將這個文件與一個流建立關聯(lián);關閉一個文件就是取消這種關聯(lián)。open()函數(shù)的原型在fstream.h中定義。另外,在fstream、ifstream和ofstream流類中均有定義。其原型為:voidopen(char*filename,intmod,intaccess);其中第一個參數(shù)是用來傳遞文件名;第二個參數(shù)的值決定文件的使用方式,如表7-4所示;第三個參數(shù)的值決定文件的訪問方式。113異常處理概述

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

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

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

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

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

狀態(tài)欄一般都??吭谥骺蚣艽翱诘牡撞浚鄠€面板,用做文本輸出或指示器,而且也無須改變其位置。如果在AppWizard向?qū)У腟tep4對話框中選擇了Initialstatusbar項,AppWizard向?qū)傻膽贸绦蚓蛽碛幸粋€缺省的狀態(tài)欄。設計狀態(tài)欄的任務是:定義提示信息,建立特定狀態(tài)和提示信息的聯(lián)系。151對話框和控件對話框用于顯示消息和取得用戶數(shù)據(jù),是Windows應用程序中最常用的用戶界面。對話框作為一個容器,通常包括各種控件,如編輯框、按鈕、組合框和列表框等。用戶通過在編輯框中輸入信息,通過對列表框、單選框等的選擇,為應用程序提供必要的數(shù)據(jù)。對話框有兩種類型:模式對話框和非模式對話框。這兩種形式的對話框在打開和關閉方式上存在區(qū)別。MFC的Dialog類是對話框類的基類,提供了對話框的打開、關閉和管理對話框及對話框中的控件等功能。152控件簡介控件是Windows應用程序和用戶進行交互的常用手段。在VisualC++中,控件可以分成三類:Windows標準控件、ActiveX控件和其他MFC控件類。Windows標準控件由W

溫馨提示

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

評論

0/150

提交評論