第06章數(shù)據(jù)的抽象與封裝.ppt.ppt_第1頁
第06章數(shù)據(jù)的抽象與封裝.ppt.ppt_第2頁
第06章數(shù)據(jù)的抽象與封裝.ppt.ppt_第3頁
第06章數(shù)據(jù)的抽象與封裝.ppt.ppt_第4頁
第06章數(shù)據(jù)的抽象與封裝.ppt.ppt_第5頁
已閱讀5頁,還剩136頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、0,西安交通大學(xué) 計(jì)算機(jī)教學(xué)實(shí)驗(yàn)中心,數(shù)據(jù)的抽象與封裝,計(jì)算機(jī)程序設(shè)計(jì)(C+),內(nèi)容提要,多種數(shù)據(jù)特征的封裝結(jié)構(gòu)體 結(jié)構(gòu) 結(jié)構(gòu)變量 結(jié)構(gòu)數(shù)組 結(jié)構(gòu)指針 公用體 枚舉類型 多種數(shù)據(jù)特征和函數(shù)的封裝類 類 對象 構(gòu)造函數(shù)與析構(gòu)函數(shù) 類的組合 多文件結(jié)構(gòu),1,6.1多種數(shù)據(jù)特征的封裝結(jié)構(gòu)體,在描述某些事物時(shí),有時(shí)只用一種數(shù)據(jù)類型往往很難處理,如手機(jī)通話記錄中的信息就有多種數(shù)據(jù)類型,對方電話號碼可以用字符數(shù)組或者字符串,持續(xù)時(shí)間可以用整型(以秒計(jì)時(shí))、浮點(diǎn)型、雙精度類型中的一種,如果只是將這兩類信息定義為相互獨(dú)立的簡單變量,是很難反映它們之間的內(nèi)在聯(lián)系的,在C語言中,可以使用結(jié)構(gòu)將多種數(shù)據(jù)信息封裝在一

2、起。,2,6.1.1結(jié)構(gòu),結(jié)構(gòu)是C語言中一種新的構(gòu)造數(shù)據(jù)類型,它能把有內(nèi)在聯(lián)系的不同類型的數(shù)據(jù)統(tǒng)一成一個(gè)整體,使它們相互關(guān)聯(lián);同時(shí),結(jié)構(gòu)又是一個(gè)變量的集合,可以按照對基本數(shù)據(jù)類型的操作方法單獨(dú)使用其成員變量。,3,結(jié)構(gòu)體定義,struct 結(jié)構(gòu)體名 類型名1 成員名表1; 類型名2 成員名表2; 類型名n 成員名表n; ;,4,簡單例子,struct conversion char phonenumber11; int duration; ;,5,嵌套定義例子,struct time int hour,minute,second; struct day int year,month,date;

3、 struct conversion char phonenumber11; int duration; struct day occurrentday; struct time occurrenttime; ;,6,6.1.2結(jié)構(gòu)變量,如同C語言中的基本數(shù)據(jù)類型一樣,在定義了結(jié)構(gòu)類型后,還需要定義結(jié)構(gòu)類型的變量,然后才能通過結(jié)構(gòu)變量來操作和訪問結(jié)構(gòu)的數(shù)據(jù)。,7,結(jié)構(gòu)變量定義,單獨(dú)定義 格式1: 結(jié)構(gòu)體名 變量名列表; 格式2: struct 結(jié)構(gòu)體名 變量名列表; 混合定義 struct 結(jié)構(gòu)體名 成員表列 變量名表列; 無類型定義 struct 成員表列 變量名表列;,8,結(jié)構(gòu)變量初始化,

4、struct conversion char phonenumber11; int duration; struct day occurrentday; struct time occurrenttime; account1=“1111111111”,120,2012,8,8,16,15,30;,9,結(jié)構(gòu)變量使用,結(jié)構(gòu)變量成員的引用 結(jié)構(gòu)體變量名.成員名 結(jié)構(gòu)變量的整體賦值 結(jié)構(gòu)變量1=結(jié)構(gòu)變量2 結(jié)構(gòu)變量作為函數(shù)參數(shù) 結(jié)構(gòu)變量可以作為函數(shù)參數(shù)以及函數(shù)的返回值,10,【例6-1】,查找是否有指定電話號碼的通話記錄 【問題分析】 表示通話記錄 【算法描述】 錄入通話記錄,按照電話號碼尋找相匹配的

