理學(xué)類和對(duì)象的概念_第1頁(yè)
理學(xué)類和對(duì)象的概念_第2頁(yè)
理學(xué)類和對(duì)象的概念_第3頁(yè)
理學(xué)類和對(duì)象的概念_第4頁(yè)
理學(xué)類和對(duì)象的概念_第5頁(yè)
已閱讀5頁(yè),還剩36頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

編碼求解下列問(wèn)題編寫一個(gè)程序,計(jì)算任給一個(gè)幾何形體的面積和周長(zhǎng)。幾何形體可以是矩形、三角型、圓形、扇型、梯形。要求:由用戶通過(guò)鍵盤輸入要處理的幾何形體,每次輸入一個(gè)幾何形體。輸入規(guī)則是:程序輸出提示信息,請(qǐng)用戶選擇要處理的幾何形體的類型。如果輸入字母“E”,表示要退出程序的運(yùn)行根據(jù)用戶選擇的幾何形體類型,輸出提示信息,請(qǐng)用戶輸入幾何形體的描述數(shù)據(jù)。例如圓形的中心點(diǎn)坐標(biāo)和半徑。要求在提示信息中說(shuō)明輸入數(shù)據(jù)的格式。在用戶輸入一個(gè)幾何形體后,程序輸出該幾何形體的面積和周長(zhǎng),要求在輸出中注明哪個(gè)數(shù)據(jù)是面積、哪個(gè)數(shù)據(jù)是周長(zhǎng)。然后回到上一步,繼續(xù)處理新的幾何形體,直到用戶選擇退出程序運(yùn)行為止。分析:如何解決這個(gè)問(wèn)題?要定義5類數(shù)據(jù)結(jié)構(gòu),分別記錄不同形狀的基本數(shù)據(jù):矩形(左上角頂點(diǎn)/長(zhǎng)/寬)、三角型(三個(gè)頂點(diǎn))、圓形(圓心/半徑)、扇型(圓心/半徑/其始邊的水平角度/弧度)、梯形(四個(gè)頂點(diǎn))申明5個(gè)存儲(chǔ)空間變量每個(gè)數(shù)據(jù)類型描述一個(gè)存儲(chǔ)空間變量的布局每個(gè)變量用來(lái)記錄一種形狀的基本數(shù)據(jù)編寫一個(gè)main函數(shù),外加15個(gè)普通函數(shù).5個(gè)基本數(shù)據(jù)輸入函數(shù),分別輸入一種形狀的基本數(shù)據(jù)5個(gè)面積計(jì)算函數(shù),分別計(jì)算一種形狀的面積5個(gè)周長(zhǎng)計(jì)算函數(shù),分別計(jì)算一種形狀的周長(zhǎng)如何規(guī)劃程序的結(jié)構(gòu)?程序的構(gòu)成要件:5個(gè)數(shù)據(jù)結(jié)構(gòu)/5個(gè)變量/15個(gè)普通函數(shù)/main函數(shù)除main函數(shù)外,其他25個(gè)構(gòu)成要件可以分成5組,每組對(duì)應(yīng)一種形狀(問(wèn)題中的一個(gè)概念),包括一個(gè)數(shù)據(jù)結(jié)構(gòu)(這個(gè)概念所對(duì)應(yīng)實(shí)例的數(shù)據(jù)表達(dá))一個(gè)變量(這個(gè)概念的一個(gè)實(shí)例)3個(gè)函數(shù)(問(wèn)題中與這個(gè)概念相關(guān)的算法流程要求)顯然,不同組之間沒(méi)有任何關(guān)聯(lián)良好的設(shè)計(jì)和編碼應(yīng)該體現(xiàn)分組特征組之間的無(wú)耦合特征以矩形對(duì)應(yīng)的一組程序構(gòu)成要件為例編碼示例1:structSRectangle{ intx,y; intw,h;};SRectanglerectangle;voidrectangleInit(){ ……}intrectangleArea(){ ……}intrectanglePerimeter(){ ……}編碼示例2:structSType1{ intx,y; intw,h;};……SType1variable5;……voidfun2(){ ……}……intfun8(){ ……}……intfun13(){ ……}給上面的每組程序構(gòu)成要件一個(gè)名稱:類及對(duì)象類:被求解問(wèn)題中的一個(gè)概念的具體表達(dá)(即文字符號(hào)的描述),包括兩部分成員屬性:這個(gè)概念所對(duì)應(yīng)實(shí)例的數(shù)據(jù)表達(dá)成員函數(shù)/方法:問(wèn)題中僅與這個(gè)概念相關(guān)的那部分算法對(duì)象:某個(gè)概念在被求解問(wèn)題中的一個(gè)實(shí)例,基于對(duì)應(yīng)的類對(duì)這個(gè)實(shí)例的具體表達(dá)例如需要求解其面積的一個(gè)長(zhǎng)方形類及對(duì)象:具體表達(dá)被求解問(wèn)題中的某個(gè)概念,以及這個(gè)概念在被求解問(wèn)題中的全部實(shí)例編碼示例1明顯好于編碼示例2編碼示例1在程序結(jié)構(gòu)中的規(guī)劃中體現(xiàn)了類及對(duì)象,當(dāng)程序員考慮與矩形相關(guān)的事情時(shí),只要關(guān)注這一個(gè)代碼塊一個(gè)子串rectangle,將所有只與矩形相關(guān)的程序構(gòu)成要件都聯(lián)系一起來(lái)了,一目了然遺憾的是,編程人員(特別是初學(xué)編程的人員)通常把注意力集中在問(wèn)題分析階段,對(duì)程序結(jié)構(gòu)的規(guī)劃不重視甚至完全忽視,經(jīng)常出現(xiàn)編碼示例2那樣的代碼用一個(gè)POINT結(jié)構(gòu)來(lái)代替矩形左上角的X和Y坐標(biāo)更直觀,而且其他形狀也面臨同樣的需要要發(fā)現(xiàn)這樣一個(gè)修改所影響的函數(shù),程序要要么記憶很好,要么只好把所有的15個(gè)函數(shù)都讀一遍面向?qū)ο蟮木幊陶Z(yǔ)言C++程序的構(gòu)成要件:類/類的對(duì)象/main函數(shù)類:一個(gè)數(shù)據(jù)結(jié)構(gòu),以及依賴該數(shù)據(jù)結(jié)構(gòu)的一組函數(shù)屬性:數(shù)據(jù)結(jié)構(gòu)中的一個(gè)分量函數(shù):在該數(shù)據(jù)結(jié)構(gòu)上執(zhí)行算法運(yùn)算,讀/寫數(shù)據(jù)結(jié)構(gòu)中的某個(gè)分量類的對(duì)象:用類聲明的變量類中的數(shù)據(jù)結(jié)構(gòu)用來(lái)說(shuō)明進(jìn)行內(nèi)存分配類的函數(shù)規(guī)定了哪些函數(shù)可直接訪問(wèn)所分配的內(nèi)存C++對(duì)程序構(gòu)成要件的這種約束指導(dǎo)編程人員在分析階段自覺(jué)揭示程序構(gòu)成要件之間的關(guān)系強(qiáng)制編程人員在編碼階段采用類似編碼示例1的方式安排程序結(jié)構(gòu)(通過(guò)類的構(gòu)造函數(shù)和析構(gòu)函數(shù))提示編程人員要對(duì)所分配的內(nèi)存空間進(jìn)行初始化,在不在需要某個(gè)存儲(chǔ)空間時(shí)要釋放僅在該空間才記錄其訪問(wèn)信息的那些資源.比如動(dòng)態(tài)分配內(nèi)存空間的地址指針以矩形對(duì)應(yīng)的一組程序構(gòu)成要件為例編碼示例3:classCRectangle{public: intx,y; intw,h; voidInit(); intArea(); intPerimeter();};CRectanglerectangle;voidCRectangle::rectangleInit(){ ……}intCRectangle::Area(){ ……}intCRectangle::Perimeter(){ ……}編碼示例4:classCType1{public: intx,y; intw,h; voidfun1(); intfun2(); intfunc3();};CType1var1;voidCType1::fun1(){ ……}intCType1::fun2(){ ……}intCType1::fun3(){ ……}抽象和封裝抽象:通過(guò)類,表達(dá)事物中與當(dāng)前問(wèn)題相關(guān)的那些內(nèi)容,而且將所涉及的數(shù)據(jù)(類的成員屬性)和算法流程(類的成員函數(shù))顯式的聯(lián)系在一起封裝:通過(guò)類和對(duì)象,將事物的相關(guān)數(shù)據(jù)的存儲(chǔ)實(shí)現(xiàn)細(xì)節(jié)和算法流程的實(shí)現(xiàn)細(xì)節(jié)隱藏起來(lái),對(duì)外只展示其他程序模塊所關(guān)心的結(jié)果例如矩形左上角頂點(diǎn)的存儲(chǔ)可以直接用X和Y坐標(biāo),也可以用一個(gè)POINT結(jié)構(gòu).具體的實(shí)現(xiàn)方式只影響在該類3個(gè)相關(guān)函數(shù)的編碼實(shí)現(xiàn),與這三個(gè)成員函數(shù)的接口都沒(méi)有關(guān)系.計(jì)算三角行的面積,可以用底邊和高算,也可以用兩條邊及其夾角算.計(jì)算方法的選擇只關(guān)系到面積計(jì)算函數(shù)的編碼實(shí)現(xiàn),與該函數(shù)的接口無(wú)關(guān)C語(yǔ)言使用結(jié)構(gòu)化程序設(shè)計(jì):

