版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
共102頁第1頁面向?qū)ο蠓椒ㄅc技術(shù)共102頁第2頁第五部分面向?qū)ο蟮某绦蛟O(shè)計5.1面向?qū)ο蟪绦蛟O(shè)計原則5.2面向?qū)ο蟪绦蛟O(shè)計語言5.3面向?qū)ο蟪绦蛟O(shè)計實例5.4面向?qū)ο蟪绦蛟O(shè)計中的高級技術(shù)面向?qū)ο蟮某绦蛟O(shè)計思想出現(xiàn)于60年代末期,以Simula語言為標(biāo)志。發(fā)展到80年代出現(xiàn)了Smalltalk等,直至出現(xiàn)C++、Java等,面向?qū)ο蟪绦蛟O(shè)計的思想逐漸被人們所廣泛接受,目前已經(jīng)成為程序設(shè)計領(lǐng)域的主流。共102頁第3頁5.1面向?qū)ο蟪绦蛟O(shè)計的原則5.1.1復(fù)用性5.1.2可擴充性5.1.3健壯性5.1.4協(xié)作性面向?qū)ο蟪绦蛟O(shè)計:使用程序設(shè)計語言將設(shè)計方案加以表達類定義靜態(tài)模型動態(tài)模型類的實現(xiàn)約束實現(xiàn)于代碼中增強系統(tǒng)健壯性共102頁第4頁5.1.1復(fù)用性加強軟件可復(fù)用性的原則:保證操作的內(nèi)聚性
功能相對單一減少單一功能模塊代碼規(guī)模
函數(shù)代碼的適當(dāng)規(guī)模保證操作對外接口的一致性
相似操作具有一致性接口分離設(shè)計中的操作與實現(xiàn)中的操作
以相對單一和基本的操作聯(lián)合實現(xiàn)設(shè)計中的操作操作均勻覆蓋數(shù)據(jù)
考慮操作的普適性加強封裝
操作只針對內(nèi)部數(shù)據(jù),實現(xiàn)與接口分離減少操作耦合
減少操作之間的相關(guān),盡量上下文無關(guān)共102頁第5頁在校人員類姓名年齡系別教師類工資學(xué)生類班主任姓名年齡系別工資班主任在校人員類5.1.1復(fù)用性復(fù)用方式:繼承聚集電視類家電類型號外觀顏色生產(chǎn)廠家顯像管型號冰箱類壓縮機型號冰箱類型號外觀顏色生產(chǎn)廠家顯像管型號電視類型號外觀顏色生產(chǎn)廠家顯像管型號提取公共代碼分離部分成員區(qū)分子類與繼承封裝外部代碼CPointxyCRectanglexyrCPointxyCRectangler共102頁第6頁5.1.2可擴充性繼承和多態(tài)機制支持程序具有很強的可擴充性。增強可擴充性的原則:封裝數(shù)據(jù)封裝操作內(nèi)的數(shù)據(jù)結(jié)構(gòu)減少耦合性避免情況選擇語句區(qū)分公有操作和私有操作共102頁第7頁5.1.3健壯性誤操作及錯誤輸入數(shù)據(jù)情況下對象保持狀態(tài)行為正確的能力。程序設(shè)計中考慮健壯性的原則:防止輸入錯誤把握優(yōu)化代碼的時機選擇恰當(dāng)?shù)膶崿F(xiàn)方法檢測參數(shù)的合法性推遲對內(nèi)存分配的限制定義一個類(包括年、月、日)。計算該日是本年中第幾天?(注意閏年問題,)。運行結(jié)果示例:請輸入日期(年,月,日):1990,9,209月20日是1990年的第263天。共102頁第8頁5.1.4協(xié)作性intMyFunction(char*pName,intMark){//Function :Demonstratehowtowritecomment//Parameter :pName,thenameofastudent// Mark,thescoreofstudentpName//Global : xxxx//Algorithm : yyyyyyy//Writer : Wangming//Date : 2002-8-9//note :xxxx……}共102頁第9頁5.2面向?qū)ο蟪绦蛟O(shè)計語言5.2.1Smalltalk語言5.2.2Eiffel語言5.2.3C++語言5.2.4Java語言共102頁第10頁5.3面向?qū)ο蟪绦蛟O(shè)計實例5.3.0C++基本語法5.3.1類的定義5.3.2對象的創(chuàng)建及初始化5.3.3消息傳遞與操作調(diào)用5.3.4繼承5.3.5關(guān)聯(lián)的實現(xiàn)5.3.6聚集關(guān)系的實現(xiàn)5.3.7多態(tài)性5.3.8運算符重載5.3.9靜態(tài)成員本節(jié)以C++語言為例展示如何將OOA和OOD中的類、對象、類間三種關(guān)系以具體語言方式加以實現(xiàn)。共102頁第11頁5.3.0C++基本語法1VisualC++環(huán)境環(huán)境定制:項目創(chuàng)建:程序編輯:編譯與調(diào)試共102頁第12頁1VisualC++環(huán)境創(chuàng)建項目項目(Project,亦稱工程)的創(chuàng)建是使用集成開發(fā)環(huán)境編寫程序的第一步,一個項目由一組相關(guān)聯(lián)的文件組成,包括用戶將來自己編寫的源程序文件和系統(tǒng)自動創(chuàng)建的一系列文件(用于調(diào)試程序、瀏覽程序中各種信息、目標(biāo)文件等),它們被放置在某個目錄下,由開發(fā)環(huán)境進行管理。如果項目已經(jīng)存在,可以通過開發(fā)環(huán)境中File菜單下的菜單項OpenWorkspace打開,否則必須新創(chuàng)建,具體創(chuàng)建步驟如下:單擊File
→單擊New
→圖5.3.a在Projectname編輯框中鍵入所要編寫的項目名(將來生成可執(zhí)行文件的主文件名與此相同)。選擇該工程所在位置。在Location編輯框中鍵入放置該項目的磁盤目錄,應(yīng)該鍵入全路徑名。選擇項目的類型。選擇Win32ConsoleApplication則創(chuàng)建控制臺應(yīng)用程序,相當(dāng)于創(chuàng)建dos應(yīng)用程序,只不過所創(chuàng)建程序的輸入輸出限制在一個控制臺窗口(類似Windows下的命令提示符窗口)中,而不是整個屏幕。單擊OK按鈕后,屏幕上將彈出對話框,如圖5.3.b最方便的選擇是創(chuàng)建一個“Asimpleapplication”。當(dāng)選擇最后一個選項時,在所創(chuàng)建的程序中將可以使用MFC類庫中定義的一些數(shù)據(jù)結(jié)構(gòu),如動態(tài)字符串CString和哈希表等,這將給編程帶來方便。共102頁第13頁圖5.3.a圖5.3.b1VisualC++環(huán)境共102頁第14頁程序編輯:鍵入、剪切、拷貝、粘貼、查找、全程查找、書簽的使用創(chuàng)建一個項目后該項目被打開,這個項目中可能是空的,一個文件都沒有,用戶需要在項目中添加自己的文件,方法如下:選擇開發(fā)環(huán)境中Project菜單下的菜單項AddToProject后,會出現(xiàn)一個popup菜單,如果所要添加的是一個尚未編輯的新文件則選擇菜單項New,否則選擇Files。在所彈出的對話框中選擇將要添加的文件的類型為C/C++HeaderFile或C++SourceFile,然后鍵入文件名,確認(rèn)后相應(yīng)文件的編輯窗口被打開,編程者就可以在其中編輯程序,編輯操作如同在使用MicrosoftWord或Wordpad等一樣方便。1VisualC++環(huán)境共102頁第15頁編譯與調(diào)試:編譯、運行,斷點、單步、觀察變量值程序全部或部分編寫完成后需進行編譯后才能運行。編譯后程序一般都會出現(xiàn)多個語法錯誤,需要根據(jù)Output窗口中的提示信息對程序進行重新修改,直到編譯后不再出現(xiàn)錯誤為止。程序的編譯可以選擇開發(fā)環(huán)境的Build菜單下的Compile...菜單項或Build...菜單項,兩者的區(qū)別在于Compile只編譯當(dāng)前獲得焦點的文件,而Build則編譯所有受到當(dāng)前激活文件內(nèi)容改動影響的文件,而且一旦編譯通過,將所調(diào)用的系統(tǒng)函數(shù)與程序的目標(biāo)代碼進行聯(lián)接,最終形成可執(zhí)行的exe文件。#include<iostream.h>voidPrintString(char*szStr){cout<<"Hellow,"<<szStr<<"!"<<endl;}voidmain(){charpName[80];//User'snamecout<<"Enteryournameplease:";cin>>pName;PrintString(pName);}1VisualC++環(huán)境共102頁第16頁5.3.0C++基本語法2C++程序基本結(jié)構(gòu)#include<iostream.h>voidPrintString(char*szStr){cout<<"Hellow,"<<szStr<<"!"<<endl;}voidmain(){charpName[80];//User'snamecout<<"Enteryournameplease:";cin>>pName;PrintString(pName);}文件包含預(yù)處理、函數(shù)、主函數(shù)、語句、標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出共102頁第17頁5.3.0C++基本語法3C++的基本數(shù)據(jù)類型intfloatdoublecharTYPE*TYPE&intn=9542; 4Bytesintm(120;) 4Bytescharc=97; 1BytesboolmBool(true); 1Bytes變量:變量是程序運行過程中可以改變其值的數(shù)據(jù)對象,變量在程序中作為數(shù)據(jù)信息載體,可以用來保存非持久數(shù)據(jù)、存儲運算結(jié)果、也可以為程序塊之間傳遞數(shù)據(jù)信息。一個變量具有名字、類型和值三要素
變量數(shù)據(jù) 常量變量的值可在程序運行過程中通過賦值語句加以改變
n=n+1234; m=ox_2345 c=‘a(chǎn)’; mBoo=false;共102頁第18頁5.3.0C++基本語法3C++的基本數(shù)據(jù)類型是程序執(zhí)行過程中其值不能被改變的數(shù)據(jù)對象常量字面意義就是它所代表的常量值字面量符號常量用一個標(biāo)識符代表某個具體常量,出現(xiàn)在程序中的將是這個標(biāo)識符,而不是與這個標(biāo)識符相聯(lián)系的常量
231、0x3A 、07351.23、3.141e-8’a’、’\n’、’065’、’0xFA’"MynameisJohn"
constintnTopIndex=10;constcharcVisible='y';constchar*MyName="Frank";intnA;intnB;intnC;cout<<“inputA:“;cin>>nA;cout<<“inputB”;cin>>nB;nC=nA+nB;輸入兩個整數(shù),求它們的和共102頁第19頁5.3.0C++基本語法4C++的基本操作+-*/&&||!&|~%賦值語句簡單賦值語句:n=8;x=3*6+4/a;復(fù)合賦值語句:n+=2;共102頁第20頁5.3.0C++基本語法5C++語句間順序控制if(a==0)x=1;elsex=2條件語句if(a==8)b=9;else{if(a==9)b=20;else{if(a==10)b=21;elseb=30;}}b=20b=9b=30b=21a==8a==9a==10falsefalsefalsetruetruetrueif語句()布爾表達式if語句語句else共102頁第21頁switch(x){case1:a==0;break;case2:x=2break;}5.3.0C++基本語法5C++語句間順序控制開關(guān)語句}<語句>:defaultswitch語句()switch<整型表達式>{<整型常量表達式><語句>case:共102頁第22頁for(inti=n;i>0;i--)n*=i;5.3.0C++基本語法5C++語句間順序控制inti(n);do{n*=i;i--;}while(i>0)inti(n);while(i>0){n*=i;i--;}循環(huán)語句for語句(for<表達式1>;<表達式2>;<表達式3>)<語句>while句(while<表達式>)語句do語句(while<表達式>)<語句>do求一個不很大的自然數(shù)n的階乘(調(diào)試)共102頁第23頁5.3.0C++基本語法6數(shù)據(jù)控制函數(shù)參數(shù)表類型參數(shù)名空格,()函數(shù)頭返回值類型函數(shù)名參數(shù)表函數(shù)函數(shù)頭函數(shù)體函數(shù)體{}語句doubleGetProduct(doublex,doubley){doubletemp=x*y;returntemp;}voidmain(){inta=1.2,b(2.1);cout<<GetProduct(a,b)<<endl;}共102頁第24頁5.3.0C++基本語法6C++中的數(shù)據(jù)控制傳值調(diào)用#include"iostream.h"voidSwap(intp,intq){inttemp=p;p=q;q=temp;cout<<"p="<<p<<",q="<<q<<endl;}voidmain(){intx=2,y=3;Swap(x,y);cout<<"x="<<x<<",y="<<y<<endl;}#include"iostream.h"voidSwap(int*p,int*q){inttemp=*p;*p=*q;*q=temp;cout<<"*p="<<*p<<",*q="<<*q<<endl;}voidmain(){intx=2,y=3;Swap(&x,&y);cout<<"x="<<x<<",y="<<y<<endl;}對于傳值調(diào)用,在函數(shù)調(diào)用進行形實結(jié)合時,形式參數(shù)被賦予實在參數(shù)的(右)值,而在函數(shù)體中形式參數(shù)等價于函數(shù)內(nèi)定義的變量。由于形參僅被賦予了實參的右值,因此形參的任何變化不會引起實參的改變共102頁第25頁5.3.0C++基本語法6C++中的數(shù)據(jù)控制引用調(diào)用 傳址調(diào)用#include"iostream.h"voidSwap(int&p,int&q){inttemp=p;p=q;q=temp;cout<<"p="<<p<<",q="<<q<<endl;}voidmain(){intx=2,y=3;Swap(x,y);cout<<"x="<<x<<",y="<<y<<endl;}#include"iostream.h"intfunc(inta[]){a[2]=8;return0;}voidmain(intargc,char*argv[]){intb[]={1,2,3,4,5};func(b);cout<<b[2]<<endl;}形式參數(shù)和實在參數(shù)代表內(nèi)存中同一個數(shù)據(jù)對象,因此在函數(shù)調(diào)用進行形實結(jié)合時,形式參數(shù)被賦予實在參數(shù)的(左)值,因此形式參數(shù)的任何變化都會引起實在參數(shù)的改變引用調(diào)用方式將作為實參的表達式的左值傳遞給被調(diào)函數(shù),在實現(xiàn)時相當(dāng)于以實在參初始化相應(yīng)的引用類型參數(shù),為實在參數(shù)建立一個別名,使形式參數(shù)和實在參數(shù)代表內(nèi)存中的同一個數(shù)據(jù)對象
共102頁第26頁7內(nèi)聯(lián)函數(shù)引例:編寫一個函數(shù)比較兩數(shù)大小intmin(intv1,intv2){ return(v1<v2?v1:v2);}5.3.0C++基本語法共102頁第27頁為什么要定義一個min()函數(shù)?易于理解改變一個局部化的實現(xiàn)比更改一個應(yīng)用中的300個出現(xiàn)要容易得多語義統(tǒng)一,可被重用。問題:函數(shù)的調(diào)用需要開銷。7內(nèi)聯(lián)函數(shù)5.3.0C++基本語法共102頁第28頁用內(nèi)聯(lián)函數(shù)解決問題若一個函數(shù)被指定為內(nèi)聯(lián)函數(shù),則它將在程序中每個調(diào)用點上被“展開”
intval=min(i,j);
被展開為:
intval=i<j?i:j;7內(nèi)聯(lián)函數(shù)5.3.0C++基本語法共102頁第29頁內(nèi)聯(lián)函數(shù)的使用范圍被頻繁調(diào)用的功能函數(shù)體簡單需要高效率使用內(nèi)聯(lián)函數(shù)的缺點:可執(zhí)行程序文件尺寸增大7內(nèi)聯(lián)函數(shù)5.3.0C++基本語法共102頁第30頁8默認(rèn)形參值的函數(shù)函數(shù)參數(shù)可以指定默認(rèn)值,稱為默認(rèn)參數(shù)。floatArea(floatWidth,floatLength=12.0)其中,我們只用一個參數(shù)調(diào)用此函數(shù):
floata;a=Area(6.5);5.3.0C++基本語法共102頁第31頁C語言中,要用不同的函數(shù)名定義相同作用的不同類型函數(shù)intcube(intnumber){…}//求整數(shù)立方floatfcube(floatnumber)){…}//浮點數(shù)立方doubledcube(doublenumber){…}//求雙精度數(shù)立方調(diào)用立方計算函數(shù)需要分別不同的類型函數(shù).C++用相同的函數(shù)名定義不同類型的相同作用函數(shù)intcube(intnumber){…}floatcube(floatnumber){…}doublecube(doublenumber){…}調(diào)用立方計算函數(shù)用統(tǒng)一的函數(shù)名.9函數(shù)重載5.3.0C++基本語法共102頁第32頁代碼區(qū)(codearea)全局?jǐn)?shù)據(jù)區(qū)(dataarea)堆區(qū)(heaparea)棧區(qū)(stackarea)存放程序代碼存放程序的全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù)存放程序的動態(tài)數(shù)據(jù)存放程序的局部數(shù)據(jù)程序的內(nèi)存區(qū)域10動態(tài)存儲:new&delete5.3.0C++基本語法共102頁第33頁5.3.1類的定義1.類說明:class<ClassName>{private:
私有數(shù)據(jù)和函數(shù)
public:
公有數(shù)據(jù)和函數(shù)
protected:
受保護數(shù)據(jù)和函數(shù)};
CBookm_pczName:char*=“程序設(shè)計”nTotalPage:int=280nEdition:int=2char*GetBookName();intGetTotalPage();intGetEdition();classCBook{public:char*m_pczName;intnTotalPage;intnEdition;char*GetBookName();intGetTotalPage();intGetEdition();};私有成員只能被其自身成員所訪問公有成員可以被任何函數(shù)所引用保護成員只能在該類的派生類類體中使用共102頁第34頁5.3.1類的定義2.成員函數(shù)定義:char*CBook::GetBookName(char*pStr){strcpy(pStr,m_pczName);returnpStr;}classCBook{public:char*m_pczName;intnTotalPage;intnEdition;char*GetBookName();intGetTotalPage();intGetEdition();};成員函數(shù)的定義除必須指明函數(shù)所屬類外,與一般的函數(shù)定義類似:classCBook{public:char*m_pczName;intnTotalPage;intnEdition;char*GetBookName(){strcpy(pStr,m_pczName);returnpStr;}intGetTotalPage()intGetEdition();};內(nèi)聯(lián)函數(shù)共102頁第35頁5.3.2對象的創(chuàng)建及初始化1.由類創(chuàng)建對象實例classCPoint{private:intm_x;intm_y;public:void SetXY(intx,inty){m_x=x;m_y=y;}intGetX(){returnm_x;}intGetY(){returnm_y;}};從類產(chǎn)生解空間對象的過程是一個從一般到特殊的演繹過程,這個過程在C++中有相對應(yīng)的語法——對象定義。定義對象象定義一個普通變量一樣,只不過這里將類看做是類型(一個抽象類型),具有該類類型的變量稱為對象:voidmain(){CPointMyPoint1,MyPoint2; //創(chuàng)建對象,調(diào)用缺省構(gòu)造函數(shù)初始化
MyPoint1.SetXY(2,3); //設(shè)置MyPoint1的屬性值分別為2和3MyPoint2.SetXY(4,5); //設(shè)置MyPoint2的屬性值分別為2和3intx=MyPoint1.GetX(); //調(diào)用成員函數(shù)得到數(shù)據(jù)成員m_x的值
inty=MyPoint1.GetY(); //調(diào)用成員函數(shù)得到數(shù)據(jù)成員m_y的值
cout<<x<<";"<<y<<endl;cout<<MyPoint2.GetX()<<";"<<MyPoint2.GetY()<<endl;
CPoint*pPoint; //定義指向CPoint類對象的指針
pPoint=&MyPoint2; //將對象MyPoint2的地址賦值給pPointx=pPoint->GetX(); //通過指針調(diào)用成員函數(shù)
CPoint*pPoint1=newCPoint;pPoint1->SetXY(6,7); //設(shè)置pPoint1所指對象的屬性值
CPoint&refPoint=MyPoint1;x=refPoint.GetX();}三種調(diào)用方式對象的內(nèi)存映像共102頁第36頁5.3.2對象的創(chuàng)建及初始化2.成員函數(shù)中對象成員的引用CBook*CBook::GetBookPtr(){……returnthis;}CBook&CBook::GetBookRef(){……return*this;}this指針并不常用,通常用于定義返回指向隱式對象指針或引用的成員函數(shù)。例如,在CBook類中添加需要返回指當(dāng)前函數(shù)所屬對象的引用或指向該對象的指針,可以按如下方式定義:voidCPoint::SetXY(intx,inty){this->m_x=x;this->m_y=y;}成員函數(shù)所引用的數(shù)據(jù)成員或函數(shù)成員并未指明是哪個對象的成員隱式調(diào)用顯式調(diào)用共102頁第37頁3.對象創(chuàng)建與構(gòu)造函數(shù)5.3.2對象的創(chuàng)建及初始化構(gòu)造函數(shù)的名字與類的名字相同,而且構(gòu)造函數(shù)沒有返回值,即使是void類型也是非法的,只要滿足了這兩個條件,原則上可以定義任何形式的構(gòu)造函數(shù),因此構(gòu)造函數(shù)是可以重載的。例如,為CPoint類添加構(gòu)造函數(shù):CPoint::CPoint(){m_x=0;m_y=0;}CPoint::CPoint(intx,inty){m_x=x;m_y=y;}CPoint::CPoint(constCPoint&pt){m_x=pt.m_x;m_y=pt.m_y;}CPointmPt1; //調(diào)用CPoint::CPoint()CPointmPt2(2,3); //調(diào)用CPoint::CPoint(intx,inty)CPoint*pPt1=newCPoint(4,5); //調(diào)用CPoint::CPoint(intx,inty)CPoint*pPt=newCPoint(mPt2); //調(diào)用CPoint::CPoint(CPoint&pt)在創(chuàng)建對象時,構(gòu)造函數(shù)被自動調(diào)用,究竟調(diào)用多個構(gòu)造函數(shù)中的哪一個要根據(jù)創(chuàng)建對象時所提供的初始化參數(shù),采用重載函數(shù)的判斷機制判斷。例如下面的對象聲明語句:CPoint::CPoint(constCPointpt)CPoint::CPoint(constCPoint*pt)CPoint::CPoint(CPointpt)共102頁第38頁4.對象的消亡與析構(gòu)函數(shù)5.3.2對象的創(chuàng)建及初始化當(dāng)一個對象消亡時會自動調(diào)用相應(yīng)的析構(gòu)函數(shù)進行一系列的“善后”工作,如:釋放曾經(jīng)申請的內(nèi)存空間等。~ClassName(){}enumSEX{male,female,unknow};classCStudent{private:char* m_pczName;int m_nAge;SEX m_sSex;public:CStudent(char*pName,intnAge,SEXs);CStudent(char*pName);~CStudent();};CStudent::CStudent(char*pName){cout<<"OBJECTCREATE:"<<pName<<endl;m_pczName=newchar[strlen(pName)+1];if(m_pczName!=0)strcpy(m_pczName,pName);m_nAge=-1; //-1表示尚未初始化該屬性
m_sSex=unknow;}CStudent::CStudent(char*pName,intnAge,SEXs){cout<<"OBJECTCREATE:"<<pName<<endl;m_pczName=newchar[strlen(pName)+1];if(m_pczName!=0)strcpy(m_pczName,pName);
m_nAge=nAge;m_sSex=s;}CStudent::~CStudent(){cout<<"OBJECTDELETE:"<<m_pczName<<endl;delete[]m_pczName;}voidmain(){CStudents1("John",10,male);CStudent*ps=newCStudent("Jane",10,female);deleteps;}共102頁第39頁5.關(guān)于拷貝構(gòu)造函數(shù)5.3.2對象的創(chuàng)建及初始化ClassName(ClassName&srcObj);缺省拷貝構(gòu)造函數(shù),其功能是將形參對象的屬性值直接賦值給新創(chuàng)建對象的相應(yīng)屬性,使得兩個對象的對應(yīng)屬性的值相同。當(dāng)類中具有指針類屬性時,將出現(xiàn)運行錯誤,如將上例中主函數(shù)改為(運行,原因):voidmain(){CStudents1("John",10,male);CStudents2(s1);}classCStudent{private:char* m_pczName;int m_nAge;SEX m_sSex;public:CStudent(char*pName,intnAge,SEXs);CStudent(char*pName);
CStudent(constCStudent&srcStudent){m_pczName=newchar[strlen(srcStudent.m_pczName)+1];strcpy(m_pczName,srcStudent.m_pczName);}~CStudent();};共102頁第40頁對象屬性值的變化(對象間的賦值)5.3.2對象的創(chuàng)建及初始化在對象間可以使用賦值符
CPointPt1,Pt2; Pt1.SetXY(2,3); Pt2=Pt1;由于系統(tǒng)會給出賦值符的缺省定義,所以Pt2和Pt1對應(yīng)的屬性相等class<ClassName>{……<ClassName>&operator=(<TYPE>arg);
//返回值類型可以為ClassName、void及其它任何類型
……};<ClassName>&<ClassName>::operator=(TYPEarg)
//返回值類型與原型相同{……}共102頁第41頁5.3.3消息傳遞與操作調(diào)用操作調(diào)用方式與消息傳遞classLine{private:CPointm_cpStartPoint;CPointm_cpEndPoint;public:voidSetLine(CPoint&Start,CPoint&End){m_cpStartPoint.SetXY(Start.GetX(),Start.GetY());m_cpEndPoint.SetXY(End.GetX(),End.GetY());}};classCPoint{private:intm_x;intm_y;public:void SetXY(intx,inty){m_x=x;m_y=y;}intGetX(){returnm_x;}intGetY(){returnm_y;}};共102頁第42頁5.3.4繼承1.單一繼承C++提供下述常見語法格式:
class<DerivedClassName>:<AccessSpecifier><BaseClassName>{……};
矩形長寬位置求面積求周長求位置正方形求面積求周長求位置邊長classCRectangle//矩形類{public:CPointm_cpLocation;//圖形所在位置
intm_nWidth; //圖形的寬度
intm_nHeight; //圖形的高度
CRectangle(intnX,intnY,intnWidth,intnHeight);intGetArea(); //求面積
intGetPerimeter(); //求周長
CPoint&GetPosition();//返回圖形位置};共102頁第43頁CRectangle::CRectangle(intnX,intnY,intnW,intnH):m_cpLocation(nX,nY){ m_nWidth=nW; m_nHeight=nH;}intCRectangle::GetArea(){returnm_nWidth*m_nHeight;}intCRectangle::GetPerimeter(){returnm_nWidth+m_nWidth+m_nHeight+m_nHeight;}CPoint&CRectangle::GetPosition(){returnthis->m_cpLocation;}5.3.4繼承1.單一繼承對象屬性成員的初始化:ClassName::ClassName(ArgList0):ObjectName(ArgList1){……}共102頁第44頁classCSquare:publicCRectangle//正方形類,派生自矩形類{intm_nEdge;public:CSquare(intnX,intnY,intnEdge);intGetEdge();//返回邊長};CSquare::CSquare(intnX,intnY,intnEdge):CRectangle(nX,nY,nEdge,nEdge){m_nEdge=nEdge;}intCSquare::GetEdge(){returnm_nEdge;}5.3.4繼承1.單一繼承繼承中的構(gòu)造函數(shù)實現(xiàn):ClassName::ClassName(ArgList0):BaseClassName(ArgList1){……}共102頁第45頁voidmain(){CRectangler(1,1,2,3);CSquares(0,0,2);cout<<r.GetArea()<<endl<<s.GetArea()<<endl;}5.3.4繼承1.單一繼承共102頁第46頁5.3.4繼承2.基類成員訪問控制有兩個因素同時控制著派生類對基類成員的訪問權(quán)限,這兩個因素就是基類類體中類成員的訪問說明符,及派生類的派生方式。下表總結(jié)了這兩個因素對基類成員訪問權(quán)限的影響規(guī)律,從表可以看到,在任何派生方式下,基類的私有成員都是派生類不可訪問成員;在保護派生情況下,除私有成員外均被派生類以保護成員方式所繼承;公有派生時不改變基類公有和保護成員的訪問權(quán)限基類成員在派生類中的訪問權(quán)限 成類員派生方式privateprotectedpublicprivate不可訪問私有私有protected不可訪問保護保護public不可訪問保護公有共102頁第47頁5.3.4繼承3.多重繼承C++還提供了另一種復(fù)雜的繼承方式,允許從多個基類派生一個子類,即多重繼承。一般形式為:class<ClassName0> : <AccessSpecifier1><ClassName1>, <AccessSpecifier2><ClassName2>, …, <AccessSpecifiern><ClassNamen>{……};<ClassName0>::<ClassName0>(ArgList0):<ClassName1>(ArgList1),…,<ClassNamen>(ArgListn){……}共102頁第48頁WNDSTRUCTCWindowTreeCScreenObjectCEditTextCWnd5.3.4繼承3.多重繼承#include"iostream.h"#include"stdlib.h"#include"string.h"classCWnd;//引用性說明#defineMAXTEXTBUFFER0xffffclassCPoint{private:intm_x;intm_y;public:CPoint(intx=0,inty=0){m_x=x;m_y=y;}intGetX(){returnm_x;}intGetY(){returnm_y;}};共102頁第49頁classWNDSTRUCT{//本對象中含有窗口公共數(shù)據(jù)
protected:char*m_pczWndName; //窗口名字
//下述變量表示窗口左上角和右下角的坐標(biāo)
CPointm_cpTopLeft;CPointm_cpBottomRight;
//下述三個量用于建立窗口系統(tǒng)的樹結(jié)構(gòu)
CWnd*m_pParentWindow; //指向本窗口的父窗口
CWnd**m_pChildFirst; //CWnd的指針數(shù)組,放著本窗口的子窗口
CWnd**m_pSiblingFirst; //指向本窗口的兄弟窗口
char*m_pEditTextBuffer; //指向窗口編輯區(qū)文本緩沖區(qū)
public:WNDSTRUCT(constWNDSTRUCT&rWndArch){m_pczWndName=newchar[strlen(rWndArch.m_pczWndName)+1];if(m_pczWndName==0){cout<<"Noenoughspace!"<<endl;exit(0);}strcpy(m_pczWndName,rWndArch.m_pczWndName);}~WNDSTRUCT(){delete[]m_pczWndName;}};共102頁第50頁classCScreenObject:virtualprivateWNDSTRUCT{public:voidMoveToWindow(constCPoint&cpWndPos,intnWidth,intnHeight){HideWindow();m_cpTopLeft=cpWndPos;m_cpBottomRight=CPoint(m_cpTopLeft.GetX()+nWidth,m_cpBottomRight.GetY()+nHeight);RedrawWindow();}~CScreenObject(){delete[]m_pczWndName;}
voidHideWindow(){/*隱藏當(dāng)前窗口*/}
voidRedrawWindow(){/*繪制并顯示當(dāng)前窗口*/}};共102頁第51頁classCEditText:virtualprivateWNDSTRUCT{public:CEditText(WNDSTRUCT&rWndArch):WNDSTRUCT(rWndArch){m_pEditTextBuffer=newchar[MAXTEXTBUFFER+1];if(m_pEditTextBuffer==0){cout<<"Noenoughspace";exit(1);}memset(m_pEditTextBuffer,'\0',MAXTEXTBUFFER+1);}~CEditText(){delete[]m_pEditTextBuffer;}voidTextCut(intnStart,intnEnd){char*TempStr=newchar[MAXTEXTBUFFER-nEnd];memset(m_pEditTextBuffer+nEnd,'\0',MAXTEXTBUFFER-nEnd);memcpy(m_pEditTextBuffer+nStart,TempStr,MAXTEXTBUFFER-nEnd);delete[]TempStr;
//此處應(yīng)該調(diào)用適當(dāng)函數(shù)重新繪制編輯區(qū)顯示內(nèi)容
}
/*TextPaste(),TextCopy()等函數(shù)*/};共102頁第52頁classCWindowTree:virtualprivateWNDSTRUCT{public:CWindowTree(WNDSTRUCT&rWndArch):WNDSTRUCT(rWndArch){}voidAddChild(CWnd*pChild){while(*m_pChildFirst!=0)++m_pChildFirst;*m_pChildFirst=pChild;}
/*其它關(guān)于窗口樹的操作*/};classCWnd:publicCWindowTree,publicCEditText,publicCScreenObject{…};共102頁第53頁5.3.4繼承3.多重繼承(二義性)classCBase1{public:voidMyFunc(){cout<<"ThisisCBase1'sMyFunc"<<endl;}};classCBase2{public:voidMyFunc(){cout<<"ThisisCBase2'sMyFunc"<<endl;}};classCDerived:publicCBase1,publicCBase2{public:voidfunc(){MyFunc();}//錯誤!兩義性!};voidmain(){CDerivedobj;obj.func();}classCDerived:publicCBase1,publicCBase2{public:voidfunc(){CBase1::MyFunc();//調(diào)用CBase1類的成員函數(shù)MyFunc()CBase2::MyFunc();//調(diào)用CBase2類的成員函數(shù)MyFunc()}};CBase2Func()CBase1MyFunc()CBase2MyFunc()共102頁第54頁5.3.4繼承3.多重繼承(派生類對象內(nèi)存映像)classCBase{public:intb0;CBase(){b0=0x01;}};classCBase1:publicCBase{public:intb1;CBase1(){b1=0x11;}};classCBase2:publicCBase{public:intb2;CBase2(){b2=0x12;}};classCDerived:publicCBase1,publicCBase2{public:intb;CDerived(){b=0x21;}};voidmain(){CDerivedobj;}CBaseCBase1CBase2CBase2共102頁第55頁classCBase{public:intb;};classCBase1:publicCBase{};classCBase2:publicCBase{};classCDerived:publicCBase1,publicCBase2{public:intfunc();};CDerivedobj;obj.b; //錯,二義性obj.CBase::b;
//錯,二義性obj.CBase1::b;
//使用從CBase1來的bobj.CBase2::b;//使用從CBase2來的bclassCBase{public:intb0;CBase(){b0=0x01;}};classCBase1:virtualpublicCBase{public:intb1;CBase1(){b1=0x11;}};classCBase2:virtualpublicCBase{public:intb2;CBase2(){b2=0x12;}};classCDerived:publicCBase1,publicCBase2{public:intb;CDerived(){b=0x21;}};voidmain(){CDerivedobj;}5.3.4繼承3.多重繼承(虛基類)共102頁第56頁共102頁第57頁實現(xiàn)單向關(guān)聯(lián):
用指針可以方便地實現(xiàn)單向關(guān)聯(lián)。如果關(guān)聯(lián)的重數(shù)是一元的,則實現(xiàn)關(guān)聯(lián)的指針是一個簡單指針;如果重數(shù)是多元的,則需要用一個指針集合實現(xiàn)關(guān)聯(lián)。
5.3.5關(guān)聯(lián)的實現(xiàn)共102頁第58頁圖5.4用指針實現(xiàn)單向關(guān)聯(lián)(a)關(guān)聯(lián);(b)實現(xiàn)5.3.5關(guān)聯(lián)的實現(xiàn)共102頁第59頁圖5.5用指針集合實現(xiàn)關(guān)聯(lián)(a)關(guān)聯(lián);(b)實現(xiàn)5.3.5關(guān)聯(lián)的實現(xiàn)共102頁第60頁實現(xiàn)雙向關(guān)聯(lián):
許多關(guān)聯(lián)都需要雙向遍歷,當(dāng)然,兩個方向遍歷的頻度往往并不相同。實現(xiàn)雙向關(guān)聯(lián)有下列三種方法。
只用屬性實現(xiàn)一個方向的關(guān)聯(lián),當(dāng)需要反向遍歷時就執(zhí)行一次正向查找。
兩個方向的關(guān)聯(lián)都用屬性實現(xiàn)。如圖5.5
用獨立的關(guān)聯(lián)對象實現(xiàn)雙向關(guān)聯(lián)。如圖5.65.3.5關(guān)聯(lián)的實現(xiàn)共102頁第61頁圖5.6用對象實現(xiàn)關(guān)聯(lián)5.3.5關(guān)聯(lián)的實現(xiàn)共102頁第62頁公司名稱:char*m_pName老板:CPersonboss............boss結(jié)婚丈夫妻子人姓名:char*m_pName年齡:intm_nAge............工作單位由...掌管0..1老板薪金基本薪酬:intnBasic生活補助:intnSubsidy............為...工作**雇傭5.3.5關(guān)聯(lián)的實現(xiàn)classCCompany{private:char*m_pName;//按圖中要求
CPerson*boss;//因為圖中標(biāo)出老板可有可無,所以用指針表示
CPerson*m_Employee[20]//公司員工最多20};classCPerson{private:char*m_pName;intm_nAge;CCompany*comp;//comp為一個CCompany的數(shù)組,因為可為多個公司工作
CSalary*salary;//salary為一個CSalary數(shù)組,與每個comp相對應(yīng)
CPeron*consort;//按圖中的關(guān)系添加了這一個屬性標(biāo)明配偶
intsex; //為標(biāo)明配偶為男女,所以引入本人的性別};classCSalary{//只要單向關(guān)系即可,所以沒有引入標(biāo)明工資所有者的屬性
private:intnBasic;intnSubsidy;};共102頁第63頁5.3.6聚集關(guān)系的實現(xiàn)classCButton{
…CButton(){……}
…};classCIcon{
…CIcon(){……}
…};classCMessageWindow{private:CButtonm_ButtonOK;CButtonm_ButtonCANCEL;CIconm_Icon;
…public:CMessageWindow():m_ButtonOK(""),m_ButtonCANCEL(""),m_Icon(""){…}
…};消息窗口按鈕圖標(biāo)菜單確定0..1幫助0..1消息10..1文件0..1編輯0..1消息窗口按鈕確定0..1圖標(biāo)消息10..1菜單文件0..1編輯0..1幫助0..11.復(fù)合聚合的實現(xiàn)共102頁第64頁小組成員535班級成員組號:intm_nGroupID學(xué)生:CStudent*m_pStudentsCGroup設(shè)置學(xué)生:SetStudent(CStudent*)構(gòu)造空組nID:CGroup(intnID)班號:intm_nClassID學(xué)生:CStudent*m_pStudentsCClass設(shè)置學(xué)生:SetStudent(CStudent*)構(gòu)造空班nID:CClass(intnID)CStudent5.3.6聚集關(guān)系的實現(xiàn)2.共享聚合的實現(xiàn)classCStudent{CStudent(constchar*pStudentName){…}…};共102頁第65頁classCGroup{private:CStudent**m_pStudents;intm_nGroupID;intm_nstuNum;…public:voidSetStudent(CStudent*pStudents){if(m_nstuNum>=5){cout<<“小組成員已滿”;return;}m_pStudent[m_nstuNum++]=pStudent;}
CGroup(intnID){m_nGroupID=nID;m_pStudents=new(Cstudnet*)[5];//小組由5名學(xué)生組成
m_nstuNum=0;…}…};共102頁第66頁classCClass{private:CStudent**m_pStudents;intm_nClassID;intm_nstuNum;…public:CClass(intnID){m_nClassID=nID;m_pStudents=new(Cstudent*)[35];//班級由35名學(xué)生組成
m_nstuNum=0;…}CStudent*GetStudent(){returnm_pStudents;}voidSetStudent(CStudent*pStudents){m_pStudent[m_nstuNum++]=pStudent;}……};共102頁第67頁voidmain(){CStudenttheWhole[100]={CStudent("Marry"),…,CStudent("Tom")};CClassMyClass3(3);
//成立班級,但具體由哪些學(xué)生組成尚未確定
MyClass3.SetStudent((theWhole+70));
//將學(xué)校學(xué)生名冊中第71位學(xué)生加入到MyClass3班
CGroupGroup6(6);
Group6.SetStudent((MyClass3.GetStudent()+25));
//將MyClass3班的學(xué)生名冊中第26名學(xué)生加入第6學(xué)習(xí)小組
…}共102頁第68頁5.3.7多態(tài)性與虛函數(shù)多態(tài)性(Polymorphism)C++支持兩種多態(tài)性:編譯時的多態(tài)性(靜態(tài))通過重載來實現(xiàn)運行時的多態(tài)性(動態(tài))通過虛函數(shù)來實現(xiàn)共102頁第69頁5.3.7多態(tài)性與虛函數(shù)classPoint{private:intx,y;public:Point(){x=0;y=0;}Point(intx_pos,inty_pos){x=x_pos;y=y_pos;}Point(constPoint&p){x=p.x;y=p.y;}intgetx(){returnx;}intgety(){returny;}};enumColorType{White,Black,Red,Green,Blue,Yellow,Magenta,Cyan};ShapeLineRectangleCircleSquare繪圖程序中多態(tài)性的應(yīng)用共102頁第70頁classShape{private:ColorTypecolor;public:Shape(ColorTypec){color=c;}virtualvoiddraw(){cout<<“drawnotoverridden”<<endl;exit(1);}};classLine:publicShape{private:PointStart,End;public:Line(Points,Pointe,ColorTypec):Shape(c),Start(s),End(e){}virtualvoiddraw();};共102頁第71頁classRectangle:publicShape{private:PointupperLeft,lowerRight;public:Rectangle(Pointul,Pointlr,ColorTypec):Shape(c),upperLeft(up),lowerRight(lr){}virtualvoiddraw();};
classCircle:publicShape{private:Pointcenter;intradius;public:Circle(Pointctr,intr,ColorTypec):Shape(c),center(ctr){radius=r;}virtualvoiddraw();};共102頁第72頁classSquare:publicRectangle{public:Square(Pointul,intl,ColorTypec):Rectangle(ul,Point(ul.getx()+l,ul.gety()+l),c){}};
classPicture{private:Shape*s[6];public:Picture(Shape*s1,Shape*s2,Shape*s3,Shape*s4,Shape*s5,Shape*s6){s[0]=s1;s[1]=s2;s[2]=s3;
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教師年度考核個人述職報告范文(19篇)
- 班主任教師工作簡述7篇
- 智慧安全政務(wù)云數(shù)據(jù)中心整體解決方案
- 某文旅景區(qū)概念性策略-策劃案例
- 《治安管理處罰法》知識競賽參考試題庫150題(含答案)
- 2025年武漢鐵路職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試近5年常考版參考題庫含答案解析
- 2025年無錫城市職業(yè)技術(shù)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點含答案解析
- 2025年曹妃甸職業(yè)技術(shù)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點含答案解析
- 特種材料供應(yīng)合同
- 二手設(shè)備的買賣合同范本
- 2024年計算機二級WPS考試題庫380題(含答案)
- 項目采購管理培訓(xùn)
- (高清版)DZT 0399-2022 礦山資源儲量管理規(guī)范
- 面試官面試技巧(精簡版)課件
- 中央空調(diào)節(jié)能改造方案
- 高校圖書館服務(wù)
- 環(huán)衛(wèi)一體化運營方案
- 科技進步類現(xiàn)代軌道交通綜合體設(shè)計理論與關(guān)鍵技術(shù)公
- 源代碼審計報告模板
- 干式變壓器知識大全課件
- 重大危險源公示牌(完整)-2
評論
0/150
提交評論