5、通話記錄,11,【源程序】,#include /包含基本輸入輸出庫頭文件 using namespace std; /使用名字空間 struct time /定義時(shí)間結(jié)構(gòu)體 int hour,minute,second; struct day /定義日期結(jié)構(gòu)體,年、月、日 int year,month,date; struct conversion/通話記錄類型 char phonenumber11; /電話號碼 int duration; /通話時(shí)長 struct day occurrentday; /日期 struct time occurrenttime; /時(shí)間 account1=“1

6、111111111”,120,2012,8,8,16,15,30; /初始化結(jié)構(gòu)體變量account1,12,int main() /主函數(shù) char temp11; couttemp; if(strcmp(account1.phonenumber,temp)=0) /比較電話號碼 cout”find”tempendl; coutaccount1.durationendl; /打印結(jié)構(gòu)體的成員 coutaccount1.occurrentday.year”t”; coutaccount1.occurrentday.month”t”; cout account1.occurrentday.dat

7、eendl; coutaccount1.occurrenttime.hour”t”; coutaccount1.occurrenttime. minute”t”; cout account1.occurrenttime.second endl; ,13,else cout”not find”tempendl; return 0; ,14,【運(yùn)行結(jié)果】,結(jié)果一: 請輸入對方的電話號碼 1111111111 find1111111111 120 2012 8 8 16 15 30 結(jié)果二: 請輸入對方的電話號碼 2222222222 not find2222222222,15,【思路擴(kuò)展】,如果將

8、結(jié)構(gòu)變量的初始化過程改寫成從鍵盤輸入各成員的值再賦值給各成員,應(yīng)該如何修改?如果將查找過程編寫成函數(shù),又該如何修改?,16,6.1.3結(jié)構(gòu)數(shù)組,一個(gè)結(jié)構(gòu)變量只能表示一個(gè)實(shí)體的信息,例如account1只能表示1條通話記錄,如果有許多相同類型的實(shí)體,就需要使用結(jié)構(gòu)數(shù)組,例如100條通話記錄,由于每條記錄的基本信息都是相同的,就可以將這些具有相同結(jié)構(gòu)類型的變量組織起來,形成一個(gè)結(jié)構(gòu)數(shù)組。 結(jié)構(gòu)數(shù)組是結(jié)構(gòu)與數(shù)組的結(jié)合,與普通數(shù)組的不同之處在于每個(gè)數(shù)組元素都是一個(gè)結(jié)構(gòu)類型的數(shù)據(jù),包含各個(gè)成員。,17,結(jié)構(gòu)數(shù)組定義,struct conversion char phonenumber11; int du

9、ration; struct time occurrentday; struct time occurrenttime; account100;,18,結(jié)構(gòu)數(shù)組初始化,struct conversion account100=“1111111111”,11,2012,8,8, 16,15,30,“2222222222”,22, 2012,8,8,16,15,30;,19,結(jié)構(gòu)數(shù)組使用,結(jié)構(gòu)數(shù)組成員的引用 結(jié)構(gòu)數(shù)組名下標(biāo).結(jié)構(gòu)成員名 結(jié)構(gòu)數(shù)組元素的整體賦值 結(jié)構(gòu)數(shù)組元素i=結(jié)構(gòu)數(shù)組元素j,20,【例6-2】,詞頻統(tǒng)計(jì):輸入一系列英文單詞,單詞之間用空格隔開,用“xyz”表示結(jié)束輸入,統(tǒng)計(jì)輸入過哪

10、些單詞以及各單詞出現(xiàn)的次數(shù),統(tǒng)計(jì)時(shí),區(qū)分大小寫字母,最后按單詞的字典順序輸出單詞和出現(xiàn)次數(shù)的對照表。 【問題分析】 字典的組成 【算法描述】 統(tǒng)計(jì)不同單詞出現(xiàn)的次數(shù),21,【源程序】,#include /包含基本輸入輸出庫頭文件 #include using namespace std; /使用名字空間 struct WordList/字典類型 char word50; int freq; ;,22,void Sort(WordList list,int count) /排序函數(shù) for(int i=0;ii;j=j-1) if(strcmp(listj-1.word,listj.word)0

11、) WordList tmp; tmp=listj-1; listj-1=listj; listj=tmp; ,23,int main() /主函數(shù) WordList list5000; int i,num=0; char temp50; couttemp; while(strcmp(temp,”xyz”)!=0) for(i=0;inum;i+) /掃描當(dāng)前字典 if(strcmp(listi.word,temp)=0)/若字典中存在該單詞,詞頻加1 listi.freq+; break; ,24,if(i=num)/若字典中無該單詞,添加該詞 strcpy(listi.word,temp)