程序=數(shù)據(jù)結(jié)構(gòu)+算法程序由全局變量以及眾多相互調(diào)用的函數(shù)組成。算法以函數(shù)的形式實(shí)現(xiàn),用于對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作。結(jié)構(gòu)化程序設(shè)計(jì)main()Sub1()Sub2()Sub3()Sub1_1()Sub3_1()Sub3_2()…var1var2var3…變量:結(jié)構(gòu)化程序設(shè)計(jì)的程序模式:從編程語(yǔ)言方面,不提供對(duì)程序結(jié)構(gòu)規(guī)劃的指導(dǎo)和提示信息對(duì)于經(jīng)驗(yàn)豐富的高級(jí)程序員,會(huì)精心規(guī)劃程序的結(jié)構(gòu),在程序中會(huì)采用類似編碼示例1這樣的模塊劃分對(duì)于普通編程人員,容易忽視對(duì)程序結(jié)構(gòu)的規(guī)劃.結(jié)構(gòu)化程序設(shè)計(jì)結(jié)構(gòu)化程序設(shè)計(jì)沒(méi)有“封裝”和“隱藏”的概念。要訪問(wèn)某個(gè)數(shù)據(jù)結(jié)構(gòu)中的某個(gè)變量,就可以直接訪問(wèn),那么當(dāng)該變量的定義有改動(dòng)的時(shí)候,就要把所有訪問(wèn)該變量的語(yǔ)句找出來(lái)修改,十分不利于程序的維護(hù)、擴(kuò)充。難以查錯(cuò),當(dāng)某個(gè)數(shù)據(jù)結(jié)構(gòu)的值不正確時(shí),難以找出到底是那個(gè)函數(shù)導(dǎo)致的。結(jié)構(gòu)化程序設(shè)計(jì)面向?qū)ο蟮某绦蛟O(shè)計(jì)方法:將某類客觀事物共同特點(diǎn)(屬性)歸納出來(lái),形成一個(gè)數(shù)據(jù)結(jié)構(gòu)(可以用多個(gè)變量描述事物的屬性);將這類事物所能進(jìn)行的行為也歸納出來(lái),形成一個(gè)個(gè)函數(shù),這些函數(shù)可以用來(lái)操作數(shù)據(jù)結(jié)構(gòu)(這一步叫“抽象”)。然后,通過(guò)某種語(yǔ)法形式,將數(shù)據(jù)結(jié)構(gòu)和操作該數(shù)據(jù)結(jié)構(gòu)的函數(shù)“捆綁”在一起,形成一個(gè)“類”,從而使得數(shù)據(jù)結(jié)構(gòu)和操作該數(shù)據(jù)結(jié)構(gòu)的算法呈現(xiàn)出顯而易見(jiàn)的緊密關(guān)系,這就是“封裝”。面向?qū)ο蟮某绦蛟O(shè)計(jì)main()面向?qū)ο蟮某绦蚰J剑篶lass1var1Sub1()Sub1_1()class2var2Sub2()class3var3Sub3()Sub3_1()Sub3_2()從編程語(yǔ)言的語(yǔ)法結(jié)構(gòu)層面,要求對(duì)程序的結(jié)構(gòu)進(jìn)行規(guī)劃當(dāng)對(duì)問(wèn)題分析后,同一分析結(jié)果,不同程序員的編碼差距要小很多,類似編碼示例3與編碼示例4的差別

