3-1 常成員函數(shù)、靜態(tài)成員_第1頁
3-1 常成員函數(shù)、靜態(tài)成員_第2頁
3-1 常成員函數(shù)、靜態(tài)成員_第3頁
3-1 常成員函數(shù)、靜態(tài)成員_第4頁
3-1 常成員函數(shù)、靜態(tài)成員_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

常成員函數(shù)及靜態(tài)成員獲取vs改變對象的狀態(tài)在程序運行的不同時刻,一個對象可能會處于不同的狀態(tài):對象的狀態(tài)由對象的數(shù)據(jù)成員的值來體現(xiàn)??梢园杨愔械某蓡T函數(shù)分成兩類:獲取對象狀態(tài)(不改變數(shù)據(jù)成員的值)改變對象狀態(tài)(改變數(shù)據(jù)成員的值)例如classDate{ public: voidset(inty,intm,intd);//改變對象狀態(tài)

intget_day();//獲取對象狀態(tài)

intget_month();//獲取對象狀態(tài)

intget_year();//獲取對象狀態(tài)

......};為了防止在一個獲取對象狀態(tài)的成員函數(shù)中無意中修改對象數(shù)據(jù)成員的值,可以把它說明成常成員函數(shù)。例如,classDate{ public: voidset(inty,intm,intd);

intget_day()const;//常成員函數(shù)

intget_month()const;//常成員函數(shù)

intget_year()const;//常成員函數(shù)

......};voidDate::set(inty,intm,intd){year=y;month=m;day=d;}intDate::get_day()const{returnday;}intDate::get_month()const{returnmonth;}intDate::get_year()const{returnyear;}編譯器一旦發(fā)現(xiàn)在常成員函數(shù)中修改數(shù)據(jù)成員的值,將會報錯!常成員函數(shù)注意:對于有些修改對象狀態(tài)的常成員函數(shù),編譯程序不會指出錯誤!classA{ intx; char*p; public: ...... voidf()const

{x=10;//Error p=newchar[20];//Error

strcpy(p,"ABCD");//因為沒有改變p的值,

//編譯程序認(rèn)為OK! }};常成員函數(shù)還有一個作用:指出對常量對象能實施哪些操作,即,對常量對象只能調(diào)用類中的常成員函數(shù)。例如:classDate{public:voidset(inty,intm,intd);intget_day()const;intget_month()const;intget_year()const;

......};voidf(constDate&d)//d引用的是個常量對象!{...d.get_day()...//OK...d.get_month()...//OK...d.get_year()...//OKd.set(2011,3,23);//Error}同類對象如何共享數(shù)據(jù)?方案一:采用全局變量來表示共享數(shù)據(jù)。例如:intx=0;//全局變量classA{inty;

......voidf(){y=x;x++;......}//訪問共享的x}a,b;//以下操作對同一個x進(jìn)行a.f();b.f();共享的數(shù)據(jù)與對象之間缺乏顯式的聯(lián)系數(shù)據(jù)缺乏保護(hù)!x++;//不通過A類對象也能訪問x,不安全!方案二:采用靜態(tài)數(shù)據(jù)成員可以更好地實現(xiàn)同一個類的不同對象之間的數(shù)據(jù)共享。例如classA{inty;

......

staticintx;//靜態(tài)數(shù)據(jù)成員聲明voidf(){y=x;x++;......}//訪問共享的x};intA::x=0;//靜態(tài)數(shù)據(jù)成員定義及初始化......Aa,b;a.f();b.f();//上述操作對同一個x進(jìn)行x++;//Error,不通過A類對象不能訪問x!靜態(tài)數(shù)據(jù)成員

類的靜態(tài)數(shù)據(jù)成員對該類的所有對象只有一個拷貝。例如,對于下面A類中的shared:classA{ intx,y;

staticintshared;

public: A(){x=y=0;} voidincrease_all(){x++;y++;shared++;} intsum_all()const{returnx+y+shared;} ......};intA::shared=0;Aa1,a2;

shared:0a1 a2a1.x:0 a2.x:0a1.y:0 a2.y:0Aa1,a2;

shared:1a1 a2a1.x:1 a2.x:0a1.y:1 a2.y:0a1.increase_all();cout<<a2.sum_all()<<endl;//輸出:1靜態(tài)成員函數(shù)成員函數(shù)也可以聲明成靜態(tài)的(靜態(tài)成員函數(shù))。例如:classA{ intx,y; staticintshared; public: A(){x=y=0;}

staticintget_shared()//靜態(tài)成員函數(shù)

{returnshared;

} ......};intA::shared=0;靜態(tài)成員函數(shù)只能訪問類的靜態(tài)成員。靜態(tài)成員函數(shù)沒有隱藏的this參數(shù)!靜態(tài)成員除了通過對象來訪問外,也可以直接通過類來訪問。例如:Aa;......cout<<a.get_shared();或者cout<<A::get_shared();classA{staticintobj_count;…...public:A()//在所有構(gòu)造函數(shù)中增加:obj_count++;{obj_count++;......}~A()//在析構(gòu)函數(shù)中增加:obj_count--;{obj_count--;......}staticintget_num_of_objects(){returnobj_count; }…...};intA::obj_count=0;......//其中創(chuàng)建了一系列A類對象cout<<A::get_num_of_

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論