12、; listi.freq=1; num+; cintemp;/繼續(xù)輸入單詞 Sort(list,num); /對字典進(jìn)行排序 cout”詞頻統(tǒng)計(jì)結(jié)果如下:”endl; for(i=0;inum;i+) coutlisti.word”t”listi.freqendl; return 0; ,25,【運(yùn)行結(jié)果】,請輸入一系列英語單詞,以xyz表示輸入結(jié)束 Do you see the star , the little star ? xyz 詞頻統(tǒng)計(jì)結(jié)果如下: , 1 ? 1 Do 1 little 1 see 1 star 2 the 2 you 1,26,【思路擴(kuò)展】,如果在統(tǒng)計(jì)單詞過程中,要

13、去掉標(biāo)點(diǎn)符號的統(tǒng)計(jì),該如何修改?實(shí)際運(yùn)行時(shí),如果標(biāo)點(diǎn)符號與單詞連在一起,統(tǒng)計(jì)結(jié)果會有哪些變化,應(yīng)該如何解決?,27,6.1.4結(jié)構(gòu)指針,指向結(jié)構(gòu)的指針 *p,*p- 指向結(jié)構(gòu)數(shù)組的指針 結(jié)構(gòu)數(shù)組元素.成員名 結(jié)構(gòu)數(shù)組元素-成員名 結(jié)構(gòu)指針名-成員名 (*結(jié)構(gòu)指針名).成員名 結(jié)構(gòu)指針作為函數(shù)參數(shù),28,【例6-3】,利用帶結(jié)構(gòu)指針的函數(shù)實(shí)現(xiàn)通話記錄的輸入、輸出和查找等功能。 【問題分析】 輸入、輸出和查找函數(shù) 【算法描述】 批量錄入通話記錄,再按照電話號碼尋找相匹配的通話記錄。,29,【源程序】,#include /包含基本輸入輸出庫頭文件 using namespace std; /使用名字

14、空間 struct time /時(shí)間結(jié)構(gòu)體 int hour,minute,second; struct day /日期結(jié)構(gòu)體 int year,month,date; struct conversion /通話記錄結(jié)構(gòu)體 char phonenumber11; int duration; struct day occurrentday; struct time occurrenttime; void input(struct conversion *);/輸入函數(shù)聲明 void print(struct conversion);/輸出函數(shù)聲明 struct conversion find(s

15、truct conversion *, char tempnumber11);,30,int main() /主函數(shù) char temp11; struct conversion account1,account5; /結(jié)構(gòu)體變量、數(shù)組 input(account); /調(diào)用輸入函數(shù) couttemp; /輸入要查找的電話號碼 account1=find(account,temp); /調(diào)用查找函數(shù) if(strcmp(account1.phonenumber,0000000000)!=0) /判斷是否找到 print(account1); /找到則顯示 else coutnot finden

16、dl; return 0; /主函數(shù)結(jié)束 ,31,void input(struct conversion *p)/批量輸入通話記錄 coutpi.phonenumberpi.duration; cinpi.occurrentday.yearpi.occurrentday.monthpi.occurrentday.date; cinpi.occurrenttime.hourpi.occurrenttime.minutepi.occurrenttime.second; ,32,void print(struct conversion q) /輸出指定結(jié)構(gòu)變量的全部成員信息 coutq.phone

17、numbertq.durationendl; coutq.occurrentday.yeart ; coutq.occurrentday.montht ; cout q.occurrentday.dateendl; coutq.occurrenttime.hourt; coutq.occurrenttime. minutet; cout q.occurrenttime.second endl; ,33,struct conversion find(struct conversion *p,char tempnumber11)/查找指定電話 struct conversion r=0000000

18、000;/結(jié)構(gòu)變量部分成員初始化 for(int i=0;i5;i+) if(strcmp(pi.phonenumber,tempnumber)=0) r=pi; /結(jié)構(gòu)變量的整體賦值 return r; ,34,【運(yùn)行結(jié)果】,請輸入5個(gè)人的通話記錄(電話、時(shí)長、日期、時(shí)間) 1111111111 120 2012 8 8 8 8 8 2222222222 130 2012 8 9 8 8 9 3333333333 140 2012 8 1 8 8 8 4444444444 150 2012 9 9 9 9 9 5555555555 160 2012 9 9 9 9 9 input the p

19、honenumber:3333333333 3333333333 140 2012 8 1 8 8 8,35,【思路擴(kuò)展】,什么情況下在函數(shù)中使用結(jié)構(gòu)變量或者結(jié)構(gòu)指針作為函數(shù)參數(shù)較好?,36,6.1.5公用體,結(jié)構(gòu)體與共用體的本質(zhì)區(qū)別只要在于存儲方式,結(jié)構(gòu)體的每個(gè)成員各自占用分配給自己的存儲單元,各自擁有自己的地址,結(jié)構(gòu)體類型分配的內(nèi)存空間大小就是各成員所占存儲單元的總和。共用體的各個(gè)成員則占用共同的存儲單元,具有相同的首地址,占用存儲單元最多的成員的長度就是共用體的長度。,37,公用體的定義,union 公用體名 類型1 成員名1; 類型2 成員名2; 類型n 成員名n; ;,38,共用體變