采用面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言寫一個(gè)程序,輸入矩形的長(zhǎng)和寬,輸出面積和周長(zhǎng)。比如對(duì)于“矩形”這種東西,要用一個(gè)類來(lái)表示,該如何做“抽象”呢?矩形的屬性就是長(zhǎng)和寬。因此需要兩個(gè)變量,分別代表長(zhǎng)和寬。一個(gè)矩形,可以有哪些行為呢(或可以對(duì)矩形進(jìn)行哪些操作)?矩形可以有設(shè)置長(zhǎng)和寬,算面積,和算周長(zhǎng)這三種行為(當(dāng)然也可以有其他行為)。這三種行為,可以各用一個(gè)函數(shù)來(lái)實(shí)現(xiàn),他們都需要用到長(zhǎng)和寬這兩個(gè)變量。從客觀事物抽象出類的例子將長(zhǎng)、寬變量和設(shè)置長(zhǎng),寬,求面積,以及求周長(zhǎng)的三個(gè)函數(shù)“封裝”在一起,就能形成一個(gè)“矩形類”。長(zhǎng)、寬變量成為該“矩形類”的“成員變量”,三個(gè)函數(shù)成為該類的“成員函數(shù)”。

成員變量和成員函數(shù)統(tǒng)稱為類的成員。實(shí)際上,“類”看上去就像“帶函數(shù)的結(jié)構(gòu)”。從客觀事物抽象出類的例子從客觀事物抽象出類的例子classCRectangle{

public: intw,h; intArea(){ returnw*h; } intPerimeter(){ return2*(w+h); } voidInit(intw_,inth_){ w=w_;h=h_; }};//必須有分號(hào)注:此處將類成員函數(shù)的實(shí)現(xiàn)直接寫在類的定義中,在語(yǔ)法上是允許的.但建議大家養(yǎng)成在類定義外實(shí)現(xiàn)其成員函數(shù)的習(xí)慣.避免在考察類的成員時(shí),被成員函數(shù)的實(shí)現(xiàn)代碼干擾注意力從客觀事物抽象出類的例子intmain(){ intw,h; CRectangler;//r是一個(gè)對(duì)象

