Const,Const函數(shù),Const變量,函數(shù)后面的Const_第1頁
Const,Const函數(shù),Const變量,函數(shù)后面的Const_第2頁
Const,Const函數(shù),Const變量,函數(shù)后面的Const_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

1、Const,Const函數(shù),Const變量,函數(shù)后面的Const看到const關(guān)鍵字,C+程序員首先想到的可能是const常量。這可不是良好的條件反射。如果只知道用const定義常量,那么相當(dāng)于把火藥僅用于制作鞭炮。const更大的魅力是它可以修飾函數(shù)的參數(shù)、返回值,甚至函數(shù)的定義體。const是constant的縮寫,“恒定不變”的意思。被const修飾的東西都受到強(qiáng)制保護(hù),可以預(yù)防意外的變動,能提高程序的健壯性。所以很多C+程序設(shè)計書籍建議:“Useconstwheneveryouneed”。1.用const修飾函數(shù)的參數(shù)如果參數(shù)作輸出用,不論它是什么數(shù)據(jù)類型,也不論它采用“指針傳遞”還是

2、“引用傳遞”,都不能加const修飾,否則該參數(shù)將失去輸出功能。const只能修飾輸入?yún)?shù):如果輸入?yún)?shù)采用“指針傳遞”,那么加const修飾可以防止意外地改動該指針,起到保護(hù)作用。例如StringCopy函數(shù):voidStringCopy(char*strDestination,constchar*strSource);其中strSource是輸入?yún)?shù),strDestination是輸出參數(shù)。給strSource加上const修飾后,如果函數(shù)體內(nèi)的語句試圖改動strSource的內(nèi)容,編譯器將指出錯誤。如果輸入?yún)?shù)采用“值傳遞”,由于函數(shù)將自動產(chǎn)生臨時變量用于復(fù)制該參數(shù),該輸入?yún)?shù)本來就無需

3、保護(hù),所以不要加const修飾。例如不要將函數(shù)voidFuncl(intx)寫成voidFuncl(constintx)。同理不要將函數(shù)voidFunc2(Aa)寫成voidFunc2(constAa)。其中A為用戶自定義的數(shù)據(jù)類型。對于非內(nèi)部數(shù)據(jù)類型的參數(shù)而言,象voidFunc(Aa)這樣聲明的函數(shù)注定效率比較底。因為函數(shù)體內(nèi)將產(chǎn)生A類型的臨時對象用于復(fù)制參數(shù)a,而臨時對象的構(gòu)造、復(fù)制、析構(gòu)過程都將消耗時間。為了提高效率,可以將函數(shù)聲明改為voidFunc(A&a),因為“引用傳遞”僅借用一下參數(shù)的別名而已,不需要產(chǎn)生臨時對象。但是函數(shù)voidFunc(A&a)存在一個缺點:“引用傳遞”有

4、可能改變參數(shù)a,這是我們不期望的。解決這個問題很容易,加const修飾即可,因此函數(shù)最終成為voidFunc(constA&a)。以此類推,是否應(yīng)將voidFunc(intx)改寫為voidFunc(constint&x),以便提高效率?完全沒有必要,因為內(nèi)部數(shù)據(jù)類型的參數(shù)不存在構(gòu)造、析構(gòu)的過程,而復(fù)制也非??欤爸祩鬟f”和“引用傳遞”的效率幾乎相當(dāng)。問題是如此的纏綿,我只好將“const&”修飾輸入?yún)?shù)的用法總結(jié)一下。對于非內(nèi)部數(shù)據(jù)類型的輸入?yún)?shù),應(yīng)該將“值傳遞”的方式改為“const引用傳遞”,目的是提高效率。例如將voidFunc(Aa)改為voidFunc(constA&a)。對于內(nèi)部

5、數(shù)據(jù)類型的輸入?yún)?shù),不要將“值傳遞”的方式改為“const引用傳遞”。否則既達(dá)不到提高效率的目的,又降低了函數(shù)的可理解性。例如voidFunc(intx)不應(yīng)該改為voidFunc(constint&x)。2.用const修飾函數(shù)的返回值如果給以“指針傳遞”方式的函數(shù)返回值加const修飾,那么函數(shù)返回值(即指針)的內(nèi)容不能被修改,該返回值只能被賦給加const修飾的同類型指針。例如函數(shù)constchar*GetString(void);如下語句將出現(xiàn)編譯錯誤:char*str=GetString();正確的用法是constchar*str=GetString();如果函數(shù)返回值采用“值傳遞方

6、式”,由于函數(shù)會把返回值復(fù)制到外部臨時的存儲單元中,加const修飾沒有任何價值。例如不要把函數(shù)intGetlnt(void)寫成constintGetlnt(void)。同理不要把函數(shù)AGetA(void)寫成constAGetA(void),其中A為用戶自定義的數(shù)據(jù)類型。如果返回值不是內(nèi)部數(shù)據(jù)類型,將函數(shù)AGetA(void)改寫為constA&GetA(void)的確能提高效率。但此時千萬千萬要小心,一定要搞清楚函數(shù)究竟是想返回一個對象的“拷貝”還是僅返回“別名”就可以了,否則程序會出錯。函數(shù)返回值采用“引用傳遞”的場合并不多,這種方式一般只出現(xiàn)在類的賦值函數(shù)中,目的是為了實現(xiàn)鏈?zhǔn)奖磉_(dá)。

7、例如:classAA&operate=(constA&other);/賦值函數(shù);Aa,b,c;/a,b,c為A的對象a=b=c;/正常的鏈?zhǔn)劫x值(a=b)=c;/不正常的鏈?zhǔn)劫x值,但合法如果將賦值函數(shù)的返回值加const修飾,那么該返回值的內(nèi)容不允許被改動。上例中,語句a=b=c仍然正確,但是語句(a=b)=c則是非法的。3.const成員函數(shù)任何不會修改數(shù)據(jù)成員(即函數(shù)中的變量)的函數(shù)都應(yīng)該聲明為const類型。如果在編寫const成員函數(shù)時,不慎修改了數(shù)據(jù)成員,或者調(diào)用了其它非const成員函數(shù),編譯器將指出錯誤,這無疑會提高程序的健壯性。以下程序中,類stack的成員函數(shù)GetCount

8、僅用于計數(shù),從邏輯上講GetCount應(yīng)當(dāng)為const函數(shù)。編譯器將指出GetCount函數(shù)中的錯誤。classStackpublic:voidPush(intelem);intPop(void);intGetCount(void)const;/const成員函數(shù)private:intm_num;intm_data100;intStack:GetCount(void)const+m_num;/編譯錯誤,企圖修改數(shù)據(jù)成員m_numPop();/編譯錯誤,企圖調(diào)用非const函數(shù)returnm_num;const成員函數(shù)的聲明看起來怪怪的:const關(guān)鍵字只能放在函數(shù)聲明的尾部,大概是因為其它地方都已經(jīng)被占用了。關(guān)于Const函數(shù)的幾點規(guī)則:const對象只能訪問const成員函數(shù),而非const對象可以訪問任意的成員函數(shù),包括const成員函數(shù).const對象的成員是不可修改的,然而const對象通過指針維護(hù)

溫馨提示

  • 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

提交評論