20、量定義,單獨(dú)定義 union postion pos1,pos2,*p; 混合定義 union postion int grand; char title20; pos1,pos2,*p;,39,公用體變量初始化,共用體變量或數(shù)組在初始化時(shí),只能對它的第一個(gè)成員賦值,對多個(gè)成員賦值是不允許的 union postion pos1=1;/正確 union postion pos2=1,2;/正確 union postion pos2=1,lector,2,lector;/錯(cuò)誤,40,共用體變量的使用,共用體變量的引用 共用體變量名.成員 共用體變量指針.成員 公用體變量的整體賦值 共用體變量1=

21、共用體變量2,41,【例6-4】,學(xué)校人事信息管理:批量輸入和輸出學(xué)生或者教師信息,包括姓名、年齡、職業(yè)和職位等信息,每位學(xué)生或者教師都包含前3項(xiàng)信息,但對學(xué)生而言,其第4項(xiàng)信息表示年級;對教師而言,其第4項(xiàng)信息表示職稱。 【問題分析】 學(xué)校人事信息的表示 【算法描述】 輸入和輸出學(xué)校人事信息。,42,【源程序】,#include /包含基本輸入輸出庫頭文件 using namespace std; /使用名字空間 union postion int grand; char title20; ; struct person char name20; int age; char job10; p

22、ostion pos; ;,43,int main() /主函數(shù) person p3; int i; for(i=0;pi.agepi.job; if(strcmp(pi.job,”student”)=0) cin pi.pos.grand; else cin pi.pos.title; cout”*”endl;,44,cout”name”t”age”t”job”t” grand/title”endl; for(i=0;i3;i+) ”t”pi.age”t” pi.job”t”; if(strcmp(pi.job,”student”)=0) cout pi

23、.pos.grandendl; else cout pi.pos.titleendl; return 0;/程序結(jié)束, ,45,【運(yùn)行結(jié)果】,tom 21 student 3 john 19 teacher professor rose 19 student 1 * name age job grand/title tom 21 student 3 john 19 teacher professor rose 19 student 1,46,【思路擴(kuò)展】,結(jié)構(gòu)體類型中包含共用體類型的定義會在哪些情況中出現(xiàn)?共用體類型中包含結(jié)構(gòu)體類型的定義會在哪些情況中出現(xiàn)?,47,6.1.6枚舉類型,在一些實(shí)

24、際的應(yīng)用中,有些變量的取值常常被限定在一個(gè)有限范圍內(nèi),如一個(gè)星期只有7天,一年只有12個(gè)月等。C語言提供的“枚舉”類型能夠在類型定義時(shí)列舉出所有可能的取值,將枚舉類型變量的取值限定在取值范圍內(nèi)。由于枚舉變量只能取一個(gè)值,不能再分解為任何基本類型,因此枚舉類型只是一種基本數(shù)據(jù)類型,而不是構(gòu)造類型。,48,枚舉的定義,enum 枚舉名 枚舉常量表,49,枚舉變量的定義,單獨(dú)定義 enum color temp; 混合定義 enum color red,yellow,blue,white,black temp; 無類型定義 enum red,yellow,blue,white,black temp;

25、,50,枚舉變量的使用,可以把枚舉常量賦值給枚舉變量,但不能直接把元素的序號賦值給枚舉變量。,51,【例6-5】,五色球的組合:口袋中有紅、黃、藍(lán)、白、黑5種顏色的小球若干,如果每次都從口袋中取出3個(gè)不同顏色的小球,共有多少種組合?試輸出每種組合的3種顏色。 【問題分析】 小球顏色的表示 【算法描述】 使用窮舉法測試符合三種顏色要求的每種組合。,52,#include /包含基本輸入輸出庫頭文件 using namespace std; /使用名字空間 int main() /主函數(shù) enum colorred,yellow,blue,white,black; int count=0; int

26、 temp; for(int i=red;i=blue;+i)/第一次取球 for(int j=i+1;j=black;+j)/第二次取球 for(int k=j+1;k=black;k+)/第三次取球 +count;,53,for(int t=0;t3;+t)/輸出每次組合中3次取球的顏色 switch(t) case 0:temp=I;break; case 1:temp=j;break; case 2:temp=k;break; default:cout”impossiblen”; switch(enum color)temp) case red:cout”red”t”;break; c