cin>>w>>h; r.Init(w,h); cout<<r.Area()<<endl<<r.Perimeter(); return0;}通過(guò)類,可以定義變量。類定義出來(lái)的變量,也稱為類的實(shí)例,就是我們所說(shuō)的“對(duì)象”。C++中,類的名字就是用戶自定義的類型的名字??梢韵笫褂没绢愋湍菢觼?lái)使用它。CRectangle就是一種用戶自定義的類型。對(duì)象的內(nèi)存分配和結(jié)構(gòu)變量一樣,對(duì)象所占用的內(nèi)存空間的大小,等于所有成員變量的大小之和。每個(gè)對(duì)象各有自己的存儲(chǔ)空間。一個(gè)對(duì)象的某個(gè)成員變量被改變了,不會(huì)影響到另一個(gè)對(duì)象。

如何使用類的成員變量和成員函數(shù)用法1:對(duì)象名.成員名

CRectangler1,r2; r1.w=5; r2.Init(5,4);Init函數(shù)作用在r2上,即Init函數(shù)執(zhí)行期間訪問(wèn)的w和h是屬于r2這個(gè)對(duì)象的,執(zhí)行r2.Init不會(huì)影響到r1。用法2.指針->成員名

CRectangler1,r2; CRectangle*p1=&r1; CRectangle*p2=&r2; p1->w=5; p2->Init(5,4);//Init作用在p2指向的對(duì)象上

