版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第2章 C+語言基礎(chǔ)和面向?qū)ο髇2.1 C+語言基礎(chǔ)n2.2 類n2.3 面向?qū)ο蟮木幊碳夹g(shù)2.1 C+語言基礎(chǔ)nVisual C+的基礎(chǔ)是C+語言,利用Visual C+所編譯、運行的程序,小到一個界面程序,大到一個大型軟件,無一不是用C+語言寫出來的。因此,要學(xué)好Visual C+,必須對C+語言有深入的了解。2.1.1 編程基礎(chǔ)n1源文件源文件n源文件由語句組成。語句用來確定計算機要執(zhí)行什么操作。例如,下面這一行語句完成了計算半徑為10厘米的圓的面積:n area=3.14*10*10;n 每一個語句都要以分號結(jié)尾。n n2main函數(shù)函數(shù)nmain函數(shù)不返回數(shù)值,main函數(shù)中的第一行
2、將被計算機最先執(zhí)行到。n 3數(shù)據(jù)的輸出數(shù)據(jù)的輸出n 當(dāng)程序中出現(xiàn)cout可實現(xiàn)數(shù)據(jù)的輸入。例如:n cina;n用戶輸入數(shù)值后,這個數(shù)值被存入變量a中。n5預(yù)處理預(yù)處理n#include預(yù)處理指令告訴編譯器裝入一個include文件。例如cin和cout被定義在稱為iostream.h的文件中(其中.h是頭文件的標(biāo)準(zhǔn)擴展名)。 2.1.2數(shù)據(jù)類型nC+提供了許多預(yù)先定義的數(shù)據(jù)類型,用戶可以把不同的數(shù)據(jù)類型組合起來構(gòu)造更復(fù)雜的數(shù)據(jù)類型。n1基本數(shù)據(jù)類型nchar一一表示字符。如a、b和*都是字符。該類型數(shù)據(jù)占一個字節(jié)的空間。nfloat一一表示浮點數(shù)。即帶有小數(shù)點的數(shù)字,例如3.14、-1.50
3、和20.0等等,浮點數(shù)有時也稱作實數(shù)。浮點數(shù)的取值范圍是3.1410-38到3.41038。該類型數(shù)據(jù)占四個字節(jié)的空間。ndouble一一表示雙精度數(shù)。雙精度數(shù)的取值范圍是1.710-308到1.710308。該類型數(shù)據(jù)占八個字節(jié)的空間。nint表示整數(shù)。整數(shù)是不包含小數(shù)點的數(shù)。例如,0,3,30和-59都是整數(shù),但是1.0不是整數(shù)。整數(shù)的取值范圍是-32768到32767。該類型數(shù)據(jù)占二個字節(jié)的空間。 n除上述一些常見的數(shù)據(jù)類型外,還有如下一些數(shù)據(jù)類型:nlong一一表示長整型數(shù)。取值范圍是-2147483648到2147483647。該類型數(shù)據(jù)占四個字節(jié)的空間。nShort一一表示短整型數(shù)
4、。取值范圍是-32768到32767。該類型數(shù)據(jù)占二個字節(jié)的空間。nunsigned一一表示無符號整型數(shù)。它表示數(shù)值總是正的整數(shù)。例如unsigned int類型的表示的范圍是0到65535。nvoid一一無類型數(shù),用來表明函數(shù)不返回值。如:void main()。2.1.2數(shù)據(jù)類型2聚合數(shù)據(jù)類型 C+語言還提供了幾種聚合數(shù)據(jù)類型,包括數(shù)組、指針、結(jié)構(gòu)、聯(lián)合、位域和枚舉。本書稍后章節(jié)將對部分類型做詳細(xì)介紹。3類型安全性nC+對數(shù)據(jù)類型有嚴(yán)格的要求,如果把一個變量聲明為一種類型,而在實際使用時又試圖把它用作另外一種類型,編譯器就會產(chǎn)生錯誤。這種對數(shù)據(jù)類型的嚴(yán)格要求稱作類型安全性。例如:nint
5、r; nr =“Hello!”;n將會出錯,因為r是整型,所以不能給它賦一個字符串,因此,應(yīng)該明確告訴編譯器把一種數(shù)據(jù)類型轉(zhuǎn)換成另一種數(shù)據(jù)類型,這稱作強制類型轉(zhuǎn)換。要做到這一點,只需在被轉(zhuǎn)換的項前面加入要轉(zhuǎn)換的數(shù)據(jù)類型名。2.1.3 常量和變量n1常量常量n常量指的是在程序執(zhí)行過程中不變的數(shù)據(jù)。它有兩種形式,其一是數(shù)值形式,如:3.14、135、0.132e+02等;其二是標(biāo)識符形式,稱為符號常量。要使一個標(biāo)識符成為符號常量,只須在聲明前面加上const即可。例如:nconst int Length=3;nLength就是一個符號常量,其值為3。2.1.3常量和變量n2變量變量n變量指的是在程
6、序執(zhí)行過程中其值可以變化的量,任何一個變量必須有確定的名稱。只需通過變量的名稱,便可以訪問存儲在變量內(nèi)的信息。n變量名由字母、數(shù)字和下劃線組成,但有以下一些限制:n變量名不能以數(shù)字開頭;n變量名中不能有空格;n變量名中除了能使用26個英文字母外,只能使用“_”;n變量名不能與C+語言中的關(guān)鍵詞同名。表2.1列出了Visual C+的關(guān)鍵詞;n變量名不能與C+中的庫函數(shù)名相同。3變量的作用域變量的作用域n變量的作用域是指變量在程序中的有效使用范圍。根據(jù)變量的作用域,變量可分為全局變量和局部變量兩種類型。n全局變量是指在函數(shù)外部所定義的變量。兩個全局變量不能同名。n局部變量是在函數(shù)內(nèi)部定義的變量。
7、在函數(shù)開始執(zhí)行時,局部變量被生成了,并只能在該函數(shù)內(nèi)部使用。當(dāng)函數(shù)結(jié)束時,局部變量也隨之消失。在函數(shù)內(nèi),一個名稱只能代表一個變量,但是在另一個函數(shù)內(nèi),這個名稱可代表另外一個變量。n在函數(shù)中所定義形式參數(shù)也是局部變量。nC+中的變量作用域的規(guī)則:n任何在函數(shù)內(nèi)部定義的變量都是這個函數(shù)的局部變量。如果在函數(shù)中定義了一個變量,則當(dāng)函數(shù)調(diào)用時,這個變量也隨之生成,可在整個函數(shù)內(nèi)部使用,并且當(dāng)函數(shù)結(jié)束時隨之消失。n函數(shù)的所有形參都是這個函數(shù)的局部變量。n在函數(shù)中,若局部變量和全局變量同名,則該函數(shù)所使用的是局部變量,而不是同名的全局變量。n如果在函數(shù)中使用了一個不屬于該函數(shù)的局部變量,編譯程序?qū)ふ彝?/p>
8、的全局變量。在一個有某個局部變量的函數(shù)中,如果要訪問一個與此變量同名的全局變量,則在變量名前加上:(作用域分辨符)。例如,有一個名為area的全局變量,且函數(shù)中包含了名為area的局部變量,那么用:area指的是全局變量,而用area指的是局部變量。2.1.4 運算符C+語言的運算符是告訴編譯程序執(zhí)行特定算術(shù)或邏輯操作的符號,C+語言內(nèi)部運算符主要有三類:算術(shù)運算符、關(guān)系與邏輯運算符以及位操作運算符。1算術(shù)運算符算術(shù)運算符 C+算術(shù)運算符主要有:+、-、*、/、%、+、-、等,主要用于算術(shù)計算。這些運算符的使用相對簡單,下面我們重點講述+運算符。 +運算符有兩種形式,可以把它放在變量前面(這種
9、增量運算稱為前增量),如+a,也可以把它放在變量后面(這種增量運算稱為后增量),如a+。 +a先把a的值增1,然后再引用a的值,+先引用a的值,然后a的值增加1。 -運算符與+運算符類似。2關(guān)系運算符和邏輯運算符關(guān)系運算符和邏輯運算符n關(guān)系運算符用于關(guān)系運算,比較左右兩個表達(dá)式的大小或是否相等,其運算結(jié)果為邏輯值“真”或“假”。邏輯運算符表示操作數(shù)的邏輯關(guān)系,其運算結(jié)果同樣也是邏輯值“真”或“假”。表2.2介紹了在布爾表達(dá)式中常用的運算符。2.1.4運算符n3位操作運算符位操作運算符n位操作是對字節(jié)或字中的位(bit)進(jìn)行測試、置位或移位處理,這里的字節(jié)或字是針對char和int類型而言。位操
10、作不能用于float、double、long double、void或其他復(fù)雜類型。C+中的位操作符主要包括:&(與)、|(或)、(異或)、(補)、(右移)、(左移)。n4賦值運算符賦值運算符n利用賦值運算符=可以給一個變量賦值,例如:narea=3.14*10*10;n在賦值過程中,賦值號右邊的表達(dá)式的值被傳送到賦值號左邊的變量中??梢栽谝粋€語句中使用多個賦值符,使多個變量獲得相同的值.n表2-3所列出的就是常用的復(fù)合賦值運算符。2.1.4運算符2.1.4運算符5條件運算符條件運算符 條件運算符是由?和:合成實現(xiàn)的。條件 表達(dá)式具有如下形式: expr1?expr2:expr3 它的
11、含義是:如果expr1為真,就返回expr2的值。否則,返回expr3的值。6運算符的運算次序運算符的運算次序 表2.4列出了運算次序。表中的運算符按優(yōu)先級從高到低的次序排列(最上方為最高優(yōu)先級,最下方為最低優(yōu)先級)。同一行運算符具有相同的優(yōu)先級。2.1.5 C+語言的3種程序結(jié)構(gòu)nC+語言的3種程序結(jié)構(gòu)有:順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。順序結(jié)構(gòu)是指計算從第一條語句到最后一條語句完全按順序執(zhí)行;選擇結(jié)構(gòu)是根據(jù)用戶輸入或中間結(jié)果去執(zhí)行若干不同的任務(wù);循環(huán)結(jié)構(gòu)是指在程序的某處,需要根據(jù)某項條件重復(fù)地執(zhí)行某項任務(wù)若干次或直到滿足或不滿足某條件為止。n1選擇結(jié)構(gòu)選擇結(jié)構(gòu)n選擇控制語句主要包括ifels
12、e語句和switch、case語句。nif語句是在當(dāng)條件為真時,執(zhí)行一系列操作;當(dāng)條件為假時,執(zhí)行另外一系列操作,if的語法格式:2.1.5 C+語言的3種程序結(jié)構(gòu)nif(expr)n sent1;nelsen sent2;nexpr代表表達(dá)式,例如i1。sent1和sent2代表語句,例如cost=cost+1。nexpr可以代表任何一個表達(dá)式,如果這個表達(dá)式為真,就執(zhí)行sent1,否則,執(zhí)行sent2。n還可以不要else來構(gòu)成if語句,其形式是:nif(expr)n sent;n與if語句不同,switch、case語句專門處理多路分支的情況,其語法格式為:nSwitch(expr)nc
13、ase va11:sent 1;ncase val2:sent 2;nncase valn:sent nndefault: sent n+1;nn首先,確定expr的值并且與val1進(jìn)行比較(val代表某個確定的值,如1或453)。如果expr與val1數(shù)值相等,那么就執(zhí)行sent1和它后面的所有語句。如果expr與val1的數(shù)值不相等,那么expr再繼續(xù)與va12比較,以此類推。如果沒有與expr相匹配的值,那么就執(zhí)行sent n+1。下面的程序段用于輸出數(shù)字14的英文字符。nSwitch(n)ncase 1:coutone;break;ncase 2:couttwo;break;ncase
14、 3:coutthree;break;ncase4:coutfour;break;ndefault:cout”unknown number;nn注意,在每個case語句中都要使用break。2.1.5 C+語言的3種程序結(jié)構(gòu)n2循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)n循環(huán)結(jié)構(gòu)主要包括for語句、while語句和do while語句。nfor語句用于反復(fù)執(zhí)行某些語句,其語法格式如下:nfor(expr1;expr2;expr3)nsent;n先確定expr1表達(dá)式,expr1通常用于初始化循環(huán)中用到的變量;然后計算expr2表達(dá)式(每次進(jìn)入循環(huán)都必須執(zhí)行這一步);如果expr2為真,就執(zhí)行sent,接著就執(zhí)行expr
15、3;然后再計算expr2表達(dá)式;如果expr2為真,就重復(fù)上述步驟,直到expr2為假,循環(huán)就結(jié)束,程序繼續(xù)執(zhí)行for循環(huán)后面的語句。n如同for語句一樣,while循環(huán)也是重復(fù)多次執(zhí)行語句,其語法格式是:nwhile(expr)nsent;n在while循環(huán)開始時,先確定expr,如果表達(dá)式為真,就執(zhí)行sent;然后,再確定expr,如果表達(dá)式仍為真,就再執(zhí)行sent。這個過程一直持續(xù)到expr為假時為止。ndo-while語句的語法格式:ndon sent;nwhile(expr);ndo-while構(gòu)成另一種循環(huán)控制,類似于while循環(huán)。兩者的區(qū)別是,使用while循環(huán),表達(dá)式在執(zhí)行w
16、hile內(nèi)部語句之前進(jìn)行判定。因此,使用while有可能不執(zhí)行任何語句。而do語句是先執(zhí)行語句,再確定是否符合條件,以決定是否繼續(xù)。如果條件為真,再次執(zhí)行語句。否則,循環(huán)停止。2.1.6函數(shù)1函數(shù)的定義和調(diào)用函數(shù)的定義和調(diào)用2形式參數(shù)形式參數(shù) 函數(shù)中定義形參的方法如下: 函數(shù)類型 函數(shù)名(data_type1 arg1,data_type2 arg2,.) 3函數(shù)返回值函數(shù)返回值n函數(shù)要得到一個返回值,必須注意以下兩點:n在聲明函數(shù)時,函數(shù)名前面寫上要返回數(shù)據(jù)的類型,而不要寫void。n在函數(shù)中用return來返回函數(shù)的值。nreturn關(guān)鍵詞可以起到立刻離開函數(shù)并返回一個值的作用。如果在一個
17、函數(shù)的中間使用了return,執(zhí)行return命令后,return后面的程序代碼就不被執(zhí)行。2.1.7指針 指針是C+中一類非常重要的數(shù)據(jù)類型,它可以更好地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu),有些其他數(shù)據(jù)類型無法或很難實現(xiàn)的操作,都可以利用指針來完成。1指針的定義方法指針的定義方法定義一個指針變量格式如下:類型 *指針變量名;例如:int *pointer;定義一個整型指針變量pointer。2.1.7指針n2指針的地址指針的地址n使用指針之前,必須給它賦值,也就是說,必須把要指向的內(nèi)存地址填入指針。n要把一個變量的地址送入指針變量,方法是:n指針變量=&變量;n該語句序列生成了一個稱為pointer
18、的整型指針,指針內(nèi)填入了變量number的地址。n向一個指針變量賦值的過程中,必須保證指針變量的類型與所獲得地址類型的一致性。例如,如果有一個指向一個整數(shù)的指針,只能在這個指針內(nèi)填入整型變量的地址。n3復(fù)引用指針復(fù)引用指針n復(fù)引用指針是指引用指針變量所指向的存儲單元,其方法是在指針名稱前加一個*。例如程序段:nint *pointer;nint number=10;npointer=&number;ncoutValue;n在C+程序中經(jīng)??梢钥吹健爸羔?成員”的表示法。n5動態(tài)分配內(nèi)存動態(tài)分配內(nèi)存n利用new命令可以動態(tài)地分配內(nèi)存,其方法是:n指針=new 類型;n當(dāng)使用new生成一個
19、指針時,唯一能夠記錄這個內(nèi)存地址位置的就是指針。例如程序代碼:nint *pointer;npointer=new int;n*pointer=15;npointer=new int;n在代碼的最后一行為pointer分配了新的內(nèi)存。雖然整數(shù)15仍然保留在內(nèi)存內(nèi),但是,由于pointer存儲的內(nèi)容不再是數(shù)據(jù)15所在的地址,所以無法訪問它。n如果不再使用為指針變量所分配的內(nèi)存空間,就應(yīng)釋放這些空間,這個處理過程稱為“釋放內(nèi)存”。方法是:ndelete 指針變量;2.1.7指針n6字符串與指針字符串與指針n字符串表示一個連續(xù)的字符序列。在處理字符串時,用指向字符串第一項的指針可以訪問字符串。例如程
20、序段:nchar *mystring=”Visual C+ 6.0”;n產(chǎn)生了一個內(nèi)容為 ”Visual C+ 6.0”的字符串。變量mystring是指向這個字符串的指針。n用程序段: ncout mystring;n則可以輸出字符串。2.1.8數(shù)組 數(shù)組可以生成包含相同類型的若干個變量。數(shù)組中的每個元素都有一個標(biāo)號,稱之為下標(biāo)(index),使用數(shù)組的下標(biāo)可以立即訪問到數(shù)組中的任意一個數(shù)組元素。1數(shù)組的聲明和數(shù)組元素的使用數(shù)組的聲明和數(shù)組元素的使用在生成一個數(shù)組之前,需要聲明數(shù)組中的元素數(shù)目。例如:int arr20;生成了一個具有20個數(shù)組元素的一維數(shù)組。其中第1個元素為arr0,最后一
21、個元素為arr19。訪問數(shù)組元素時,只需在變量名稱后面的方括號內(nèi)寫上數(shù)組的下標(biāo)。例如:int arr20;arr0=20;arr1=3;Coutarr0;Cout3*arr1;輸出結(jié)果為20和30。 2.1.8數(shù)組n2數(shù)組初始化數(shù)組初始化n在聲明數(shù)組時,把元素的值也同時輸入,稱為數(shù)組的初始化。例如:nint arr5=9,4,5,6,7;n初始化的結(jié)果是:arr0=9,arr1=4,arr2=5,arr3=6,arr4=7。n也可以任意輸入幾項的值。例如:nint arr5=9,4,5;n初始化的結(jié)果是:arr0=9,arr1=4,arr2=5,arr3=0,arr4=0。n3字符串?dāng)?shù)組字符串
22、數(shù)組n在程序中也可以生成一個字符串?dāng)?shù)組并且對它進(jìn)行初始化。下面程序段生成并初始化了一個字符串?dāng)?shù)組,然后進(jìn)行打印顯示:nchar *foo3=hello,”goodbye,how are you”;ncoutfoo0foo1foo2endl;n4多維數(shù)組多維數(shù)組n在定義多維數(shù)組時,數(shù)組有幾維,就用幾個 。例如,下面的程序代碼段生成了一個二維數(shù)組,共有12個數(shù)組元素:nint arr34;n訪問數(shù)組中的元素時,也是有幾維就用幾個 ,int arr34所定義的12個數(shù)組元素是:arr00,arr01,arr02,arr03,arr10,arr11,arr12,arr13,arr20,arr21,ar
23、r22,arr23。2.2 類的聲明和定義n類是一種復(fù)雜的數(shù)據(jù)類型,它是將不同類型的數(shù)據(jù)和與這些數(shù)據(jù)相關(guān)的操作封裝在一起的集合體。這有點像C語言中的結(jié)構(gòu),惟一不同的就是結(jié)構(gòu)沒有定義所說的“數(shù)據(jù)相關(guān)的操作”,“數(shù)據(jù)相關(guān)的操作”就是平常經(jīng)??吹降摹胺椒ā保虼?,類具有更高的抽象性,類中的數(shù)據(jù)具有隱藏性,類還具有封裝性。n類的結(jié)構(gòu)(也即類的組成)是用來確定一類對象的行為的,而這些行為是通過類的內(nèi)部數(shù)據(jù)結(jié)構(gòu)和相關(guān)的操作來確定的。這些行為是通過一種操作接口來描述的(也即平時所看到的類的成員函數(shù)),使用者只關(guān)心的是接口的功能(也就是只關(guān)心類的各個成員函數(shù)的功能),對它是如何實現(xiàn)的并不感興趣。而操作接口又被
24、稱為這類對象向其他對象所提供的服務(wù)。2.2 類n“類”就是對具有相同數(shù)據(jù)和相同操作的一組相似對象的定義,即類是對具有相同特征和行為的一個或多個對象的描述。在面向?qū)ο缶幊讨?,“類”是一個最重要的概念。2.2.1 類及其成員變量與函數(shù)的聲明和定義1類的定義格式 類的定義格式一般地分為說明部分和實現(xiàn)部分。說明部分將告訴使用者“做什么”,而實現(xiàn)部分是告訴使用者“怎么做”。2類的一般定義格式如下: class public: protected: private:; 2.2.1 類及其成員變量與函數(shù)的聲明和定義3定義類時應(yīng)注意的事項(1)在類體中不允許對所定義的數(shù)據(jù)成員進(jìn)行初始化。(2)類中的數(shù)據(jù)成員的
25、類型可以是任意的,包含整型、浮點型、字符型、數(shù)組、指針和引用等,也可以是對象。(3)一般地,在類體內(nèi)先說明公有成員,它們是用戶所關(guān)心的,后說明私有成員,它們是用戶不感興趣的。在說明數(shù)據(jù)成員時,一般按數(shù)據(jù)成員的類型大小,由小至大說明,這樣可提高時空利用率。(4)經(jīng)常習(xí)慣地將類定義的說明部分或者整個定義部分(包含實現(xiàn)部分)放到一個頭文件中。 2.2.2 構(gòu)造函數(shù)和析構(gòu)函數(shù)n1構(gòu)造函數(shù)n構(gòu)造函數(shù)用于創(chuàng)建一個類實例(對象)時自動完成的工作,如相關(guān)數(shù)據(jù)成員初始化等。構(gòu)造函數(shù)具有以下特征:n構(gòu)造函數(shù)的名字與類名相同,否則編譯程序?qū)阉?dāng)作一般的成員函數(shù)來處理。n構(gòu)造函數(shù)沒有返回值,在聲明和定義構(gòu)造函數(shù)時是
26、不能說明它的類型的。n構(gòu)造函數(shù)的功能是對對象進(jìn)行初始化,且一般只對數(shù)據(jù)成員做初始化。在構(gòu)造函數(shù)中一般不做賦初值以外的的事情。n構(gòu)造函數(shù)不能像其他成員函數(shù)那樣被顯式地調(diào)用,它在對象創(chuàng)建時被調(diào)用。n在一個類中可以定義多個構(gòu)造函數(shù)。2.2.2 構(gòu)造函數(shù)和析構(gòu)函數(shù)n拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參為本類的對象引用??截悩?gòu)造函數(shù)有一個指向類對象的引用作為形式參數(shù),傳統(tǒng)上被聲明為“const”。nclass 類名n public :n 類名(形參);/構(gòu)造函數(shù)n 類名(類名 &對象名);/拷貝構(gòu)造函數(shù)n .n;n類名: 類名(類名 &對象名)/拷貝構(gòu)造函數(shù)的實現(xiàn)n 函數(shù)體 2.2.
27、2 構(gòu)造函數(shù)和析構(gòu)函數(shù)n2析構(gòu)函數(shù)析構(gòu)函數(shù)n提供構(gòu)造函數(shù)的一個目的是為了自動獲取資源,但是還缺少一種對稱的操作,它為生命期即將結(jié)束的類對象返還相關(guān)的資源或者自動釋放資源。析構(gòu)函數(shù)(destructor)就是這樣一個特殊的類成員函數(shù),它是構(gòu)造函數(shù)的互補。2.2.3 友元n類具有封裝和信息隱藏的特性。只有類的成員函數(shù)才能訪問類的私有成員,程序中的其他函數(shù)是無法訪問私有成員的。非成員函數(shù)可以訪問類中的公有成員,但是如果將數(shù)據(jù)成員都定義為公有的,這又破壞了隱藏的特性。另外,應(yīng)該看到在某些情況下,特別是在對某些成員函數(shù)多次調(diào)用時,由于參數(shù)傳遞,類型檢查和安全性檢查等都需要時間開銷,而影響程序的運行效率。
28、n為了解決上述問題,提出一種使用友元的方案。友元是一種定義在類外部的普通函數(shù),但它需要在類體內(nèi)進(jìn)行說明,為了與該類的成員函數(shù)加以區(qū)別,在說明時前面加以關(guān)鍵字friend。友元不是成員函數(shù),但是它可以訪問類中的私有成員。友元的作用在于提高程序的運行效率,但是,它破壞了類的封裝性和隱藏性,使得非成員函數(shù)可以訪問類的私有成員。n友元可以是一個函數(shù),該函數(shù)被稱為友元函數(shù);友元也可以是一個類,該類被稱為友元類。2.2.3 友元n1友元函數(shù)友元函數(shù)n友元函數(shù)的特點是能夠訪問類中的私有成員的非成員函數(shù)。友元函數(shù)從語法上看,它與普通函數(shù)一樣,即在定義上和調(diào)用上與普通函數(shù)一樣。2.2.3 友元n2友元類友元類n
29、友元除了前面講過的函數(shù)以外,友元還可以是類,即一個類可以作另一個類的友元。當(dāng)一個類作為另一個類的友元時,這就意味著這個類的所有成員函數(shù)都是另一個類的友元函數(shù)。2.3 面向?qū)ο蟮木幊碳夹g(shù)n面向?qū)ο蠹夹g(shù)是目前流行的系統(tǒng)設(shè)計開發(fā)技術(shù),它包括面向?qū)ο蠓治龊兔嫦驅(qū)ο蟪绦蛟O(shè)計。面向?qū)ο蟪绦蛟O(shè)計技術(shù)的提出,主要是為了解決傳統(tǒng)程序設(shè)計方法結(jié)構(gòu)化程序設(shè)計所不能解決的代碼重用問題。2.3 面向?qū)ο蟮木幊碳夹g(shù)n面向?qū)ο蠹夹g(shù)是目前流行的系統(tǒng)設(shè)計開發(fā)技術(shù),它包括面向?qū)ο蠓治龊兔嫦驅(qū)ο蟪绦蛟O(shè)計。面向?qū)ο蟪绦蛟O(shè)計技術(shù)的提出,主要是為了解決傳統(tǒng)程序設(shè)計方法結(jié)構(gòu)化程序設(shè)計所不能解決的代碼重用問題。2.3.1 面向?qū)ο蟪绦蛟O(shè)計n
30、結(jié)構(gòu)化程序設(shè)計從系統(tǒng)的功能入手,按結(jié)構(gòu)化程序設(shè)計從系統(tǒng)的功能入手,按照工程的標(biāo)準(zhǔn)和嚴(yán)格的規(guī)范將系統(tǒng)分解照工程的標(biāo)準(zhǔn)和嚴(yán)格的規(guī)范將系統(tǒng)分解為若干功能模塊,系統(tǒng)是實現(xiàn)模塊功能為若干功能模塊,系統(tǒng)是實現(xiàn)模塊功能的函數(shù)和過程的集合。由于用戶的需求的函數(shù)和過程的集合。由于用戶的需求和軟、硬件技術(shù)的不斷發(fā)展變化,按照和軟、硬件技術(shù)的不斷發(fā)展變化,按照功能設(shè)計的系統(tǒng)模塊必然是易變的和不功能設(shè)計的系統(tǒng)模塊必然是易變的和不穩(wěn)定的,這樣開發(fā)出來的模塊可重用性穩(wěn)定的,這樣開發(fā)出來的模塊可重用性不高不高。n面向?qū)ο蟪绦蛟O(shè)計從所處理的數(shù)據(jù)入手,以數(shù)據(jù)為中心而不是以服務(wù)(功能)為中心來描述系統(tǒng)。它把編程問題視為一個數(shù)據(jù)集
31、合,而數(shù)據(jù)相對于功能而言,具有更強的穩(wěn)定性。n面向?qū)ο蟮木幊谭椒ň哂谐橄?、封裝、繼承和多態(tài)4個基本特征。2.3.1 面向?qū)ο蟪绦蛟O(shè)計n1. 抽象抽象n抽象就是對一類對象進(jìn)行概括,抽出它們共同的性質(zhì)并加以描述的過程。它忽略主題中與當(dāng)前目標(biāo)無關(guān)的那些方面,以便更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面。抽象包括兩個方面:一是過程抽象,二是數(shù)據(jù)抽象。過程抽象是指任何一個明確定義功能的操作都可被使用者作為單個的實體看待,盡管這個操作實際上可能由一系列更低級的操作來完成。數(shù)據(jù)抽象定義了數(shù)據(jù)類型和施加于該類型對象上的操作,并限定了對象的值只能通過使用這些操作修改和查看。2.3.1 面向?qū)ο蟪绦蛟O(shè)計n2. 繼承繼承n
32、繼承是一種聯(lián)結(jié)類的層次模型,并且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類可以從現(xiàn)有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那里繼承方法和實例變量,并且派生類可以修改或增加新的方法使之更適合特殊的需要。這也體現(xiàn)了大自然中一般與特殊的關(guān)系。繼承性很好的解決了軟件的可重用性問題。比如說,所有的Windows應(yīng)用程序都有一個窗口,它們可以看作都是從一個窗口類派生出來的。但是有的應(yīng)用程序用于文字處理,有的應(yīng)用程序用于繪圖,這是由于派生出了不同的子類,各個子類添加了不同的特性。2.
33、3.1 面向?qū)ο蟪绦蛟O(shè)計n3. 封裝封裝n封裝是把過程和數(shù)據(jù)包圍起來,對數(shù)據(jù)的訪問只能通過已定義的界面進(jìn)行。面向?qū)ο笫加谶@個基本概念,即現(xiàn)實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口訪問其他對象。一旦定義了一個對象的特性,則有必要決定這些特性的可見性,即哪些特性對外部世界是可見的,哪些特性用于表示內(nèi)部狀態(tài)。通常,應(yīng)禁止直接訪問一個對象,而應(yīng)通過操作接口訪問對象,這稱為信息隱藏。2.3.1 面向?qū)ο蟪绦蛟O(shè)計n4. 多態(tài)性多態(tài)性n多態(tài)性是指允許不同類的對象對同一消息作出響應(yīng)。例如,同樣是加法,把兩個時間加在一起和把兩個整數(shù)加在一起肯定完全不同。多態(tài)性語言具有靈活、抽象
34、、行為共享、代碼共享的優(yōu)勢,很好地解決了應(yīng)用程序函數(shù)同名的問題。2.3.2 封裝n封裝是面向?qū)ο蟮奶卣髦唬菍ο蠛皖惖闹饕卣?。將一組相互關(guān)聯(lián)的靜態(tài)屬性和動態(tài)方法組合在一起,構(gòu)成一個對象,是封裝的主要概念之一。n封裝的另一層含義是指對象內(nèi)部的私有屬性和方法的對外不可見性。這樣不僅可以實現(xiàn)私有成員的信息隱藏,而且可以避免各對象之間私有同名成員的互擾。2.3.3 繼承n1繼承的種類n2類成員的可訪問特性n3公有繼承和私有繼承n4繼承中的同名成員訪問n5繼承中的構(gòu)造函數(shù)2.3.3 繼承n1繼承的種類n在C+語言中,實現(xiàn)繼承的種類包括:n(1)單繼承n(2)多繼承n(3)重復(fù)繼承n(4)共享繼承n單
35、繼承是指具有單一直接父類的繼承關(guān)系。n多繼承是指具有多個直接父類的繼承關(guān)系。n單繼承和多繼承示意圖如圖2-1所示。n重復(fù)繼承和共享繼承是多繼承的一種變異形態(tài)。重復(fù)繼承是指一個子類根據(jù)需要多次繼承一個父類,且在子類中保留多個父類副本的繼承方式,而共享繼承則是通過直接和間接的方式多次繼承一個父類,但最終只在子類中保留一個父類副本的繼承機制。重復(fù)繼承和共享繼承過程都需要以間接方式實現(xiàn)。n圖2-1 單繼承和多繼承示意圖2.3.3 繼承n2類成員的可訪問特性n在繼承中,可以通過指定類的屬性和方法的可訪問特性。如上所述,在一個類中,屬性和方法都可以指定為私有、公有或受保護,并以此來決定被子類繼承的可能性以
36、及被外界訪問的可能性,類成員的可訪問特性如圖2-2所示。n具有私有訪問特性的屬性和方法不能被繼承,也不能被外界所訪問。n具有公有訪問特性的屬性和方法不僅可以被繼承,而且也可以被外界所訪問。n具有受保護訪問特性的屬性和方法只可以被繼承,而不能被外界所訪問。 2.3.3 繼承n3公有繼承和私有繼承n 類的繼承方式包括公有繼承和私有繼承兩種。n 公有繼承時,父類的受保護成員被繼承為子類的受保護成員,父類的公有成員被繼承為子類的公有成員,父類的私有成員不能被繼承。n 私有繼承時,父類的受保護成員和公有成員都被繼承為子類的私有成員。同樣,父類的私有成員不能被繼承。2.3.3 繼承n4繼承中的同名成員訪問
37、n在繼承關(guān)系中,父類的非私有成員可以被子類所繼承。同時,子類也可以定義父類的同名成員。如果是屬性成員同名,則相應(yīng)產(chǎn)生一個新屬性成員,如果是定義了一個和父類具有相同原型的方法成員,則子類方法對父類的同名方法構(gòu)成覆蓋關(guān)系。n單繼承中的同名成員和多繼承中的同名成員具有類似的地方,因此,可以以單繼承為例說明其使用方法,如表2-3所示:2.3.3 繼承n則在B類方法中直接使用的屬性成員ya表示在子類中重新定義的成員(在子類定義中以粗體表示),而只有使用如:nA:yan形式的成員才表示需要使用父類中的ya成員。同樣,在使用子類中的za成員和使用父類中的za成員時,也需要采用同樣的方法。如果定義B類對象為b
38、,則訪問子類中的za成員的方法為:nb.zan而訪問父類中的成員za,則需要采用:nb.A:zan的形式。nn在多繼承中,如果父類A1和父類A2中同時存在可繼承屬性成員x ,同時在子類B中再次定義了一個同名成員x ,則在定義一個子類對象b之后,訪問三個類中的同名成員的方法為:nb.x/使用子類中的成員nb.A1:x/使用父類A1中的成員nb.A2:x/使用父類A2中的成員n可見,多繼承中的同名成員訪問和單繼承類似。2.3.3 繼承n5繼承中的構(gòu)造函數(shù)繼承中的構(gòu)造函數(shù)n1)單繼承中的構(gòu)造函數(shù)n構(gòu)造函數(shù)是類中的一個特殊的函數(shù)。應(yīng)用構(gòu)造函數(shù)的主要目的是期望在創(chuàng)建對象的同時進(jìn)行必要的初始化。如下例中的CIRCLE類:nclass CIRCLEnprivate:nint x,y;/圓心坐標(biāo)n
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)村放養(yǎng)牛出售合同范例
- 公司向公司借款合同范例
- 工地水泥采購合同范例
- 婚禮租車合同范例
- 乙方承包合同范例
- 異業(yè)合作合同模板
- 彩鋼瓦銷售合同模板
- 受傷賠償合同范例
- 《變頻器基礎(chǔ)問》課件
- 中藥批發(fā)掌舵之策
- 淺談高中英語教學(xué)中學(xué)生創(chuàng)造性思維的培養(yǎng)
- 配電設(shè)備的日常管理及維護保養(yǎng)(PPT41頁)
- 電子琴伴奏及音色中英文對照表
- 蘇教版初中化學(xué)常見氣體的檢驗與除雜教案
- 網(wǎng)絡(luò)教研——開辟校本教研新模式
- 火災(zāi)報警系統(tǒng)技術(shù)規(guī)范書
- 魚塘租賃合同
- 教材自編傳統(tǒng)節(jié)日校本課程
- 樓宇自控系統(tǒng)調(diào)試方案
- hydac壓力繼電器說明書
- 中成藥上市公司組織架構(gòu)及部門職責(zé)
評論
0/150
提交評論