27、ase yellow:cout”yellow”t”;break; case blue:cout”blue”t”;break; case white:cout”white”t”;break; case black:cout”black”t”;break; default:cout”impossiblen”; ,54,cout”n”; cout”共有”count”種組合”endl; return 0;/程序結(jié)束, ,55,【運(yùn)行結(jié)果】,red yellow blue red yellow white red yellow black red blue white red blue black re

28、d white black yellow blue white yellow blue black yellow white black blue white black 共有10種組合,56,【思路擴(kuò)展】,如果本題不使用枚舉類型,該如何實(shí)現(xiàn)?如果允許取出相同顏色的小球,該如何修改程序?,57,多種數(shù)據(jù)特征和函數(shù)的封裝類,在結(jié)構(gòu)體類型中可以定義若干個(gè)成員表示一個(gè)整體,比如通話記錄這個(gè)結(jié)構(gòu)體可以包含對方電話號碼、持續(xù)時(shí)間、發(fā)生日期、發(fā)生時(shí)間等。在使用結(jié)構(gòu)體類型時(shí)需要定義結(jié)構(gòu)體變量,然后對它所包含的各個(gè)成員進(jìn)行賦值。在默認(rèn)情況下,這些成員在結(jié)構(gòu)體之外是公開的(稱為具有public權(quán)限),外部可以任

29、意使用。其實(shí),C+語言對結(jié)構(gòu)體進(jìn)行了一定程度的改良,比如在結(jié)構(gòu)體類型中不但可以增加類似成員的內(nèi)部變量,還可以增加內(nèi)部函數(shù),這樣就擴(kuò)展了結(jié)構(gòu)體的用途范圍,而這些內(nèi)部函數(shù)對外也是公開的。以下將要講到的類與結(jié)構(gòu)體有相似之處,它不但包含結(jié)構(gòu)體所體現(xiàn)的功能,而且設(shè)計(jì)上更靈活,更易于管理,數(shù)據(jù)也更安全。,58,6.2.1類,類與自然界分門別類是同樣一個(gè)概念,例如人是一個(gè)大類,學(xué)生和教師是其子類;數(shù)學(xué)是一個(gè)大類,高等數(shù)學(xué)和初等數(shù)學(xué)是其子類。在C+中,類也是一種數(shù)據(jù)類型。對象是每個(gè)類中的一個(gè)個(gè)實(shí)體和事項(xiàng),例如學(xué)生是一個(gè)子類,而王東同學(xué)作為學(xué)生類的一個(gè)實(shí)體,他不僅屬于該類,他還能展示該類所具有的基本特征、性能、

30、動作和功能等,如學(xué)號、班級、所學(xué)課程、成績等。在C+中,類的所有特征、性能和功能等均要通過對象才能展示和實(shí)現(xiàn)。,59,類定義,class 類名 成員訪問權(quán)限: 成員變量定義; 成員訪問權(quán)限: 成員函數(shù)定義; . ;,60,成員變量 數(shù)據(jù)類型 成員變量名 ; 成員函數(shù) 如果在類內(nèi)定義,其形式為: 返回類型 成員函數(shù) ( 數(shù)據(jù)類型 形式參數(shù)1 , 數(shù)據(jù)類型 形式參數(shù)2 , . ) 函數(shù)體 如果在類外定義,其形式為: 返回類型 類名:成員函數(shù) ( 數(shù)據(jù)類型 形式參數(shù)1 ,. ) 函數(shù)體 ,61,內(nèi)聯(lián)函數(shù) 隱式定義 顯式定義 inline 返回類型 類名:成員函數(shù) ( 數(shù)據(jù)類型 形式參數(shù)1 ,. )

31、函數(shù)體 ,62,class mobile private: char mynumber11;/機(jī)主的電話號碼 public: void init(char number11=”0000000000”)/隱式定義的內(nèi)聯(lián)函數(shù) mynumber=number; void dial();/撥打電話 void answer(char othernumber11);/接聽電話 void hangup();/掛斷電話 ,63,6.2.2對象,類實(shí)際上是一種抽象機(jī)制,描述了一類問題的共同屬性和行為,在C+中,類的對象就是該類的某一特定實(shí)體(也稱實(shí)例)。如果將類看作是一種類型,那么類的對象就可以看作為該類型的變