如何使用類的成員變量和成員函數(shù)用法3:引用名.成員名

CRectangler2;CRectangle&rr=r2; rr.w=5; rr.Init(5,4);//rr的值變了,r2的值也變voidPrintRectangle(CRectangle&r){ cout<<r.Area()<<","<<r.Perimeter();}CRectangler3;r3.Init(5,4);PrintRectangle(r3);引用的概念類型名&引用名=某變量名;此種寫法就定義了一個(gè)引用,并將其初始化為引用某個(gè)變量。某個(gè)變量的引用,和這個(gè)變量是一回事,相當(dāng)于該變量的一個(gè)別名。intn=4;int&r=n;r=4;cout<<r;//輸出4cout<<n;//輸出4n=5;cout<<r;//輸出5

定義引用時(shí)一定要將其初始化成引用某個(gè)變量,不初始化編譯不過(guò)。引用只能引用變量,不能引用常量和表達(dá)式。C語(yǔ)言中,要寫交換兩個(gè)整型變量值的函數(shù),只能通過(guò)指針。voidswap(int*a,int*b){ inttmp; tmp=*a;*a=*b;*b=tmp;}intn1,n2;swap(&n1,&n2);//n1,n2的值被交換引用的作用有了引用后:voidswap(int&a,int&b){ inttmp; tmp=a;a=b;b=tmp;}intn1,n2;swap(n1,n2);//n1,n2的值被交換引用的作用函數(shù)的返回值可以是引用,如:#include<iostream>usingnamespacestd;intn=4;int&SetValue(){ returnn;}intmain(){ SetValue()=40; cout<<n; return0;}該程序輸出結(jié)果是40引用作為函數(shù)的返回值類的成員函數(shù)的另一種寫法成員函數(shù)體和類的定義分開(kāi)寫。classCRectangle{ public: intw,h; intArea();//成員函數(shù)僅在此處聲明

