版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
從C到C++C語(yǔ)言程序設(shè)計(jì)目錄content對(duì)象的思想1從C到C++的過(guò)渡2OOP設(shè)計(jì)思路311.1對(duì)象的思想
“面向過(guò)程”(ProcedureOriented)是一種以過(guò)程為中心的編程思想,把系統(tǒng)看成一個(gè)過(guò)程的集合體,分析出解決問(wèn)題所需要的步驟。
特點(diǎn):自頂而下;逐步求精;模塊化設(shè)計(jì)。面向過(guò)程化的編程方式11.1.1從面向過(guò)程到面向?qū)ο竺嫦蜻^(guò)程的程序設(shè)計(jì)定義為:程序=(算法)+(數(shù)據(jù)結(jié)構(gòu))優(yōu)點(diǎn):很好地解決諸如工業(yè)過(guò)程控制、設(shè)備控制、計(jì)算機(jī)底層硬件驅(qū)動(dòng)等問(wèn)題,這類程序往往有很清晰的流程邏輯。缺點(diǎn):函數(shù)能夠不受限制地訪問(wèn)全局?jǐn)?shù)據(jù),函數(shù)與數(shù)據(jù)之間分離,缺乏聯(lián)系,項(xiàng)目難理解和維護(hù)、代碼重用性差。11.1.1從面向過(guò)程到面向?qū)ο蟆懊嫦驅(qū)ο蟆保∣bjectOriented)是一種以對(duì)象為中心的編程思想,把系統(tǒng)看成一個(gè)相互作用的對(duì)象集,對(duì)象之間通過(guò)發(fā)送和響應(yīng)消息進(jìn)行交互。對(duì)象即現(xiàn)實(shí)世界中客觀存在的事物,面向過(guò)程的編程方式是將問(wèn)題分解為過(guò)程,而面向?qū)ο蟮木幊谭绞揭詥?wèn)題中的對(duì)象為中心思考問(wèn)題。例如問(wèn)題是下一局圍棋。面向過(guò)程將問(wèn)題分解為解決問(wèn)題的步驟:1、擺棋盤(pán)2、放下一個(gè)棋子3、規(guī)則判斷4、放下第二個(gè)棋子5、規(guī)則判斷……面向?qū)ο髮?wèn)題看成不同對(duì)象的相互作用:1、棋盤(pán):狀態(tài)、行為;2、棋子:狀態(tài)、行為;……面向?qū)ο筮\(yùn)用人類的自然思維方式,強(qiáng)調(diào)以現(xiàn)實(shí)世界中的事物為中心,思考問(wèn)題、認(rèn)識(shí)問(wèn)題,以更好地看清事物的本質(zhì)特點(diǎn)。11.1.1從面向過(guò)程到面向?qū)ο?/p>
C++中的對(duì)象是將數(shù)據(jù)和對(duì)數(shù)據(jù)的操作封裝在一起的實(shí)體,即一種抽象數(shù)據(jù)類型——“類”類型的實(shí)體。classStudent{private:charname[20];charid[15];intage;public:voidshow(){
…
}};例如
數(shù)據(jù)
對(duì)數(shù)據(jù)的操作1)對(duì)象的屬性:用數(shù)據(jù)集合描
述對(duì)象的狀態(tài)2)對(duì)象的方法:用函數(shù)來(lái)實(shí)現(xiàn)
對(duì)象的行為3)對(duì)象之間通過(guò)消息通信,實(shí)現(xiàn)動(dòng)態(tài)聯(lián)系11.1.1從面向過(guò)程到面向?qū)ο竺嫦驅(qū)ο蟮木幊谭绞矫嫦驅(qū)ο蟮某绦蛟O(shè)計(jì)定義為:程序=(對(duì)象1)+(對(duì)象2)+…11.1.2類的說(shuō)明class類名{
數(shù)據(jù)成員 ...
成員函數(shù) ...};類:與int、char相似,是一種數(shù)據(jù)類型。類的構(gòu)成包括數(shù)據(jù)成員和成員函數(shù):數(shù)據(jù)成員對(duì)應(yīng)類的屬性;成員函數(shù)對(duì)應(yīng)類的方法,用于操作類的屬性。類的定義格式classStudent{private:charname[20];charid[15];intage;public:voidselectCourse(){
…
}};例如對(duì)現(xiàn)實(shí)世界中的對(duì)象進(jìn)行抽象,從而得到了類的概念。
但是對(duì)每個(gè)對(duì)象抽象成類會(huì)非常繁瑣,根據(jù)不同對(duì)象的共性,將類按照:“父類”(“基類”)“子類”(“派生類“)構(gòu)成“類層次結(jié)構(gòu)”。11.2從C到C++的過(guò)渡例11.2C語(yǔ)言的輸入輸出由庫(kù)函數(shù)實(shí)現(xiàn),主要包括:scanf(),printf(),getc(),gets(),putc(),puts()等,它們包含在文件stdio.h中。C++語(yǔ)言的輸入輸出利用運(yùn)算符>>和<<,以及cin和cout,,它們包含在文件iostream.h中#include<iostream.h>intmain(void){doublea,b,c;cout<<“Inputtwofloatnumbers:”;//插入符cin>>a>>b;//提取符,用空格或回車間隔c=a+b;cout<<“a+b=”<<c<<endl;//endl表示輸出一個(gè)換行符,等同于轉(zhuǎn)義字符’\n’return0;}11.2.1C++的I/O幾點(diǎn)說(shuō)明:(1)C++中沒(méi)有專門的輸入/輸出語(yǔ)句,可以利用輸入流和輸出流來(lái)進(jìn)行數(shù)據(jù)的輸入和輸出,此時(shí),程序開(kāi)頭要包含頭文件iostream.h;(2)運(yùn)算符“>>”稱為提取運(yùn)算符,表示將暫停程序的執(zhí)行,等待用戶從鍵盤(pán)上輸入相應(yīng)的數(shù)據(jù)。一個(gè)提取運(yùn)算符只能跟一個(gè)變量名;(3)cin輸入流的一般語(yǔ)法格式:cin>><變量名1>[>><變量名2>>>…>><變量名n>];(4)運(yùn)算符“<<”稱為插入運(yùn)算符,它將緊跟其后的表達(dá)式的值輸出到顯示器當(dāng)前光標(biāo)的位置,也可以輸出轉(zhuǎn)義字符;(5)cout輸入流的一般語(yǔ)法格式:cout<<<表達(dá)式1>《<<<表達(dá)式2><<…<<<表達(dá)式n>》;11.2.2const和volatile訪問(wèn)修飾符1、const的基本概念幾點(diǎn)說(shuō)明:const用于凍結(jié)變量,使其值在程序中不能被修改(1)使用const修飾變量時(shí),必須對(duì)該變量進(jìn)行初始化。(2)使用const修飾的變量存放在編譯器的符號(hào)表中,計(jì)算時(shí)編譯器直接從表中取值。(3)在C++中用const替代C中define定義的宏,因?yàn)閏onst定義的常量有數(shù)據(jù)類型信息,是真正的數(shù)據(jù),它被登記在namespace中,具有名字、類型和值,便于類型檢查和debug調(diào)試。C語(yǔ)言中:“#define變量名變量值”定義一個(gè)值替代,存在致命的缺點(diǎn):缺乏類型檢測(cè)機(jī)制。(4)使用const修飾函數(shù)的參數(shù)時(shí),編譯器將阻止該函數(shù)代碼修改參數(shù)值。11.2.2const和volatile訪問(wèn)修飾符2、const與指針例11.4下面的聲明都是什么意思?inta;constintca=10;//等同intconstca=10;定義時(shí)必須對(duì)該變量進(jìn)行初始化constint*pca;//等同intconst*pca;int*constcpa=&a;//常指針需要定義時(shí)初始化intconst*constcpca=&a;pca=&a;//正確pca=&ca;//正確*pca=20;//錯(cuò)誤
整數(shù)型變量
整數(shù)型變量pca是一個(gè)指向常整型數(shù)的指針,整型數(shù)是不可修改的,但指針pca是可變的cpa是一個(gè)指向整型數(shù)的常指針(常量指針),指針cpa指向的整型數(shù)是可以修改的,但指針cpa是常量指針,是不可修改的。常量指針cpa可以指向讀寫(xiě)型變量a,但不能指向const量(只讀型)cacpca是一個(gè)指向常整型數(shù)的常指針,指針指向的整型數(shù)是不可修改的,同時(shí)指針也是不可修改的11.2.2const和volatile訪問(wèn)修飾符3、volatile的作用volatile
意為“易失的、易變的”,它告訴編譯器,即使程序中沒(méi)有明顯地改變這個(gè)變量的值,該變量的值也會(huì)由于程序外部的原因(中斷、事件)而被潛在改變。準(zhǔn)確地說(shuō)就是,編譯器優(yōu)化時(shí),在用到這個(gè)變量時(shí)必須每次都重新讀取這個(gè)變量的值,即每次讀寫(xiě)都必須訪問(wèn)實(shí)際地址存儲(chǔ)器的內(nèi)容,而不是使用保存在寄存器、或cache中的副本?!編c(diǎn)說(shuō)明】(1)volatile修飾變量時(shí),即使用戶進(jìn)程不修改該變量,仍要求編譯器按照該變量值會(huì)因?yàn)橥獠窟M(jìn)程的操作而改變來(lái)進(jìn)行編譯。(2)中斷服務(wù)例程中使用的非自動(dòng)變量或者多線程應(yīng)用程序中多個(gè)任務(wù)共享的變量必須使用volatile進(jìn)行限定。11.2.2const和volatile訪問(wèn)修飾符3、volatile的作用例如
intflag=0;voidfun(){while(1){if(flag)some_action();}}voidisr_fun()//中斷函數(shù){flag=1;}fun()函數(shù)中并沒(méi)有修改flag,可能只執(zhí)行一次flag讀操作并將flag的值緩存在寄存器中,以后每次訪問(wèn)flag(讀操作)都使用寄存器中的緩存值而不進(jìn)行存儲(chǔ)器絕對(duì)地址訪問(wèn),導(dǎo)致some_action函數(shù)永遠(yuǎn)無(wú)法執(zhí)行,即使中斷函數(shù)isr_fun()執(zhí)行了將flag置1。11.2.3引用1、
引用的基本概念在一個(gè)程序中用不同的變量名指向同一地址的同一內(nèi)容的數(shù)據(jù)類型描述稱為引用。<類型名>
&引用型函數(shù)名或變量名=前已聲明的(常)變量名引用的一般格式為:intnum=50;int&ref=num;例如
ref是對(duì)num的引用,即ref是num的別名,它們共用一個(gè)存儲(chǔ)空間,對(duì)ref的任何操作等同于對(duì)num的任何操作。11.2.3引用幾點(diǎn)說(shuō)明1、引用的目標(biāo)變量類型要與引用變量的類型一致,即ref的類型為int&,num的
類型為int。2、指針和引用的區(qū)別
①指針變量存儲(chǔ)空間中保存了目標(biāo)變量存儲(chǔ)空間的地址值,而引用不分配空
間,引用必須初始化。
②指針可以修改它的指向,但引用和對(duì)象綁定后,將無(wú)法修改11.2.3引用2、
引用參數(shù)
引用的真正目的就是在不同的作用域中分別使用引用名和被引用的目標(biāo)變量名,比如:調(diào)用函數(shù)和被調(diào)用函數(shù)。11.2.3引用例11.7SwapInt()函數(shù)利用指針參數(shù)來(lái)實(shí)現(xiàn)互換它的兩個(gè)參數(shù)
#include<iostream.h>voidSwapInt(int*a,int*b){inttemp;temp=*a;*a=*b;*b=temp;}voidmain(){intnum1,num2;num1=5,num2=10;SwapInt(&num1,&num2);cout<<“num1=”<<num1<<“,num2=”<<num2<<endl;return0;}
運(yùn)行情況如下:num1=10,num2=5
由于指針本身的靈活性,允許指針重新建立新的指向,對(duì)指針變量不小心的修改其值,可能導(dǎo)致程序異常。11.2.3引用例11.8SwapInt()函數(shù)利用指針參數(shù)來(lái)實(shí)現(xiàn)互換它的兩個(gè)參數(shù)#include<iostream.h>voidSwapInt(int&a,int&b){inttemp;temp=a;a=b;b=temp;}intmain(void){intnum1=5,num2=10;SwapInt(num1,num2);cout<<“num1=”<<num1<<“,num2=”<<num2<<endl;return0;}運(yùn)行情況如下:num1=10,num2=5
在整個(gè)SwapInt函數(shù)執(zhí)行期間,對(duì)a的讀寫(xiě)實(shí)際上是通過(guò)對(duì)main函數(shù)的num1變量的讀寫(xiě)來(lái)完成的。
傳引用與傳指針相比,在SwapInt函數(shù)內(nèi),無(wú)法修改a和b的綁定目標(biāo),而這一點(diǎn)在指針傳遞機(jī)制中往往需要程序員嚴(yán)格把關(guān)。由于引用和目標(biāo)的固定綁定關(guān)系,引用常被看做是安全的指針。
有時(shí),既為了使形參共享實(shí)參的存儲(chǔ)空間,又不希望通過(guò)形參改變實(shí)參的值,則應(yīng)當(dāng)把該形參說(shuō)明為常量引用,例如:voidfun(constint&cra);11.2.3引用3、
返回引用
在C中,函數(shù)調(diào)用表達(dá)式不能放在賦值運(yùn)算符“=”的左邊作為左值。但在C++中,若函數(shù)返回類型為引用類型,則函數(shù)調(diào)用可以作為左值,實(shí)際上返回的是某個(gè)存儲(chǔ)單元。例如#include<iostream.h>intIndex=0;//此處定義為全局變量int&GetIndex(){returnIndex;}intmain(void){intn;n=GetIndex();//把Index的值拷貝給nGetIndex()=5;//給Index賦值5cout<<++GetIndex()<<endl;//Index自增1return0;}11.2.3引用幾點(diǎn)說(shuō)明(1)GetIndex函數(shù)返回值本身相當(dāng)于Index的別名,所以可以出現(xiàn)在賦值運(yùn)算符左邊。(2)由于函數(shù)調(diào)用返回的引用是在函數(shù)運(yùn)行結(jié)束后,函數(shù)結(jié)束瞬間函數(shù)棧中的自動(dòng)變量(含形參變量)的空間將被回收釋放。因此,函數(shù)所引用的變量在函數(shù)調(diào)用返回后必須是存在,不能返回自動(dòng)變量和形參,可安全返回全局變量和靜態(tài)變量。(3)由于常量不分配空間,所以也不能返回常量,但用const聲明返回引用時(shí),返回常量是合法的,如:constint&fun(){return1;}編譯器會(huì)創(chuàng)建臨時(shí)的constint變量,去初始化fun()11.2.4作用域分辨符
在函數(shù)內(nèi)部作用域中定義一個(gè)變量,如果它的名字和外部作用域定義的某個(gè)變量同名,那么,在程序執(zhí)行到函數(shù)內(nèi)部作用域時(shí)對(duì)應(yīng)同名變量是內(nèi)部的同名變量,因?yàn)閮?nèi)部作用域變量覆蓋了外部作用域變量。這時(shí)如果要訪問(wèn)外部作用域同名變量,則要通過(guò)作用域分辨符::來(lái)訪問(wèn)全局變量.#include<iostream.h>doublea;intmain(void){inta;a=1;::a=40.5;cout<<“局部變量inta=“<<a<<endl;cout<<“全局變量doublea=“<<::a<<endl;return0;}例如11.2.5重載1、
函數(shù)重載
在C++中,函數(shù)可以共享同一個(gè)名字,只要這些同名函數(shù)的參數(shù)表有所區(qū)別,這就是函數(shù)重載的概念。同一作用域內(nèi)名字相同,但參數(shù)不同的函數(shù)稱為重載函數(shù)。 C中規(guī)定,每個(gè)函數(shù)都必須有唯一的名字,不允許有重名的函數(shù)。這樣就帶來(lái)很多不便。如C運(yùn)行庫(kù)中的求絕對(duì)值函數(shù)abs(),labs(),fabs()。盡管它們處理的幾乎是完全相同的工作,但在C中卻要用三個(gè)不同的函數(shù)名來(lái)區(qū)分。11.2.5重載例11.12重載abs函數(shù)
#include<iostream.h>//abs()函數(shù)按三種形式重載intabs(inti);longabs(longl);doubleabs(doubled);intmain(void){cout<<abs(-10)<<endl;cout<<abs(-9L)<<endl;cout<<abs(-11.5)<<endl;return0;}intabs(inti){returni<0?-i:i;}
longabs(longl){returnl<0?-l:l;}
doubleabs(doubled){returnd<0?–d:d;}運(yùn)行情況如下:10911.5重載函數(shù)的參數(shù)差別:參數(shù)類型、參數(shù)個(gè)數(shù)、參數(shù)類型的次序。11.2.5重載(1)編譯器在選擇使用哪一個(gè)重載函數(shù)時(shí),有時(shí)不得不處理一些模糊問(wèn)題。處理這些模糊問(wèn)題的原則是:就近匹配,即就近調(diào)用最便于進(jìn)行類型轉(zhuǎn)換的重載函數(shù)。比如:abs(‘a(chǎn)’),就被處理成就近調(diào)用intabs(inti);這種數(shù)據(jù)類型轉(zhuǎn)換包括:char->int、int->long、float->double。如果類型無(wú)法轉(zhuǎn)換,編譯器將給出錯(cuò)誤信息。幾點(diǎn)說(shuō)明(2)對(duì)于函數(shù)重載,若函數(shù)調(diào)用(界面)與哪一個(gè)函數(shù)體(函數(shù)實(shí)現(xiàn))相匹配,是在編譯時(shí)確定的,稱為早期匹配(earlybinding);如果函數(shù)調(diào)用與哪一個(gè)函數(shù)體的匹配是在運(yùn)行時(shí)動(dòng)態(tài)進(jìn)行的,稱之為晚期匹配(latelybinding)。一般來(lái)說(shuō),早期匹配執(zhí)行速度比較快,晚期匹配提供靈活性和高度的問(wèn)題抽象。C++語(yǔ)言的函數(shù)重載屬于早期匹配,后面章節(jié)介紹的多態(tài)特性屬于晚期匹配。11.2.5重載 C++中,函數(shù)的參數(shù)可以定義一個(gè)缺省值,當(dāng)調(diào)用時(shí)沒(méi)給出參數(shù)值,就自動(dòng)使用這個(gè)缺省參數(shù)值。因此,參數(shù)帶缺省值的函數(shù)也是一種重載函數(shù)。2、函數(shù)的缺省參數(shù)例如voiddelay(intloops=500);……voiddelay(intloops){…//delay的函數(shù)體}(1)可以明確給出實(shí)參值,調(diào)用delay函數(shù);也可以不給出實(shí)參值,調(diào)用delay函數(shù)。對(duì)于后一種情況,delay會(huì)自動(dòng)認(rèn)為參數(shù)loops的值為500。(2)如果對(duì)函數(shù)原型中指定了缺省參數(shù),而在實(shí)際的函數(shù)定義中就不必再給出參數(shù)的缺省值了。如果程序中沒(méi)有給出函數(shù)原型,就只能在函數(shù)定義時(shí)給出參數(shù)的缺省值了。11.2.5重載doubledistance(doublex1,doubley1,doublex2=0,doubley2=0);……
以下是正確調(diào)用方式:distance(1,2);distance(1,2,3);distance(1,2,3,4);
以下調(diào)用方式錯(cuò)誤:distance(1,2,,4);//出錯(cuò),調(diào)用函數(shù)時(shí),參數(shù)應(yīng)該連續(xù)給出,不能間斷。(3)一個(gè)函數(shù)可以有多個(gè)缺省參數(shù),所有的缺省參數(shù)必須集中列在參數(shù)表的最后。調(diào)用時(shí)對(duì)提供了缺省值的參數(shù)可以不給出實(shí)際數(shù)據(jù),但是從那個(gè)參數(shù)開(kāi)始后面所有參數(shù)都要有缺省值,否則出錯(cuò)。例11.2.5重載voiddisplay(char*str);voiddisplay(char*str,intlength=12);…display(“Hello,C++”);//編譯錯(cuò)誤,因?yàn)檫@
個(gè)調(diào)用和兩個(gè)重載形式都匹配,所以出錯(cuò)(4)在重載函數(shù)中使用缺省參數(shù)時(shí),有時(shí)會(huì)產(chǎn)生具有歧義的重載函數(shù)調(diào)用。例11.2.6內(nèi)聯(lián)函數(shù) C語(yǔ)言中,可以用#define來(lái)進(jìn)行常量宏,也可以定義帶參數(shù)表達(dá)式的宏。預(yù)處理器會(huì)在編譯之前把宏名展開(kāi)成相應(yīng)的字符串或表達(dá)式。#include<iostream.h>#definemax(x,y)((x)>(y)?(x):(y))//定義宏max(x,y)為x和y中的較大者intmain(){inta,b,c,t;a=1,b=2,c=3;t=max(a+b,c);//編譯預(yù)處理器對(duì)表達(dá)式進(jìn)行宏展開(kāi):t=((a+b)>(c)?(a+b):(c));return0;}例11.2.6內(nèi)聯(lián)函數(shù)
在C++中,可以利用內(nèi)聯(lián)函數(shù)達(dá)到類似的效果。內(nèi)聯(lián)函數(shù)用關(guān)鍵字inline。和帶參數(shù)的宏定義相比,內(nèi)聯(lián)函數(shù)的形式更像普通函數(shù),可讀性強(qiáng),因此,建議在C++中使用內(nèi)聯(lián)函數(shù)代替帶參數(shù)的宏定義。#include<iostream.h>inlineintmax(inta,intb){returna>b?a:b;}intmain(){intt;t=max(10,20);//被max相應(yīng)的函數(shù)體所替換(代碼擴(kuò)展):t=10>20?10:20;cout<<t<<endl;return0;}例11.2.6內(nèi)聯(lián)函數(shù)(1)在函數(shù)定義前使用關(guān)鍵字inline時(shí),原則上,該函數(shù)不被編譯為單獨(dú)的一段可調(diào)用的代碼,而是將函數(shù)體內(nèi)容插入到對(duì)該函數(shù)的每一個(gè)調(diào)用處。幾點(diǎn)說(shuō)明(2)調(diào)用函數(shù)時(shí),參數(shù)要進(jìn)棧,CPU寄存器狀態(tài)值需要保存;函數(shù)返回時(shí),要還原CPU的狀態(tài)。所以,函數(shù)調(diào)用需要一定的時(shí)間和空間開(kāi)銷。使用內(nèi)聯(lián)函數(shù)提高了運(yùn)行效率。(3)內(nèi)聯(lián)函數(shù)的內(nèi)聯(lián)擴(kuò)展,增加了目標(biāo)程序的代碼量,增加了空間開(kāi)銷,但比使用函數(shù)節(jié)約了時(shí)間開(kāi)銷。因此,內(nèi)聯(lián)函數(shù)是以增加目標(biāo)代碼的尺寸來(lái)節(jié)省時(shí)間,即“以空間換時(shí)間”。因此,最好只內(nèi)聯(lián)那些體積非常小,明顯影響程序性能的函數(shù)。11.2.6內(nèi)聯(lián)函數(shù)(4)inline對(duì)編譯器來(lái)說(shuō)只是一個(gè)請(qǐng)求,而不是命令。編譯器自由決定要不要忽略inline命令,如果含有循環(huán)、Switch、遞歸調(diào)用,則編譯器視之為普通函數(shù)(通過(guò)編譯,不會(huì)報(bào)錯(cuò)),將其作為普通函數(shù)處理。幾點(diǎn)說(shuō)明(5)不同的編譯器對(duì)內(nèi)聯(lián)請(qǐng)求的態(tài)度不同。有的編譯器不允許內(nèi)聯(lián)函數(shù)中包含循環(huán)語(yǔ)句;有的規(guī)定了內(nèi)聯(lián)函數(shù)的大小不能超過(guò)一個(gè)閾值。(6)在C++中常用const變量和內(nèi)聯(lián)函數(shù)來(lái)代替宏和帶參宏。11.3OOP設(shè)計(jì)思路
面向?qū)ο蟮脑O(shè)計(jì)思想將自然界所有事物都看成對(duì)象,每個(gè)對(duì)象有自己獨(dú)特的狀態(tài)和行為。對(duì)象之間彼此關(guān)聯(lián)和作用構(gòu)成了千變?nèi)f化的現(xiàn)實(shí)世界。
面向?qū)ο蟮脑O(shè)計(jì)思想體系里,對(duì)象是共性和個(gè)性的對(duì)立統(tǒng)一體。一方面,它們因其存在的共性使得各自都屬于特定的某個(gè)類別,比如:發(fā)動(dòng)機(jī)、電視機(jī)、學(xué)生;另一方面,它們又是同一個(gè)類別中特有的一個(gè)個(gè)體,比如:汽車發(fā)動(dòng)機(jī)、彩色電視機(jī)、大學(xué)生。
在面向?qū)ο篌w系中,共性的內(nèi)容由類類型來(lái)聲明。用該類類型定義變量的方式,來(lái)創(chuàng)建的不同的對(duì)象,表示同一個(gè)類別下的不同個(gè)體。11.3.1面向?qū)ο蟮脑O(shè)計(jì)特征(1)抽象
抽象就是從同一個(gè)類別的多個(gè)個(gè)體中抽取出它們共性的東西,包括:狀態(tài)和行為。狀態(tài)就是數(shù)據(jù),行為是對(duì)這些數(shù)據(jù)進(jìn)行的操作。(2)封裝
面向?qū)ο笤O(shè)計(jì)思想最大的特點(diǎn)就是封裝——將所有的狀態(tài)數(shù)據(jù)及對(duì)這些數(shù)據(jù)進(jìn)行處理的函數(shù)(又叫做方法)封裝在同一個(gè)類類型中,然后設(shè)置訪問(wèn)權(quán)限,有些私密的狀態(tài)數(shù)據(jù)不能直接訪問(wèn),只能通過(guò)事先設(shè)計(jì)好的方法來(lái)提供訪問(wèn),保證私密數(shù)據(jù)的安全性,避免非法操作和出錯(cuò)的可能性。11.3.1面向?qū)ο蟮脑O(shè)計(jì)特征(3)繼承
繼承的過(guò)程,就是從一般到特殊的過(guò)程。繼承產(chǎn)生的新類型中保留了基類的數(shù)據(jù)和方法,而不用在新類型中重新設(shè)計(jì)??梢钥闯?,繼承是一種按層分類的概念。繼承實(shí)現(xiàn)了父類和子類:子類可以使用父類的所有功能,并且對(duì)這些功能進(jìn)行擴(kuò)展。(4)多態(tài)
同一類型的不同個(gè)體在做相同的行為動(dòng)作時(shí)可能產(chǎn)生不同的結(jié)果。多態(tài)是與繼承有關(guān)的概念。同種事物,多種狀態(tài),即同一個(gè)接口名稱,但是體現(xiàn)為不同的功能。11.3.1面向?qū)ο蟮脑O(shè)計(jì)特征例如C語(yǔ)言中通過(guò)定義一個(gè)結(jié)構(gòu)體Student,來(lái)描述學(xué)生structStudent{charname[20];charid[15];intage;};voidshow(structStudent*s)//定義顯示學(xué)生基本信息的函數(shù){
…//具體實(shí)現(xiàn)}11.3.1面向?qū)ο蟮脑O(shè)計(jì)特征例如C++中通過(guò)定義一個(gè)類Studen,來(lái)描述學(xué)生classStudent{private:charname[20];charid[15];intage;public:voidshow(){
…//具體實(shí)現(xiàn)}};(1)作用域包括:全局作用域、文件作用域、函數(shù)作用域、復(fù)合語(yǔ)句作用域和這里提到的class類作用域。(2)在同一個(gè)class類作用域里可以直接不加作用域分辨符訪問(wèn)自身的其他成員,包括成員數(shù)據(jù)和成員方法。(3)在class類作用域外的要想調(diào)用show方法必須加上類名和作用域分辨符——Student::show()。(4)空類沒(méi)有任何成員,包括數(shù)據(jù)和函數(shù)。例如classempty{};但空類對(duì)象大小不為零。11.3.2類設(shè)計(jì)實(shí)例例11.15針對(duì)上一節(jié)介紹的Student類,我們來(lái)給出該類的初步設(shè)計(jì)原型。classStudent{private://可以省略此行。如果不寫(xiě)訪問(wèn)權(quán)限,class默認(rèn)是privatecharname[20];charid[15];intage;public:voidregisterStudent(constchar*n,constchar*i,inta){strcpy(name,n);strcpy(id,i);age=a;}voidshow(){cout<<"name:"<<name<<endl;cout<<"id:"<<id<<endl;cout<<"age:"<<age<<endl;}};intmain(void){StudentTom;Tom.registerStudent(“tom”,”123456”,20);Tom.show();return0;}11.3.2類設(shè)計(jì)實(shí)例(1)關(guān)鍵字class表明一個(gè)類的聲明由此開(kāi)始,Student是一個(gè)類名,它應(yīng)該是一個(gè)有效的標(biāo)識(shí)符;幾點(diǎn)說(shuō)明(2)name、id、age是數(shù)據(jù)成員,又叫成員變量。registerStudent()、show()是成員函數(shù)。(3)關(guān)鍵字private和public是訪問(wèn)權(quán)限說(shuō)明符,用來(lái)定義成員的訪問(wèn)權(quán)限。關(guān)鍵字private之后的成員是類的私有成員
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO 21120:2025 EN Machinery for forestry - Forestry mulching equipment - Terms,definitions and commercial specifications
- 2024年版房屋買賣合同:購(gòu)房者與開(kāi)發(fā)商之間的購(gòu)房權(quán)益、交付時(shí)間等詳細(xì)約定
- 2024年標(biāo)準(zhǔn)油漆施工合作合同版B版
- 2024年科研成果保密合同
- 正裝復(fù)合模裝課程設(shè)計(jì)
- 2024年漳州衛(wèi)生職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)帶答案
- 完善財(cái)務(wù)報(bào)告的透明度要求計(jì)劃
- 商城服務(wù)員工作總結(jié)
- 安防行業(yè)顧問(wèn)工作總結(jié)
- 分析倉(cāng)庫(kù)工作中的服務(wù)意識(shí)計(jì)劃
- 2024-2025學(xué)年深圳市初三適應(yīng)性考試模擬試卷歷史試卷
- 廣東省深圳市2023-2024學(xué)年高一上學(xué)期期末考試物理試題(含答案)3
- 16J914-1 公用建筑衛(wèi)生間
- 粉末涂料使用說(shuō)明
- 玻璃瓶罐的缺陷產(chǎn)生原因及解決方法63699
- 贊比亞礦產(chǎn)資源及礦業(yè)開(kāi)發(fā)前景分析
- 高層住宅(23-33層)造價(jià)估算指標(biāo)
- 大型儲(chǔ)罐吊裝方案
- “千師訪萬(wàn)家”家訪記錄表(共2頁(yè))
- 海拔高度與氣壓、空氣密度、重力加速度對(duì)照表
- 《青田石雕》教學(xué)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論