32、量。,64,對象定義,單獨(dú)定義 類名 對象變量名 ; mobile m1,m2;/定義類對象m1和m2 混合定義 class mobile . mobile m1,m2; /定義類對象m1和m2,65,對象初始化,class mobile public: char mynumber11;/機(jī)主的電話號碼 . m1=”1111111111”;,66,對象使用,對象成員的引用 對象變量名.成員變量或成員函數(shù) 對象指針名-成員變量或成員函數(shù) 對象的整體賦值 對象1=對象2 對象作為函數(shù)的形式參數(shù),67,【例6-6】,定義手機(jī)類mobile,包括電話號碼mynumber變量以及初始化函數(shù)init、撥打

33、電話函數(shù)dial、接聽電話函數(shù)answer、掛斷電話函數(shù)hangup。 【問題分析】 手機(jī)類的定義。 【算法描述】 定義mobile類,68,【源程序】,#include using namespace std; class mobile private: char mynumber11;/機(jī)主的電話號碼 public: void init(char number11=”0000000000”)/隱式定義的內(nèi)聯(lián)函數(shù) strcpy(mynumber,number); void dial();/撥打電話 void answer(char othernumber11);/接聽電話 void hang

34、up();/掛斷電話 ;,69,void mobile:dial() cout”Dialing number is”mynumberendl; cout”Dialing on.”endl; void mobile:answer(char othernumber11) cout”Answering number is”othernumberendl; cout”Answering in.”endl; inline void mobile:hangup()/顯示定義的內(nèi)聯(lián)函數(shù) cout”Hanging up.”endl; ,70,int main() mobile m1; m1.init(”111

35、1111111”);/對象對成員函數(shù)init的使用 m1.dial(); m1.hangup(); m1.answer(”2222222222”); m1.hangup(); return 0; ,71,運(yùn)行結(jié)果,Dialing number is1111111111 Dialing on. Hanging up. Answering number is2222222222 Answering in. Hanging up.,72,【思路擴(kuò)展】,日常生活中,還有哪些事物可以定義為類?,73,【例6-7】,定義手機(jī)類mobile,包括電話號碼mynumber變量,定義初始化函數(shù)init、撥打電話

36、函數(shù)dial、接聽電話函數(shù)answer、掛斷電話函數(shù)hangup,要求dial和init用對象作為函數(shù)的參數(shù),實(shí)現(xiàn)與【例6-6】相同的功能。 【問題分析】 函數(shù)dial和init的定義 【算法描述】 定義mobile類和能夠使用該類對象的普通函數(shù)dial和init,74,【源程序】,#include using namespace std; class mobile public: char mynumber11;/機(jī)主的電話號碼 ; void init(mobile ,75,void answer(char othernumber11)/接聽電話 cout”Answering number

37、is”othernumberendl; cout”Answering in.”endl; void hangup()/掛斷電話 cout”Hanging up.”endl; ,76,int main() /main function mobile m1; init(m1); dial(m1); hangup(); answer(”2222222222”); hangup(); return 0; ,77,【運(yùn)行結(jié)果】,1111111111 Dialing number is1111111111 Dialing on. Hanging up. Answering number is2222222

38、222 Answering in. Hanging up.,78,【思路擴(kuò)展】,【例6-6】與【例6-7】的區(qū)別有哪些?,79,對象與指針,指向?qū)ο蟮闹羔?類名 *對象指針名; 指向?qū)ο蟪蓡T的指針 返回值類型名(類名:*指針變量名)(參數(shù)表); 指針變量名=類名:成員函數(shù)名; 指向?qū)ο蟮闹羔樅椭赶驅(qū)ο蟪蓡T的指針都只能訪問公有成員。 this指針 存放對象的起始地址,80,【例6-8】,利用指向?qū)ο蟮闹羔樢约爸赶驅(qū)ο蟪蓡T函數(shù)指針完成手機(jī)mobile類中撥打、接聽等函數(shù)的調(diào)用。 【問題分析】 指向?qū)ο蟮闹羔?、指向?qū)ο蟪蓡T變量的指針以及指向?qū)ο蟪蓡T函數(shù)指針的使用 【算法描述】 在mobile類中使用

39、指向?qū)ο蟮闹羔樅椭赶驅(qū)ο蟪蓡T函數(shù)指針,81,【源程序】,#include using namespace std; class mobile public: char mynumber11; void init(char number11=”0000000000”)/隱式定義的內(nèi)聯(lián)函數(shù) strcpy(mynumber,number); void dial();/撥打電話 void answer(char othernumber11);/接聽電話 void hangup();/掛斷電話 ;,82,void mobile:dial() cout”Dialing number is”mynumber