intPerimeter(); voidInit(intw_,inth_);}; intCRectangle::Area(){ returnw*h; } intCRectangle::Perimeter() { return2*(w+h); } voidCRectangle::Init(intw_,inth_){ w=w_;h=h_; }CRectangle::說(shuō)明后面的函數(shù)是CRectangle類的成員函數(shù),而非普通函數(shù)。那么,一定要通過(guò)對(duì)象或?qū)ο蟮闹羔樆驅(qū)ο蟮囊貌拍苷{(diào)用。類的成員函數(shù)的另一種寫法對(duì)象成員的訪問(wèn)權(quán)限在類的定義中,用下列權(quán)限關(guān)鍵字來(lái)說(shuō)明對(duì)象成員的訪問(wèn)權(quán)限:private:

私有成員,只能在成員函數(shù)內(nèi)訪問(wèn)public:

公有成員,可以在任何地方訪問(wèn)protected:

保護(hù)成員,以后再說(shuō)以上三種關(guān)鍵字出現(xiàn)的次數(shù)和先后次序都沒(méi)有限制。定義一個(gè)類classclassName{

private:

私有屬性和函數(shù)

public:

公有屬性和函數(shù)

protected:

保護(hù)屬性和函數(shù)};說(shuō)明類成員的可見(jiàn)性如過(guò)某個(gè)成員前面沒(méi)有上述關(guān)鍵字,則缺省地被認(rèn)為是私有成員。classMan{ intnAge;//私有成員

charszName[20];//私有成員public: voidSetName(char*szName){ strcpy(Man::szName,szName); }};對(duì)象成員的訪問(wèn)權(quán)限在類的成員函數(shù)內(nèi)部,能夠訪問(wèn):當(dāng)前對(duì)象的全部屬性、函數(shù);同類其它對(duì)象的全部屬性、函數(shù)。在類的成員函數(shù)以外的地方,只能夠訪問(wèn)該類對(duì)象的公有成員。對(duì)象成員的訪問(wèn)權(quán)限classCMan{private: charszName[30];//名字public: floatheight,weight;//保存一個(gè)人的身高和體重信息

voidsetName(char*name); voidFunc1(CManman); ~CMan();//析構(gòu)函數(shù)};voidCMan::setName(char*name){ CManman; strcpy(man.szName,"Lily");//ok,此種訪問(wèn)方式可行

strcpy(szName,name);//ok}voidCMan::Func1(CManman){ cout<<man.szName;//ok}CMan::~CMan(){}intmain(){ CManman1,man2;

strcpy(man1.szName,“Tom1234567889”);//錯(cuò),不能訪 //問(wèn)私有成員

man1.setName("Tom12345678909887");//ok man1.height=5;//ok return0; }設(shè)置私有成員的目的是強(qiáng)制對(duì)成員變量的訪問(wèn)一定要通過(guò)成員函數(shù)進(jìn)行,那么以后成員變量的類型等屬性修改后,只需要更改成員函數(shù)即可。否則,所有直接訪問(wèn)成員變量的語(yǔ)句都需要修改。設(shè)置私有成員的機(jī)制,叫“隱藏”如果將上面的程序移植到內(nèi)存空間緊張的手持設(shè)備上,希望將szName改為charszName[5],若szName不是私有,那么就要找出所有類似 strcpy(man1.szName,”Tom1234567889”);這樣的語(yǔ)句進(jìn)行修改,以防止數(shù)組越界。這樣做很麻煩。如果將szName變?yōu)樗接?,那么程序中就不可能出現(xiàn)(除非在類的內(nèi)部) strcpy(man1.szName,”Tom1234567889”);這樣的語(yǔ)句,所有對(duì)szName的訪問(wèn)都是通過(guò)成員函數(shù)來(lái)進(jìn)行,比如:

man1.setName(“Tom12345678909887”);那么,就算szName改短了,上面的語(yǔ)句也不需要找出來(lái)修改,只要改setName成員函數(shù),在里面確保不越界就可以了。函數(shù)重載一個(gè)或多個(gè)函數(shù),名字相同,然而參數(shù)個(gè)數(shù)或參數(shù)類型互不相同,這叫做函數(shù)的重載。如: intMax(doublef1,doublef2){} intMax(intn1,intn2){} intMax(intn1,intn2,intn3){}函數(shù)重載使得函數(shù)命名變得簡(jiǎn)單。函數(shù)的缺省參數(shù):C++中,寫函數(shù)的時(shí)候可以讓參數(shù)有缺省值,那么調(diào)用函數(shù)的時(shí)候,若不寫參數(shù),參數(shù)就是缺省值。voidfunc(intx1=2,intx2=3){}func();//等效于func(2,3)func(8);//等效于func(8,3)func(,8);//不行函數(shù)參數(shù)可缺省的目的在于提高程序的可擴(kuò)充性。即如果某個(gè)寫好的

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論