版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1第五章
類與對(duì)象的深入介紹參見教材5.4、5.5、5.6、5.7節(jié)2主要內(nèi)容及要求主要內(nèi)容類與對(duì)象概述構(gòu)造函數(shù)和析構(gòu)函數(shù)靜態(tài)成員和常量成員友元要求重點(diǎn)掌握類、對(duì)象、構(gòu)造函數(shù)、析構(gòu)函數(shù)、靜態(tài)成員、常量成員了解友元的使用
3設(shè)計(jì)實(shí)例以一個(gè)例子進(jìn)一步比較面向?qū)ο蟪绦蛟O(shè)計(jì)思想與非面向?qū)ο蟪绦蛟O(shè)計(jì)思想,展示從不使用函數(shù)到引入函數(shù)進(jìn)行模塊化編程,再到引入類進(jìn)行面向?qū)ο缶幊痰某绦蛟O(shè)計(jì)思路4[例]:桌球城計(jì)費(fèi)問(wèn)題問(wèn)題描述:某桌球城營(yíng)業(yè)時(shí)間為9:00到23:00,每張桌子收費(fèi)標(biāo)準(zhǔn)為9:00到18:00或21:00至23:00為0.45元/分鐘、18:00至21:00為0.60元/分鐘。編寫C++程序,輸入顧客占用一張桌子的起、止時(shí)間(精確到分鐘),輸出計(jì)費(fèi)結(jié)果。
5非模塊化設(shè)計(jì)
按照自頂向下分解的思路,首先可將此問(wèn)題分解成幾個(gè)小問(wèn)題:輸入起止時(shí)間根據(jù)起止時(shí)間計(jì)算費(fèi)用輸出費(fèi)用6非模塊化設(shè)計(jì)(續(xù))輸出費(fèi)用使用簡(jiǎn)單的輸出語(yǔ)句即可輸入起止時(shí)間,也可使用簡(jiǎn)單的輸入語(yǔ)句,輸入兩個(gè)整數(shù)分別代表小時(shí)和分鐘為使程序能應(yīng)付所有情況,要檢查用戶輸入的小時(shí)和分鐘是否正確,檢查包括輸入的小時(shí)應(yīng)大于等于9小于等于23,且如果等于23時(shí)分鐘應(yīng)該為0輸入的分鐘應(yīng)大于等于0小于等于59輸入的起始時(shí)間應(yīng)小于(先于)終止時(shí)間
7非模塊化設(shè)計(jì)(續(xù))進(jìn)一步考慮如何根據(jù)起止時(shí)間進(jìn)行計(jì)費(fèi)顯然,因?yàn)椴煌瑫r(shí)間段的收費(fèi)標(biāo)準(zhǔn)不同,需要分時(shí)間段計(jì)算費(fèi)用可以根據(jù)起止時(shí)間求出每個(gè)時(shí)間段的分鐘數(shù),然后使用該分鐘數(shù)乘相應(yīng)的費(fèi)用則可得到總費(fèi)用因?yàn)橹挥袕?8點(diǎn)到21點(diǎn)的費(fèi)用不同,因此也可先求出總的分鐘數(shù)乘一般費(fèi)用(即0.45元),然后再求用戶在18點(diǎn)到21點(diǎn)這個(gè)范圍內(nèi)占用了多少分鐘,用它乘超出費(fèi)用(即0.15元),兩個(gè)費(fèi)用相加即得到總費(fèi)用8非模塊化設(shè)計(jì)的源代碼//程序:CALFEE1.CPP//功能:為某桌球城計(jì)算費(fèi)用(第一個(gè)版本,所有功能都用主函數(shù)main()實(shí)現(xiàn))#include<iostream.h>
intmain(){intstart_hour,start_minute; //輸入的起始時(shí)間
inttemp_s_hour,temp_s_minute;//用來(lái)計(jì)算附加時(shí)間的臨時(shí)起始時(shí)間
intend_hour,end_minute; //輸入的終止時(shí)間
inttemp_e_hour,temp_e_minute;//用來(lái)計(jì)算附加時(shí)間的臨時(shí)終止時(shí)間
inttotal_minute; //從起始時(shí)間到終止時(shí)間總的分鐘數(shù)
intextra_minute; //在18點(diǎn)到21點(diǎn)時(shí)間段要計(jì)算附加費(fèi)用的分鐘數(shù)
floattotal_fee; //總的費(fèi)用9非模塊化設(shè)計(jì)的源代碼(續(xù))while(1){ //可多次輸入終止和起始時(shí)間,多次計(jì)算費(fèi)用
//輸入兩個(gè)整數(shù)分別代表小時(shí)與分鐘,中間用空格分開
cout<<"Pleaseinputthestarttime(suchas1220):"; cin>>start_hour>>start_minute;
//如果用戶的小時(shí)與分鐘都為零,則結(jié)束程序
if(start_hour==0&&start_minute==0)return0; cout<<"Pleaseinputtheendtime:"; cin>>end_hour>>end_minute;
10非模塊化設(shè)計(jì)的源代碼(續(xù))
//檢查輸入的起始時(shí)間和終止時(shí)間是否合法
if(start_hour<9||start_hour>=23){//起始的小時(shí)必須在9到22之間
cout<<"Thestarthouriserror!\n"; continue;}if(start_minute<0||start_minute>59){ //分鐘必須在0到59之間
cout<<"Thestartminuteiserror!\n"; continue;}if(end_hour<9||end_hour>23){ //終止的小時(shí)必須在9到23之間
cout<<"Theendhouriserror!\n"; continue;}
11非模塊化設(shè)計(jì)的源代碼(續(xù))//如果終止小時(shí)為23,則分鐘只能為0if(end_hour==23&&end_minute>0){ cout<<"Theendtimeiserror!\n"; continue;}//分鐘必須在0到59之間if(end_minute<0||end_minute>59){ cout<<"Theendminuteiserror!\n"; continue;}
12非模塊化設(shè)計(jì)的源代碼(續(xù))
//計(jì)算總的時(shí)間(分鐘數(shù))
total_minute=(end_hour-start_hour)*60+end_minute-start_minute;
//如果總的分鐘數(shù)小于0,則表示輸入的起始時(shí)間大于終止時(shí)間
if(total_minute<0){ cout<<"Thestarttimeislaterthantheendtime!\n"; continue;}
13非模塊化設(shè)計(jì)的源代碼(續(xù))//計(jì)算輸入的起始時(shí)間和終止時(shí)間落在18點(diǎn)到21點(diǎn)時(shí)間段的分鐘數(shù),//這段時(shí)間要計(jì)附加費(fèi)用
if(end_hour<18||start_hour>=21) extra_minute=0;else{ if(start_hour>=18){
//如果起始小時(shí)在18點(diǎn)以后,
//則落在18點(diǎn)到21點(diǎn)之間的起始小時(shí)就是輸入的起始小時(shí)
temp_s_hour=start_hour;temp_s_minute=start_minute; }else{//否則(輸入的起始小時(shí)在18點(diǎn)以前)從18點(diǎn)算起
if(end_hour>=18) temp_s_hour=18;temp_s_minute=0;} 14非模塊化設(shè)計(jì)的源代碼(續(xù))if(end_hour<21){
//同樣如果終止小時(shí)在21點(diǎn)以前,
//則落在18點(diǎn)到21點(diǎn)之間的終止小時(shí)就是輸入的終止小時(shí)
temp_e_hour=end_hour;temp_e_minute=end_minute;}else{
//否則(輸入的終止小時(shí)在21點(diǎn)以后)只能算到21點(diǎn)
temp_e_hour=21;temp_e_minute=0;}extra_minute=(temp_e_hour-temp_s_hour)*60+temp_e_minute–temp_s_minute;} 15非模塊化設(shè)計(jì)的源代碼(續(xù))
//計(jì)算總費(fèi)用
total_fee=total_minute*0.45+extra_minute*0.15;
//輸出總費(fèi)用
cout<<"From"<<start_hour<<":"<<start_minute; cout<<"to"<<end_hour<<":"<<end_minute<<","; cout<<"Thetotalfeeis:"<<total_fee<<"\n";}}16非模塊化設(shè)計(jì)的不足及改進(jìn)上述解決方案沒有進(jìn)行模塊化設(shè)計(jì),所以程序重用的可能性很小,要擴(kuò)充也不容易為提高程序的可重用性,可將其中容易被重用的功能分離出來(lái),形成獨(dú)立的模塊上述程序的核心功能是根據(jù)不同時(shí)間段的計(jì)費(fèi)標(biāo)準(zhǔn)求每個(gè)起止時(shí)間的費(fèi)用。而上述程序還有輸入合法性檢查、計(jì)算兩個(gè)時(shí)間之間的分鐘數(shù)等與核心功能關(guān)系不密切的一些功能,這些功能被重用的機(jī)會(huì)比較大17非模塊化設(shè)計(jì)的不足及改進(jìn)(續(xù))進(jìn)一步思考程序哪些地方有需要擴(kuò)充的可能性改變時(shí)間段(可能性較大)根據(jù)需要增加一些收不同費(fèi)用的時(shí)間段改變時(shí)間段的費(fèi)用…將時(shí)間的計(jì)算精確到秒(可能性較?。?8使用函數(shù)作為模塊的設(shè)計(jì)
根據(jù)上述分析,可設(shè)計(jì)如下一些函數(shù):
//ROUTINE:check_time //FUNCTION:檢查時(shí)間是否合法
//PARAMETER:hour小時(shí),minute分鐘
//RETURN:如果合法則返回1,否則返回0
intcheck_time(inthour,intminute);
注:該函數(shù)被重用的機(jī)會(huì)較大,為保證其可重用性,該函數(shù)應(yīng)該只檢查具有通用性的合法性,即該函數(shù)只檢查小時(shí)hour是否在0到24之間。這里將合法性檢查分成兩部分,把與本問(wèn)題密切相關(guān)的合法性檢查(檢查hour是否在9到23之間)放在上層程序中進(jìn)行。19使用函數(shù)作為模塊的設(shè)計(jì)
(續(xù))//ROUTINE:calculate_minutes//FUNCTION:計(jì)算兩個(gè)時(shí)間之間的分鐘數(shù)//PARAMETER:start_hour,start_minute起始時(shí)間//(小時(shí)和分鐘)// end_hour,end_minute終止時(shí)間(小時(shí)和分鐘)//REQUIRE:起始時(shí)間和終止時(shí)間都合法//RETURN:返回兩個(gè)時(shí)間之間的分鐘數(shù),若起始時(shí)間大于終止時(shí)間則返回負(fù)數(shù)
intcalculate_minutes(intstart_hour,intstart_minute,intend_hour,intend_minute);
注:該函數(shù)被重用的機(jī)會(huì)較大20使用函數(shù)作為模塊的設(shè)計(jì)
(續(xù))//ROUTINE:get_minutes//FUNCTION:計(jì)算某個(gè)起止時(shí)間(由start_hour,start_minute//end_hour,end_minute確定)在某個(gè)時(shí)間段(由min_hour,//min_minute,max_hour,max_minute確定)中的分鐘數(shù)//PARAMETER:min_hour,min_minute時(shí)間段的最小時(shí)間(起始時(shí)間)// max_hour,max_minute時(shí)間段的最大時(shí)間(終止時(shí)間)// start_hour,start_minute待計(jì)算的起始時(shí)間// end_hour,end_minute待計(jì)算的終止時(shí)間
//REQUIRE:所有的時(shí)間都合法,且所有終止時(shí)間都大于相應(yīng)的起始時(shí)間//RETURN:返回計(jì)算出來(lái)的分鐘數(shù)。intget_minutes(intmin_hour,intmin_minute,intmax_hour,intmax_minute,intstart_hour,intstart_minute,intend_hour,intend_minute);21//程序:CALFEE2.CPP//功能:為某桌球城計(jì)算費(fèi)用(第二個(gè)版本,引入函數(shù)來(lái)實(shí)現(xiàn)所需的功能)#include<iostream.h>intcheck_time(inthour,intminute){ if(hour<0||hour>24)return0; if(hour==24&&minute!=0)return0; if(minute<0||minute>59)return0; return1;}intcalculate_minutes(intstart_hour,intstart_minute,intend_hour,intend_minute){ return(end_hour-start_hour)*60+end_minute-start_minute;}C++codes22intget_minutes(intmin_hour,intmin_minute,intmax_hour,intmax_minute, intstart_hour,intstart_minute,intend_hour,intend_minute){inttemp_s_hour,temp_s_minute;inttemp_e_hour,temp_e_minute;
//如果起始時(shí)間在時(shí)間段的終止時(shí)間之外(即沒有落在時(shí)間段中)返回0if(calculate_minutes(start_hour,start_minute,max_hour,max_minute)<=0) return0;
//如果終止時(shí)間在時(shí)間段的起始之前(同樣沒有落在時(shí)間段中)返回0if(calculate_minutes(min_hour,min_minute,end_hour,end_minute)<=0) return0;
//如果起始時(shí)間在時(shí)間段的起始時(shí)間之前,則從時(shí)間段的起始時(shí)間算起
if(calculate_minutes(start_hour,start_minute,min_hour,min_minute)>=0){ temp_s_hour=min_hour;temp_s_minute=min_minute;}else{
temp_s_hour=start_hour;temp_s_minute=start_minute;}minmaxstartend23
//如果終止時(shí)間在時(shí)間段的終止時(shí)間之后,則只算到時(shí)間段的終止時(shí)間
if(calculate_minutes(max_hour,max_minute,end_hour,end_minute)>=0){ temp_e_hour=max_hour;temp_e_minute=max_minute; }else{ temp_e_hour=end_hour;temp_e_minute=end_minute; }
returncalculate_minutes(temp_s_hour,temp_s_minute,temp_e_hour,temp_e_minute);}C++codes24intmain(){ intstart_hour,start_minute; intend_hour,end_minute; inttotal_minute; intextra_minute; floattotal_fee;
while(1){ cout<<"Pleaseinputthestarttime(suchas1220):"; cin>>start_hour>>start_minute; if(start_hour==0&&start_minute==0)return0; cout<<"Pleaseinputtheendtime:"; cin>>end_hour>>end_minute; if(check_time(start_hour,start_minute)==0){ cout<<"Thestarttimeiserror!\n"; continue; }
//額外的檢查(與本問(wèn)題密切相關(guān)的檢查)
if(start_hour<9||start_hour>=23){ cout<<"Thestarthouriserror!\n"; continue; } 25 if(check_time(end_hour,end_minute)==0){ cout<<"Theendtimeiserror!\n"; continue; }
//額外的檢查(與本問(wèn)題密切相關(guān)的檢查)
if(end_hour<9||end_hour>23){ cout<<"Theendhouriserror!\n"; continue; } if(end_hour==23&&end_minute>0){ cout<<"Theendtimeiserror!\n"; continue; } C++codes26 total_minute=calculate_minutes(start_hour,start_minute,end_hour,end_minute);
if(total_minute<0){ cout<<"Thestarttimeislaterthantheendtime!\n"; continue; }
//計(jì)算輸入的起止時(shí)間落在時(shí)間段18點(diǎn)到21點(diǎn)之間的分鐘數(shù)
extra_minute=get_minutes(18,0,21,0,start_hour,start_minute,end_hour,end_minute); total_fee=total_minute*0.45+extra_minute*0.15; cout<<"From"<<start_hour<<":"<<start_minute; cout<<"to"<<end_hour<<":"<<end_minute<<","; cout<<"Thetotalfeeis:"<<total_fee<<"\n";}}C++codes27使用函數(shù)作為模塊的設(shè)計(jì)
(續(xù))引入函數(shù)后,整個(gè)程序似乎更復(fù)雜了,但實(shí)際上主函數(shù)相對(duì)簡(jiǎn)單了在理解整個(gè)程序時(shí),可先理解主函數(shù),理解主函數(shù)時(shí)并不需要關(guān)心它調(diào)用的函數(shù)的實(shí)現(xiàn)細(xì)節(jié),只需要知道它調(diào)用的每個(gè)函數(shù)的功能即可;在理解主函數(shù)后,再研究每個(gè)函數(shù)的實(shí)現(xiàn)細(xì)節(jié)總體而言,該程序比上一個(gè)程序更好理解,可重用性和可擴(kuò)充性也更好
28使用函數(shù)模塊的不足之處函數(shù)的參數(shù)可能過(guò)于復(fù)雜(?)單個(gè)函數(shù)功能過(guò)于簡(jiǎn)單(?)代碼復(fù)用(?):你覺得怎樣?29使用類作為模塊的設(shè)計(jì)根據(jù)問(wèn)題的特征,容易想到使用時(shí)間類TIME,根據(jù)要求解的問(wèn)題可初步設(shè)計(jì)該類的界面為:
classTIME{public:
//ROUTINE:TIME //FUNCTION:構(gòu)造函數(shù),設(shè)置類中數(shù)據(jù)成員的初始值
//PARAMETER:hour,minute待設(shè)置時(shí)間的小時(shí)和分鐘,//如果其值不是合法的時(shí)間,則將小時(shí)和分鐘都置為0. //ENSURE:保證所設(shè)置的小時(shí)和分鐘是合法的
TIME(inthour=0,intminute=0);30使用類作為模塊的設(shè)計(jì)(續(xù))
//ROUTINE:set_time//FUNCTION:因?yàn)槭褂脴?gòu)造函數(shù)設(shè)置小時(shí)和分鐘不能
//報(bào)告?zhèn)魅氲膮?shù)是否合法,所以提供本函數(shù)設(shè)置小
//時(shí)和分鐘,以便報(bào)告參數(shù)的合法性。
//PARAMETER:hour,minute待設(shè)置時(shí)間的小時(shí)和分鐘。
//ENSURE:保證所設(shè)置的小時(shí)和分鐘是合法的
//RETURN:如果傳入的小時(shí)和分鐘是合法的時(shí)間
//則返回1,否則返回0 intset_time(inthour,intminute);31使用類作為模塊的設(shè)計(jì)(續(xù))
//ROUTINE:calculate_minutes //FUNCTION:計(jì)算從起始時(shí)間start到當(dāng)前對(duì)象
//所代表時(shí)間之間的分鐘數(shù)
//PARAMETER:start起始時(shí)間
//RETURN:兩個(gè)時(shí)間之間的分鐘數(shù),若起始時(shí)
//間大于終止時(shí)間則返回負(fù)數(shù)
intcalculate_minutes(constTIME&start);32使用類作為模塊的設(shè)計(jì)(續(xù)) private:
//ROUTINE:check_time //FUNCTION:檢查時(shí)間是否合法,用戶使用的TIME類對(duì)象
//都要保證是合法時(shí)間,因此將檢查時(shí)間是否合法的功能設(shè)
//計(jì)為私有,只在TIME類自己的函數(shù)set_value()中調(diào)用,
//保證所設(shè)置的時(shí)間合法。上層程序可通過(guò)檢查是否設(shè)置
//時(shí)間成功而進(jìn)行判斷。
//PARAMETER:hour小時(shí),minute分鐘
//RETURN:如果合法則返回1,否則返回0 intcheck_time(inthour,intminute); inthour,minute; //當(dāng)前對(duì)象所代表的小時(shí)和分鐘。};33使用類作為模塊的設(shè)計(jì)(續(xù))計(jì)算某個(gè)起止時(shí)間在某個(gè)時(shí)間段中分鐘數(shù)的函數(shù)get_minutes()很難看成是某個(gè)“時(shí)間”的行為,而應(yīng)作為“時(shí)間段”這樣的對(duì)象上的操作。因此不將它設(shè)計(jì)為時(shí)間類TIME的成員函數(shù),仍使用游離函數(shù)實(shí)現(xiàn)這項(xiàng)功能,該函數(shù)的界面如下:
//ROUTINE:get_minutes//FUNCTION:計(jì)算某個(gè)起止時(shí)間(由start和end確定)在某個(gè)時(shí)
//間段(由min和max確定)中的分鐘數(shù)
//PARAMETER:min時(shí)間段的最小時(shí)間、max時(shí)間段的最大時(shí)間
//start待計(jì)算的起始時(shí)間、end待計(jì)算的終止時(shí)間
//REQUIRE:所有終止時(shí)間都大于相應(yīng)的起始時(shí)間
//RETURN:返回計(jì)算出來(lái)的分鐘數(shù)。
intget_minutes(constTIME&min,constTIME&max,constTIME&start,constTIME&end);34使用類作為模塊的設(shè)計(jì)(續(xù))為支持判斷一個(gè)時(shí)間是否在另一時(shí)間之后,在類TIME中增加如下成員函數(shù):
//ROUTINE:is_later_than//FUNCTION:判斷當(dāng)前對(duì)象所代表的時(shí)間是否
//在時(shí)間start之后。
//PARAMETER:start所比較的起始時(shí)間
//RETURN:如果當(dāng)前對(duì)象所代表的時(shí)間在時(shí)間
//start之后返回1,否則返回0.intis_later_than(constTIME&start);35使用類作為模塊的設(shè)計(jì)(續(xù))為了檢查時(shí)間是否在某個(gè)特定的范圍內(nèi),可將時(shí)間應(yīng)滿足的范圍也作為類TIME的屬性之一,因此為類TIME增加如下數(shù)據(jù)成員:
intmin_hour,min_minute; //時(shí)間范圍的最小時(shí)間
intmax_hour,max_minute; //時(shí)間范圍的最大時(shí)間36使用類作為模塊的設(shè)計(jì)(續(xù))同時(shí)要增加成員函數(shù),設(shè)置時(shí)間應(yīng)滿足的范圍:
//ROUTINE:set_range//FUNCTION:設(shè)置時(shí)間應(yīng)該滿足的范圍
//PARAMETER:min_hour,min_minute時(shí)間范圍的最小時(shí)間
// max_hour,max_minute時(shí)間范圍的最大時(shí)間
//RETURN:如果設(shè)置成功則返回1,否則返回0.intset_range(intmin_hour,intmin_minute,intmax_hour,intmax_minute);在設(shè)置時(shí)間范圍時(shí)應(yīng)檢查所設(shè)置的范圍是否正確,包括所傳入的最小時(shí)間和最大時(shí)間是否合法所傳入的最小時(shí)間是否小于最大時(shí)間時(shí)間范圍是否在0點(diǎn)到24點(diǎn)之間…37//程序:CALFEE3.H//功能:為某桌球城計(jì)算費(fèi)用(第三個(gè)版本,引入類來(lái)實(shí)現(xiàn)所需的功能)classTIME{public:TIME(int=0,int=0);
intset_range(intmin_hour,intmin_minute,intmax_hour,intmax_minute);intset_time(inthour,intminute);intget_hour()const;intget_minutes()const;intcalculate_minutes(constTIME&start)const;intis_later_than(constTIME&start)const;private:intcheck(inthour,intminute)const;intcalculate(intstart_hour,intstart_minute,intend_hour,intend_minute)const;inthour,minute;intmax_hour,max_minute;intmin_hour,min_minute;};C++codes38//程序:CALFEE3.CPP//功能:為某桌球城計(jì)算費(fèi)用(第三個(gè)版本,引入類來(lái)實(shí)現(xiàn)所需的功能)#include<iostream.h>#include“CALFEE3.H”TIME::TIME(inthour,intminute){ set_range(0,0,24,0); if(check(hour,minute)==0){ hour=0;minute=0; } TIME::hour=hour;TIME::minute=minute;} C++codes39intTIME::
set_range(intmin_hour,intmin_minute,intmax_hour,intmax_minute){if(calculate(0,0,min_hour,min_minute)<0)return0;if(calculate(0,0,max_hour,max_minute)<0)return0;if(calculate(min_hour,min_minute,24,0)<0)return0;if(calculate(max_hour,max_minute,24,0)<0)return0;if(min_minute<0||min_minute>59)return0;if(max_minute<0||max_minute>59)return0;if(calculate(min_hour,min_minute,max_hour,max_minute)<=0) return0;TIME::min_hour=min_hour;TIME::min_minute=min_minute;TIME::max_hour=max_hour;TIME::max_minute=max_minute;return1;}C++codes40 intTIME::set_time(inthour,intminute) { if(check(hour,minute)==0)return0; TIME::hour=hour;TIME::minute=minute; return1; } intTIME::get_hour()const { returnhour; } intTIME::get_minutes()const { returnminute; }C++codes41intTIME::calculate_minutes(constTIME&start)const{returncalculate(start.hour,start.minute,hour,minute);}
intTIME::is_later_than(constTIME&start)const{if(calculate(start.hour,start.minute,hour,minute)>=0)return1;elsereturn0;}intTIME::
check(inthour,intminute)const{ if(minute<0||minute>59)return0; if(calculate(min_hour,min_minute,hour,minute)<0)return0; if(calculate(hour,minute,max_hour,max_minute)<0)return0; return1;} C++codes42intTIME::calculate(intstart_hour,intstart_minute,intend_hour,intend_minute)const{ return(end_hour-start_hour)*60+end_minute-start_minute;}
C++codes43intget_minutes(constTIME&min,constTIME&max,constTIME&start,constTIME&end){ TIMEtemp_start,temp_end; if(start.is_later_than(max))return0; if(min.is_later_than(end))return0; if(start.is_later_than(min))temp_start=start; elsetemp_start=min; if(end.is_later_than(max))temp_end=max; elsetemp_end=end; returntemp_end.calculate_minutes(temp_start);}C++codes44#include“CALFEE3.H”intmain(){ inthour,minute; TIMEstart,end; TIMEmin(18,0),max(21,0); inttotal_minute; intextra_minute; floattotal_fee; start.set_range(9,0,23,0); end.set_range(9,0,23,0); while(1){ //輸入起止時(shí)間
cout<<"Pleaseinputthestarttime(suchas1220):"; cin>>hour>>minute; C++codes45 if(hour==0&&minute==0)return0; if(start.set_time(hour,minute)==0){ cout<<"Thestarttimeiserror!\n"; continue; } cout<<"Pleaseinputtheendtime:"; cin>>hour>>minute; if(end.set_time(hour,minute)==0){ cout<<"Theendtimeiserror!\n"; continue; } total_minute=end.calculate_minutes(start); C++codes46 if(total_minute<0){ cout<<"Thestarttimeislaterthantheendtime!\n"; continue; } extra_minute=get_minutes(min,max,start,end); total_fee=total_minute*0.45+extra_minute*0.15; cout<<"From"<<start.get_hour()<<":"<<start.get_minutes(); cout<<"to"<<end.get_hour()<<":“<<end.get_minutes()<<","; cout<<"Thetotalfeeis:"<<total_fee<<"\n";}}C++codes47小結(jié)非模塊化設(shè)計(jì)->使用函數(shù)作為模塊->使用類作為模塊。得到的程序似乎越來(lái)越復(fù)雜,但其結(jié)構(gòu)卻是越來(lái)越清晰、越來(lái)越容易理解這種可理解性是指在不同層次的理解,通過(guò)引入函數(shù),特別是引入類,將程序結(jié)構(gòu)劃分成不同層次,每個(gè)層次上都更好理解,整個(gè)程序的結(jié)構(gòu)也更為清晰使用面向?qū)ο笏枷朐O(shè)計(jì)的程序具有更強(qiáng)的重用性和擴(kuò)充性
48關(guān)于面向?qū)ο蟪绦蛟O(shè)計(jì)的若干基本問(wèn)題面向?qū)ο蟪绦蛟O(shè)計(jì)是一種理念(idea):思維和方法論的問(wèn)題。是某種語(yǔ)言里面支持面對(duì)對(duì)象的具體機(jī)制:程序語(yǔ)言的運(yùn)用問(wèn)題
----(類和對(duì)象、繼承、多態(tài)性和模板等)。49抽象生活在這個(gè)復(fù)雜的世界中,我們經(jīng)常會(huì)借助“抽象”來(lái)理解或解決很多事物。
50抽象數(shù)據(jù)抽象:只關(guān)心該數(shù)據(jù)“是什么”,而不關(guān)心它是如何運(yùn)作的。行為抽象:只關(guān)心這個(gè)行為能夠?yàn)槲覀儙?lái)什么,而不關(guān)心這個(gè)行為的具體實(shí)現(xiàn)方法。51抽象在軟件設(shè)計(jì)中,抽象早已證明是開發(fā)和管理大型復(fù)雜項(xiàng)目的絕對(duì)“必需品”。例如下面的計(jì)算就是用到了抽象:
y=sin(x)+sqrt(x)
;函數(shù)調(diào)用就是一種行為抽象:我們只關(guān)心個(gè)函數(shù)的功能,所以在決定是否使用它們以及使用的時(shí)候都只依賴于這函數(shù)的接口,整個(gè)過(guò)程中無(wú)需知曉它們內(nèi)部的具體實(shí)現(xiàn)。52抽象用戶:抽象是用戶的“權(quán)利”。設(shè)計(jì)者:必須關(guān)注內(nèi)部實(shí)現(xiàn)。被抽象的對(duì)象本身:必須具備說(shuō)明部分用以向用戶說(shuō)明自身,以及具備具體的實(shí)現(xiàn)部分。53抽象數(shù)據(jù)類型(AbstractDataType,ADT)在程序設(shè)計(jì)中,對(duì)于被抽象的數(shù)據(jù),稱為抽象數(shù)據(jù)類型(AbstractDataType,ADT)。一種ADT應(yīng)具有(1)說(shuō)明部分(說(shuō)明該ADT是什么):說(shuō)明部分描述數(shù)據(jù)值的特性和作用于這些數(shù)據(jù)之上的操作。ADT的用戶僅須明白這些說(shuō)明,而無(wú)須知曉其內(nèi)部實(shí)現(xiàn)。(2)實(shí)現(xiàn)部分。54抽象數(shù)據(jù)類型時(shí)間類型類型時(shí)間數(shù)據(jù)每個(gè)日期的值都是時(shí)、分操作設(shè)置時(shí)間獲取時(shí)間設(shè)置時(shí)間段比較兩時(shí)間為了實(shí)現(xiàn)一個(gè)ADT,應(yīng)該:1)為這種ADT選擇具體的
數(shù)據(jù)表達(dá);2)實(shí)現(xiàn)每種操作。inthourminute;set()gethour()Getminute()setRange()isLaterThan()55數(shù)據(jù)封裝與隱藏時(shí)、分這些內(nèi)部數(shù)據(jù)被隱藏在模塊中(這里的模塊是文件TIME.cpp),客戶程序只能通過(guò)該模塊提供的公開操作來(lái)訪問(wèn)這些數(shù)據(jù),而不能直接訪問(wèn)這些數(shù)據(jù)。這種保護(hù)措施稱為信息隱藏(InformationHiding)把這這些數(shù)據(jù)與相關(guān)操作組織在一起的方式稱為封裝(Encapsulation)。56數(shù)據(jù)封裝與隱藏客戶程序:只關(guān)心TIME能夠提供那些公開的操作(即提供了哪些函數(shù)可調(diào)用),并不關(guān)心這些操作的具體實(shí)現(xiàn)。也就是說(shuō),用戶只關(guān)心TIME能“做什么”,而不關(guān)心它內(nèi)部“如何做”。封裝就是實(shí)現(xiàn)ADT的策略,而信息隱藏則是ADT的特點(diǎn)。信息隱藏和封裝是軟件開發(fā)的必要技術(shù),亦具商業(yè)價(jià)值。57術(shù)語(yǔ)ADT類對(duì)象抽象抽象具體具體實(shí)例58類與對(duì)象概述類:描述實(shí)體的抽象概念。描述一群實(shí)體的共同結(jié)構(gòu)對(duì)象:對(duì)應(yīng)于單個(gè)的具體實(shí)體。在程序中模擬實(shí)體。59類與對(duì)象概述類背后蘊(yùn)涵的基本思想是數(shù)據(jù)抽象和封裝數(shù)據(jù)抽象是一種依賴于接口和實(shí)現(xiàn)分離的設(shè)計(jì)和編程技術(shù)類設(shè)計(jì)者必須關(guān)心類是如何實(shí)現(xiàn)的類的使用者不必了解類的實(shí)現(xiàn)細(xì)節(jié)。相反,使用某個(gè)類的程序員僅需了解類的接口,他們可以抽象地考慮該類做什么,而不必具體地考慮該類如何工作60類與對(duì)象概述封裝是一種將低級(jí)元素結(jié)合起來(lái)形成新的、高級(jí)實(shí)體的技術(shù)函數(shù)是封裝的一種形式函數(shù)所執(zhí)行的細(xì)節(jié)行為被封裝在函數(shù)本身這個(gè)更大的實(shí)體中被封裝的元素隱藏了它們的實(shí)現(xiàn)細(xì)節(jié)——我們可以調(diào)用一個(gè)函數(shù)但不能訪問(wèn)它所執(zhí)行的語(yǔ)句類也是一個(gè)封裝實(shí)體:它代表若干成員的聚集,大多數(shù)設(shè)計(jì)良好的類隱藏了實(shí)現(xiàn)該類的成員61為什么要使用類?作為模塊,類是函數(shù)的擴(kuò)充函數(shù)的引入是模塊化思想在程序設(shè)計(jì)中的運(yùn)用,而類的引入是模塊化思想在程序設(shè)計(jì)中的進(jìn)一步應(yīng)用函數(shù)作為模塊,功能單一且函數(shù)之間只靠參數(shù)傳遞數(shù)據(jù),因此粒度過(guò)小而不能很好地貫徹模塊化思想類的引入將處理同樣數(shù)據(jù)的函數(shù)封裝在一起,提高模塊的粒度;模塊之間的關(guān)系(即類之間的關(guān)系)可通過(guò)類的界面更明確地表示,從而系統(tǒng)的結(jié)構(gòu)更為清晰;類具有比函數(shù)強(qiáng)的功能,重用的機(jī)會(huì)也比函數(shù)高62為什么要使用類?(續(xù))作為類型,類是基本數(shù)據(jù)類型的擴(kuò)充,通過(guò)明確類的可用操作而為類型提供更為豐富的語(yǔ)義類的實(shí)例(即對(duì)象)是現(xiàn)實(shí)世界實(shí)體的模擬,通過(guò)使用類可使得解決問(wèn)題的程序空間與問(wèn)題空間在結(jié)構(gòu)上一致,從而整個(gè)軟件系統(tǒng)的結(jié)構(gòu)更加容易理解。63數(shù)據(jù)vs.操作數(shù)據(jù)操作操作2()操作3()操作1()數(shù)據(jù)(ADT)操作1操作2操作3數(shù)據(jù)(a)(b)64數(shù)據(jù)vs.操作數(shù)據(jù)與操作“主動(dòng)與被動(dòng)”的關(guān)系反映出人類思考問(wèn)題、尋求解決方案的兩大思路:面向過(guò)程的思考方式面向?qū)ο蟮乃伎挤绞剿伎挤绞讲煌蜁?huì)導(dǎo)致算法結(jié)構(gòu)不同,從而最終導(dǎo)致程序的不同。65面向過(guò)程設(shè)計(jì)也稱為:功能分解(functionaldecomposition)結(jié)構(gòu)化程序設(shè)計(jì)(structureddesign)模塊化編程(modularprogramming)自上而下逐步求精(top-downdesign,stepwiserefinement)。66步驟1步驟2步驟D步驟E步驟F步驟G步驟H步驟a步驟b步驟3步驟4步驟B步驟C步驟5步驟6子問(wèn)題I步驟A子問(wèn)題II子問(wèn)題III步驟I步驟II步驟III子問(wèn)題1子問(wèn)題2子問(wèn)題3子問(wèn)題6子問(wèn)題C第0層第1層第2層第3層抽象具體解決這個(gè)問(wèn)題面向過(guò)程設(shè)計(jì)67面向過(guò)程設(shè)計(jì)步驟1:輸入日期步驟2:計(jì)算該日期是當(dāng)年第幾天步驟1:判斷子問(wèn)題:計(jì)算該日期是當(dāng)年第幾天cin>>yr>>mo>>day;num=Calulate(yr,mo,day);if(num...){...}intCalulate(...){...}函數(shù):Calulate68面向過(guò)程設(shè)計(jì)在構(gòu)建大型軟件系統(tǒng)時(shí),面向過(guò)程的設(shè)計(jì)往往導(dǎo)致程序有兩大致命缺陷:導(dǎo)致程序結(jié)構(gòu)不靈活。若高層算法需要修改,那么可能底層的算法也因此需要修改。導(dǎo)致代碼難以復(fù)用。69面向?qū)ο蟮某绦蛟O(shè)計(jì)面向?qū)ο蟮某绦蛟O(shè)計(jì)(objectorienteddesign,OOD)已被證明是開發(fā)和維護(hù)大型軟件的更好的設(shè)計(jì)方式,它在程序結(jié)構(gòu)、代碼復(fù)用、封裝隱藏等方面,有著面向過(guò)程設(shè)計(jì)難以企及的優(yōu)勢(shì)。70面向?qū)ο蟮某绦蛟O(shè)計(jì)Q:什么是對(duì)象?A:一般說(shuō)來(lái),任何事物都可以看成對(duì)象。我們要考察或研究現(xiàn)實(shí)或思維世界中的某個(gè)實(shí)體,那么它就成為我們的對(duì)象。Q:OOD把問(wèn)題視作什么?A:是把問(wèn)題視作各類實(shí)體(對(duì)象)的組合。Q:它關(guān)注對(duì)象的什么?A:它關(guān)注對(duì)象中包含的數(shù)據(jù)及作用于這些數(shù)據(jù)之上的操作,也需要關(guān)注對(duì)象之間的關(guān)系和相互作用。
71類與對(duì)象概述面向?qū)ο蟪绦蛟O(shè)計(jì)的基本步驟:標(biāo)識(shí)類與對(duì)象,即求解問(wèn)題時(shí)需要設(shè)計(jì)哪些類確定類與類之間關(guān)系設(shè)計(jì)類的界面并實(shí)現(xiàn),類的界面由類與類之間的關(guān)系確定
類的引入是使用C++語(yǔ)言進(jìn)行面向?qū)ο蟪绦蛟O(shè)計(jì)的基礎(chǔ),學(xué)習(xí)C++語(yǔ)言,不僅要知道有關(guān)類的語(yǔ)法,更重要的是要掌握如何在實(shí)際編程時(shí)引入類和設(shè)計(jì)類的界面72面向?qū)ο蟮某绦蛟O(shè)計(jì)Q:如何確認(rèn)問(wèn)題中的對(duì)象?一般來(lái)說(shuō),我們需要在問(wèn)題域中尋求對(duì)象,即仔細(xì)研究問(wèn)題的定義,從中搜索各重要的名詞和動(dòng)詞。名詞很可能就是對(duì)象,而動(dòng)詞可能就是對(duì)象的操作。73面向?qū)ο蟮某绦蛟O(shè)計(jì)下面給出問(wèn)題的一部分:“。。。。。。程序必須解決學(xué)生的圖書館帳戶。允許學(xué)生通過(guò)帳戶借書、還書,允許學(xué)生往帳戶中存錢,逾期罰款從帳戶中扣除。。。。?!敝匾~:學(xué)生帳戶重要?jiǎng)釉~:借書、還書、存款、扣除這個(gè)問(wèn)題可能存在兩類對(duì)象:學(xué)生student和帳戶account。account的數(shù)據(jù)屬性應(yīng)該包括:借書信息、余額、每次存款、?。P)款的時(shí)間等。操作應(yīng)該包括借書BorrowBooks、還書ReturnBooks、存錢Deposit、罰款Fine。student應(yīng)該有哪些數(shù)據(jù)和操作,需要這個(gè)問(wèn)題的更多信息才能確定。74類有多少種?與待求解問(wèn)題相關(guān)的類。這些類的對(duì)象用于模擬現(xiàn)實(shí)世界中的實(shí)體。程序所要實(shí)現(xiàn)的功能主要由這些類的對(duì)象之間進(jìn)行消息傳遞而完成,是反映現(xiàn)實(shí)和思維世界中的事物或概念的對(duì)象。例如“房子”、“銀行帳號(hào)”、“納稅人”、“計(jì)數(shù)器”等;與計(jì)算機(jī)有關(guān)的類。包括與用戶界面有關(guān)的類、與操作系統(tǒng)進(jìn)行交互的類、與數(shù)據(jù)庫(kù)管理系統(tǒng)進(jìn)行交互的類,等等。75面向?qū)ο蟮某绦蛟O(shè)計(jì)對(duì)于第[1]類的對(duì)象,要將其翻譯為程序算法中的對(duì)象(即確定其數(shù)據(jù)和操作),往往會(huì)發(fā)生劇烈的變異。雖然有一些抽象概念是有確切的物質(zhì)形態(tài)與之相對(duì)應(yīng),但往往我們要轉(zhuǎn)化的仍是這些抽象概念。有一些對(duì)象確實(shí)存在于物質(zhì)世界中,但如果要轉(zhuǎn)化為程序中的對(duì)象,就要抽取我們需要的屬性。運(yùn)用面向?qū)ο髸r(shí),人類思維的往往需要跳躍式突變,很多時(shí)候絕無(wú)面向過(guò)程中的“自然而然”。這也是初學(xué)者感到困難的地方。76面向?qū)ο蟮某绦蛟O(shè)計(jì)模擬現(xiàn)實(shí)世界或思維世界,不能奴隸式的追隨我們之所見;而是需要有洞察力,用思維的力量直達(dá)對(duì)象的本質(zhì),才能確定對(duì)象及其操作。不斷實(shí)踐,是提高面向?qū)ο蟪绦蛟O(shè)計(jì)能力的唯一途徑。77面向過(guò)程vs.面向?qū)ο蟪绦蚝瘮?shù)函數(shù)函數(shù)程序?qū)ο髮?duì)象對(duì)象操作數(shù)據(jù)操作數(shù)據(jù)操作數(shù)據(jù)(a)(b)78類的定義一般形式:class類名{public:
公有數(shù)據(jù)和函數(shù)
private:
私有數(shù)據(jù)和函數(shù)};79類成員的分類
從語(yǔ)法形式上可分為數(shù)據(jù)成員和成員函數(shù)
從訪問(wèn)控制角度可分為私有成員、受保護(hù)成員與公有成員
從對(duì)象存儲(chǔ)角度可分為靜態(tài)成員和非靜態(tài)成員以及常量成員與非常量成員
80類作用域由聲明類時(shí)所使用的“{”和“}”形成類作用域范圍包括類定義中左右花括號(hào)括住的部分,以及寫在類定義外面的所有成員函數(shù)的實(shí)現(xiàn)體在類作用域中聲明的標(biāo)識(shí)符只在該類中可見,且其作用域與該標(biāo)識(shí)符聲明的次序無(wú)關(guān)(如類中有兩成員函數(shù)fun1()和fun2(),無(wú)論那個(gè)在前申明,在類的實(shí)現(xiàn)中均可相互調(diào)用)
81類成員的訪問(wèn)控制
訪問(wèn)控制是指在類作用域以外能否訪問(wèn)類的成員C++語(yǔ)言規(guī)定,類作用域以外只能訪問(wèn)類的公有成員,不能訪問(wèn)類的私有成員和受保護(hù)成員,不過(guò)類的受保護(hù)成員可由類的后代類在一定的繼承訪問(wèn)控制方式下訪問(wèn)82類的界面與類的實(shí)現(xiàn)類的界面(interface)不包括類成員函數(shù)實(shí)現(xiàn),只有成員函數(shù)原型的類定義包括數(shù)據(jù)成員、成員函數(shù)的原型類的實(shí)現(xiàn)(implementation)各成員函數(shù)的實(shí)現(xiàn)的總稱包括成員函數(shù)的定義一般用文件將類的界面與實(shí)現(xiàn)分離界面文件(specificationfile):.h或.hpp實(shí)現(xiàn)文件(implementationfile):.cpp83//C.hclassC{
數(shù)據(jù)成員與函數(shù)成員的聲明}整體框架//client.cpp#include“C.h”
intmain(){Cobj;obj.func2();...}//C.cpp#include“C.h”intC::fun1(){
函數(shù)成員的實(shí)現(xiàn)}intC::fun2(){...}...類C84對(duì)象的創(chuàng)建、使用與撤銷對(duì)象(object):具有類類型的變量,又稱為類的實(shí)例(instance)程序運(yùn)行時(shí),通過(guò)為對(duì)象分配存儲(chǔ)空間來(lái)創(chuàng)建對(duì)象每個(gè)對(duì)象占據(jù)內(nèi)存的不同區(qū)域,保存不同的數(shù)據(jù),但操作數(shù)據(jù)的代碼相同可用成員選擇運(yùn)算符“.”使用對(duì)象的public成員調(diào)用對(duì)象的成員函數(shù)時(shí),成員函數(shù)代碼中所引用的類成員指的是對(duì)象實(shí)例中的成員
85對(duì)象的創(chuàng)建、使用與撤銷(續(xù))創(chuàng)建對(duì)象時(shí),系統(tǒng)自動(dòng)調(diào)用構(gòu)造函數(shù),完成對(duì)象的初始化對(duì)象生存期由對(duì)象的聲明決定(與變量類似),對(duì)象生存期結(jié)束時(shí),撤銷對(duì)象撤銷對(duì)象時(shí),系統(tǒng)自動(dòng)調(diào)用析構(gòu)函數(shù),執(zhí)行一些收尾任務(wù)(如,動(dòng)態(tài)分配內(nèi)存的回收)對(duì)象中各個(gè)數(shù)據(jù)成員的生存期由對(duì)象的生存期決定86構(gòu)造函數(shù)函數(shù)名與類名相同,且不能指定返回值類型在創(chuàng)建新對(duì)象時(shí)由系統(tǒng)自動(dòng)調(diào)用構(gòu)造函數(shù)對(duì)對(duì)象進(jìn)行初始化,可在其中約束初始值的合理范圍
全局對(duì)象的構(gòu)造函數(shù)在main()函數(shù)執(zhí)行之前被調(diào)用局部靜態(tài)對(duì)象的構(gòu)造函數(shù)當(dāng)程序第一次執(zhí)行到相應(yīng)的聲明(定義)語(yǔ)句時(shí)被調(diào)用
87析構(gòu)函數(shù)函數(shù)名字為在類名前加“~”不能指定返回值類型無(wú)形式參數(shù)在對(duì)象生存期結(jié)束時(shí)由系統(tǒng)自動(dòng)調(diào)用
88//程序:CON_DESDEMO.CPP//功能:演示對(duì)象的創(chuàng)建與撤銷(構(gòu)造函數(shù)與析構(gòu)函數(shù)的調(diào)用)#include<iostream.h>classDEMO_CLASS{public: DEMO_CLASS(inti); ~DEMO_CLASS();private: intvalue;};DEMO_CLASS::DEMO_CLASS(inti){ cout<<"Initialvalueis"<<i<<"\n"; value=i; return;}構(gòu)造函數(shù)、析構(gòu)函數(shù)例子89DEMO_CLASS::~DEMO_CLASS(){ cout<<“Destroyobject(“<<value<<")!\n"; return;}DEMO_CLASSobj1(10);//聲明一個(gè)全局對(duì)象intmain(){ cout<<"Thisisthebeginningofmain()“<<endl; staticDEMO_CLASSobj2(20); //聲明一個(gè)局部靜態(tài)對(duì)象
DEMO_CLASSobj3(30); //聲明一個(gè)局部自動(dòng)對(duì)象
DEMO_CLASSobj4(40); cout<<"Thisistheendofmain().\n"; return0;}構(gòu)造函數(shù)、析構(gòu)函數(shù)例子90程序輸出Initialvalueis10Thisisthebeginningofmain()Initialvalueis20Initialvalueis30Initialvalueis40Thisistheendofmain().Destroyobject(40)!Destroyobject(30)!Destroyobject(20)!Destroyobject(10)!注:析構(gòu)函數(shù)在main函數(shù)return0后執(zhí)行,單步跟蹤可顯示部分執(zhí)行痕跡91類的靜態(tài)成員(例子)classDATE{public: voidSet(intnewMonth,intnewDay,intnewYear); intgetMonth()const; intgetDay()const; intgetYear()const; voidPrint()const; voidIncrement(); voidDecrement();
staticvoidgetCount();private:intmonth;intday;intyear;
staticcount;};92對(duì)象的存儲(chǔ)
DATEdate1,date2;//聲明兩個(gè)DATE的對(duì)象
yearmonthdaySet()getMonth()getDay()getYear()Print()Increment()Decrement()Set()代碼getMonth()代碼getDay()代碼getYear()代碼Print()代碼Increment()代碼Decrement()代碼yearmonthdaySet()getMonth()getDay()getYear()Print()Increment()Decrement()對(duì)象date1對(duì)象date2類DATE共用區(qū)getCount()代碼變量count93類的靜態(tài)成員靜態(tài)(static)成員是類的組成部分但不是任何對(duì)象的組成部分通過(guò)在成員聲明前加上保留字static將成員設(shè)為static(在數(shù)據(jù)成員的類型前加保留字static聲明靜態(tài)數(shù)據(jù)成員;在成員函數(shù)的返回類型前加保留字static聲明靜態(tài)成員函數(shù))static成員遵循正常的公有/私有訪問(wèn)規(guī)則。C++程序中,如果訪問(wèn)控制允許的話,可在類作用域外直接(不通過(guò)對(duì)象)訪問(wèn)靜態(tài)成員(需加上類名和::)94類的靜態(tài)成員(續(xù))靜態(tài)數(shù)據(jù)成員具有靜態(tài)生存期,是類的所有對(duì)象共享的存儲(chǔ)空間,是整個(gè)類的所有對(duì)象的屬性,而不是某個(gè)對(duì)象的屬性與非靜態(tài)數(shù)據(jù)成員不同,靜態(tài)數(shù)據(jù)成員不是通過(guò)構(gòu)造函數(shù)進(jìn)行初始化,而是必須在類定義體的外部再定義一次,且恰好一次,通常是在類的實(shí)現(xiàn)文件中再聲明一次,而且此時(shí)不能再用static修飾95類的靜態(tài)成員(續(xù))靜態(tài)成員函數(shù)不屬于任何對(duì)象靜態(tài)成員函數(shù)沒有this指針靜態(tài)成員函數(shù)不能直接訪問(wèn)類的非靜態(tài)數(shù)據(jù)成員,只能直接訪問(wèn)類的靜態(tài)數(shù)據(jù)成員96//date.hinterfacefunctionshere
classDATE{public: …
staticvoidgetCount();
…private:
…
staticcount;
…};//date.cppdefineandinitializestaticclassmemberintDATE::count=0;voidDATE::getCount(){ cout<<"Thereare"<<count<<"objectsnow"<<endl;}類的靜態(tài)成員97類的靜態(tài)成員(續(xù))靜態(tài)成員的用途:1.用來(lái)保存對(duì)象的個(gè)數(shù)。2.作為一個(gè)標(biāo)記,標(biāo)記一些動(dòng)作是否發(fā)生,比如:文件的打開狀態(tài),打印機(jī)的使用狀態(tài)等。3.存儲(chǔ)鏈表的第一個(gè)或者最后一個(gè)成員的內(nèi)存地址。
/pcedu/empolder/gj/c/0503/571606_1.html靜態(tài)成員的用途:1.用來(lái)保存對(duì)象的個(gè)數(shù)。2.作為一個(gè)標(biāo)記,標(biāo)記一些動(dòng)作是否發(fā)生,比如:文件的打開狀態(tài),打印機(jī)的使用狀態(tài)等。3.存儲(chǔ)鏈表的第一個(gè)或者最后一個(gè)成員的內(nèi)存地址。
/pcedu/empolder/gj/c/0503/571606_1.html靜態(tài)成員的用途:1.用來(lái)保存對(duì)象的個(gè)數(shù)。2.作為一個(gè)標(biāo)記,標(biāo)記一些動(dòng)作是否發(fā)生,比如:文件的打開狀態(tài),打印機(jī)的使用狀態(tài)等。3.存儲(chǔ)鏈表的第一個(gè)或者最后一個(gè)成員的內(nèi)存地址。
/pcedu/empolder/gj/c/0503/571606_1.html98初始化成員列表在以下三種情況下需要使用初始化成員列表:需要初始化引用成員數(shù)據(jù)(注:C++可以定義引用類型的成員變量);需要初始化const修飾的類成員;需要初始化的數(shù)據(jù)成員是對(duì)象的情況;99初始化引用成員數(shù)據(jù)#include<iostream>usingnamespacestd;classTest{private:int&a;public:Test(int&b):a(b)
{
}voidModify(intvalue)
{a=value;
}};intmain(){intb=3;Testtest(b);cout<<"b="<<b<<endl;test.Modify(4);cout<<"b="<<b<<endl;system("pause");return0;}100類的常量成員常量數(shù)據(jù)成員的聲明與符號(hào)常量(命名常量)的聲明類似常量數(shù)據(jù)成員是對(duì)象的數(shù)據(jù)成員,不能在聲明時(shí)初始化,且常量一旦聲明之后就不能再作為左值,所以只能在構(gòu)造函數(shù)的初始化列表中對(duì)常量數(shù)據(jù)成員進(jìn)行初始化常量成員函數(shù)通過(guò)在成員函數(shù)的參數(shù)表后面加保留字const聲明,如果成員函數(shù)的原型與實(shí)現(xiàn)是分開的,那么在原型與實(shí)現(xiàn)兩個(gè)地方都要給出保留字const常量成員函數(shù)不能修改類的數(shù)據(jù)成員(即,調(diào)用常量成員函數(shù)不會(huì)改變對(duì)象的狀態(tài)),否則,將產(chǎn)生編譯錯(cuò)誤。常量成員函數(shù)常用于獲取類的數(shù)據(jù)成員的值101類的常量成員#include<iostream>usingnamespacestd;classbase{public:constinta;int&b;public://base(intm,intn)//{a=
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工程項(xiàng)目投標(biāo)管理制度
- 荷葉母親獲獎(jiǎng)
- 人教部編版四年級(jí)語(yǔ)文上冊(cè)第15課《女媧補(bǔ)天》精美課件
- 2024年福建客運(yùn)資格證節(jié)能駕駛題庫(kù)50
- 算法設(shè)計(jì)與分析 課件 5.2-動(dòng)態(tài)規(guī)劃引例2-數(shù)字三角形問(wèn)題
- 2024年鹽城道路旅客運(yùn)輸從業(yè)資格證模擬考試
- 2024年白城道路旅客運(yùn)輸從業(yè)資格證模擬考試
- 2024年西寧客運(yùn)從業(yè)資格證考什么題目
- 2024年內(nèi)蒙古客運(yùn)從業(yè)資格證考試考什么科目
- 吉首大學(xué)《基礎(chǔ)英漢互譯》2021-2022學(xué)年第一學(xué)期期末試卷
- 紅色消防安全知識(shí)宣傳培訓(xùn)課件PPT模板
- 招標(biāo)投標(biāo)法實(shí)務(wù)講座
- 《鄉(xiāng)土中國(guó)》《家族 》《男女有別》聯(lián)讀 【備課精講精研】 高中語(yǔ)文
- 項(xiàng)目進(jìn)度管理培訓(xùn)(-)課件
- 牦牛主要疾病的防控進(jìn)展及發(fā)展趨勢(shì)講義課件
- 中壓交聯(lián)電纜電纜正、負(fù)和零序計(jì)算
- 3C戰(zhàn)略三角模型
- 民間藝術(shù)團(tuán)管理規(guī)章制度
- 高標(biāo)準(zhǔn)農(nóng)田建設(shè)示范工程質(zhì)量管理體系與措施
- 學(xué)生頂崗實(shí)習(xí)安全教育課件
- 公司組織架構(gòu)圖模板課件
評(píng)論
0/150
提交評(píng)論