40、endl; cout”Dialing on.”endl; void mobile:answer(char othernumber11) cout”Answering number is”othernumberendl; cout”Answering in.”endl; void mobile:hangup()/顯示定義的內(nèi)聯(lián)函數(shù) cout”Hanging up.”endl; ,83,int main() mobile m1; mobile *p1=,84,void(mobile:*p3)(char number11); void(mobile:*p4)(); void(mobile:*p5)(

41、char othernumber11); void(mobile:*p6)(); p3=mobile:init; p4=mobile:dial; p5=mobile:answer; p6=mobile:hangup; (m1.*p3)(”1111111111”); (m1.*p4)(); (m1.*p6)(); (m1.*p5)(”2222222222”); (m1.*p6)(); return 0; ,85,【運(yùn)行結(jié)果】,Dialing number is1111111111 Dialing on. Hanging up. Answering number is2222222222 Answ

42、ering in. Hanging up. 1 Dialing number is1111111111 Dialing on. Hanging up. Answering number is2222222222 Answering in. Hanging up.,86,【思路擴(kuò)展】,指向?qū)ο蟮闹羔槨⒅赶驅(qū)ο蟪蓡T變量的指針以及指向?qū)ο蟪蓡T函數(shù)指針會在哪些情況中使用?,87,6.2.3構(gòu)造函數(shù),構(gòu)造函數(shù) 在對象被創(chuàng)建時(shí)利用特定的值構(gòu)造對象,將對象初始化為一個(gè)特定的狀態(tài)。 拷貝構(gòu)造函數(shù) 使用一個(gè)已經(jīng)存在的對象(由拷貝構(gòu)造函數(shù)的參數(shù)指定),去初始化同類的一個(gè)新對象。 析構(gòu)函數(shù) 用于完成對象被刪除前的一

43、些善后工作,88,構(gòu)造函數(shù),類名( 形參列表 ) 函數(shù)體 ,89,拷貝構(gòu)造函數(shù),類名(類名 class mobile public: char mynumber11; mobile();/不帶參數(shù)的構(gòu)造函數(shù)mobile mobile(char number11);/ 帶參數(shù)的構(gòu)造函數(shù)mobile mobile(); ; mobile:mobile() strcpy(mynumber,”0000000000”); coutmynumberendl; ,93,mobile:mobile(char number11) strcpy(mynumber,number); coutmynumberendl

44、; mobile() cout”Turn off the phone”endl; int main() mobile m1; return 0; ,94,【運(yùn)行結(jié)果】,0000000000 Turn off the phone,95,6.2.4類的組合,組合 類名:類名(形參表):內(nèi)嵌對象1(形參表),內(nèi)嵌對象2(形參表),. 類的初始化 引用 循環(huán)依賴 向前引用,96,【例6-10】,定義具有GSM和CDMA兩種發(fā)射制式的mobile類 【問題分析】 內(nèi)嵌對象的使用 【算法描述】 在mobile類中使用內(nèi)嵌對象、構(gòu)造函數(shù)和析構(gòu)函數(shù),97,【源程序】,#include using namesp

45、ace std; class mobilecdma private: char mynumber11;/機(jī)主的電話號碼 public: mobile(char number11)/初始化 mynumber=number; cout”Turn on the mobile”mynumberendl; mobile() cout”Turn off the mobile”mynumberendl; ;,98,class mobile private: char mynumber11;/機(jī)主的電話號碼 mobilecdma core;/CDMA內(nèi)核,內(nèi)嵌對象 public: mobile(char *n

46、umber,char *number1):core(number1)/初始化 strcpy(mynumber,number); cout”Turn on the mobile”mynumberendl; mobile() cout”Turn off the mobile”mynumberendl; ;,99,int main() mobile m1(”1111111111”,”2222222222”); return 0; ,100,【運(yùn)行結(jié)果】,Turn on the mobile2222222222 Turn on the mobile1111111111 Turn off the mob

47、ile1111111111 Turn off the mobile2222222222,101,6.2.5多文件結(jié)構(gòu),一般把類和成員變量的定義放在一個(gè).h文件,把成員函數(shù)和靜態(tài)成員的定義放在.cpp文件中,主函數(shù)放在另外的一個(gè).cpp文件中。,102,【例6-11】,使用多文件結(jié)構(gòu)組織mobile類。 【問題分析】 源文件劃分 【算法分析】 mobile類的多文件結(jié)構(gòu),103,.h,/mobil.h文件放mobile的定義 #ifndef MOBILE_H #define MOBILE_H class mobile private: char mynumber11;/機(jī)主的電話號碼 publi

48、c: mobile(char number11);/構(gòu)造函數(shù) void dial();/撥打電話 void answer(char othernumber11);/接聽電話 void hangup();/掛斷電話 mobile();/析構(gòu)函數(shù) #endif,104,.cpp,/mobile.cpp文件放mobile成員函數(shù)的定義 #include #include mobile.h using namespace std; mobile:mobile(char number11)/初始化 strcpy(mynumber,number); cout”Turn on the mobile”mynu

49、mberendl; mobile:mobile() cout”Turn off the mobile”mynumberendl; ,105,void mobile:dial() cout”Dialing number is”mynumberendl; cout”Dialing on.”endl; void mobile:answer(char othernumber11) cout”Answering number is”othernumberendl; cout”Answering in.”endl; void mobile:hangup() cout”Hanging up.”endl; ,

50、106,.cpp,/main.cpp放主函數(shù) #include mobile.h #include using namespace std; int main() mobile m1(”1111111111”); m1.dial(); m1.hangup(); m1.answer(”2222222222”); m1.hangup(); return 0; ,107,【運(yùn)行結(jié)果】,Turn on the mobile1111111111 Dialing number is1111111111 Dialing on. Hanging up. Answering number is222222222

51、2 Answering in. Hanging up. Turn off the mobile1111111111,108,【思路擴(kuò)展】,在什么情況下會使用類的多文件結(jié)構(gòu)?,109,【例6-12】,對每個(gè)學(xué)生的成績進(jìn)行判斷,找出有不及格的課程,然后顯示該同學(xué)的學(xué)號姓名以及不及格課程的名稱和分?jǐn)?shù)。 【問題分析】 定義結(jié)構(gòu)體的數(shù)據(jù)類型student,其成員分別是學(xué)號、姓名和一個(gè)數(shù)組,該數(shù)組用來保存5門課的成績,初始化時(shí)給出每個(gè)學(xué)生的學(xué)號、姓名和各門課程的成績。 【算法描述】 在學(xué)生成績結(jié)構(gòu)體數(shù)組中查找不及格信息。,110,【源程序】,#include using namespace std; in

52、t main() struct student char stno9; char stname20; int score5; ;,111,student stud10=08091101,張品,76,87,69,76,78, 08091102,李利,97,67,79,45,90, 08091103,應(yīng)一利,54,69,76,79,56, 08091104,周勤,87,88,97,99,76, 08091105,吳風(fēng),69,56,98,34,32, 08091106,趙強(qiáng),77,87,99,65,76, 08091107,李力平,91,67,67,87,65, 08091108,張軍利,87,45

53、,77,56,79, 08091109,馮紅,100,69,89,89,76, 08091110,孫李,99,76,97,96,79 ; char course520=數(shù)學(xué),物理,化學(xué),英語,計(jì)算機(jī); int i,j,cnt; cout每個(gè)同學(xué)的成績:endl; cout 學(xué)號t姓名t數(shù)學(xué)t物理t化學(xué)t英語t計(jì)算機(jī)endl; cout=endl;,112,for(i=0;i10;i+) coutstudi.stnotstudi.stnamet; for(j=0;j5;j+) coutstudi.scorejt; coutendl; cout=endl; cout不及格同學(xué)的課程和成績?nèi)缦拢篹n

54、dl; / 處理不及格分?jǐn)?shù) for(i=0;i10;i+) cnt=0;,113,for(j=0;j0) cout“姓名:”studi.stname“ 學(xué)號:”studi.stno“ 不及格門數(shù):cntendl; cout=endl; for(j=0;j5;j+) if(studi.scorej60) coutcoursej:studi.scorejendl; cout=endl; return 0; ,114,【運(yùn)行結(jié)果】,每個(gè)同學(xué)的成績: 學(xué)號 姓名 數(shù)學(xué) 物理 化學(xué) 英語 計(jì)算機(jī) = 08091101 張品 76 87 69 76 78 08091102 李利 97 67 79 45 9

55、0 08091103 應(yīng)一利 54 69 76 79 56 08091104 周勤 87 88 97 99 76 08091105 吳風(fēng) 69 56 98 34 32 08091106 趙強(qiáng) 77 87 99 65 76 08091107 李力平 91 67 67 87 65 08091108 張軍利 87 45 77 56 79 08091109 馮紅 100 69 89 89 76 08091110 孫李 99 76 97 96 79 =,115,不及格同學(xué)的課程和成績?nèi)缦拢?姓名:李利 學(xué)號:08091102 不及格門數(shù):1 = 英語:45 = 姓名:應(yīng)一利 學(xué)號:08091103 不及格門數(shù):2 = 數(shù)學(xué):54 計(jì)算機(jī):56 = 姓名:吳風(fēng) 學(xué)號:08091105 不及格門數(shù):3 = 物理:56 英語:34 計(jì)算機(jī):32,

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論