在我學習c++的過程中,對const的應用不可不說是最容易混亂和最容易出錯的。但是const卻是乙個好東西,每乙個c++程式設計師都必須掌握它。以下為本人的一點總結。
1、用const 修飾函式的引數
如果引數作輸出用,不論它是什麼資料型別,也不論它採用「指標傳遞」還是「引用傳遞」,都不能加const 修飾,否則該引數將失去輸出功能。const 只能修飾輸入引數。
a, 如果輸入引數採用「值傳遞」,由於函式將自動產生臨時變數用於複製該引數,該輸入引數本來就無需保護,所以不要加const 修飾。
b,對於非內部資料型別的輸入引數,應該將「值傳遞」的方式改為「const 引用傳遞」,目的是提高效率。
例如將void func(a a) 改為void func(const a &a)。
c,對於內部資料型別的輸入引數,不要將「值傳遞」的方式改為「const 引用傳遞」。否則既達不到提高效率的目的,又降低了函式的可理解性。
例如void func(int x) 不應該改為void func(const int &x)。
2、用const 修飾函式的返回值
a, 如果給以「指標傳遞」方式的函式返回值加 const 修飾,那麼函式返回值(即指標)的內容不能被修改,該返回值只能被賦給加const 修飾的同型別指標。
例如函式
const char * getstring(void);
如下語句將出現編譯錯誤:
char *str = getstring();
正確的用法是
const char *str = getstring();
b, 如果函式返回值採用「值傳遞方式」,由於函式會把返回值複製到外部臨時的儲存單元中,加const 修飾沒有任何價值。
例如不要把函式int getint(void) 寫成const int getint(void) 。
同理不要把函式a geta(void) 寫成const a geta(void) ,其中a 為使用者自定義的資料型別。
3、 const 成員函式
int stack::getcount(void) const
任何不會修改資料成員的函式都應該宣告為const 型別。如果在編寫const 成員函式時,不慎修改了資料成員,或者呼叫了其它非const 成員函式,編譯器將指出錯誤。
4、const 指標
a、將const放在指標變數型別之前。
例如:float f; const float *pf=&f;
表示指標變數指向的資料是乙個常量,即不能改變指標指向的資料的值,但可使指標變數指向其他變數。
b、將const 放在*之後,變數名之前。
例如:int i; int *const pi=&i;
表示指標變數的指向不能改變,但可改變指標變數所指向的資料的值。
c、const 乙個放在指標變數型別之前,乙個放在指標變數名之前。
例如:int i; const int *const pi=&i;
表示指標變數的值,及其所指向的資料都是乙個常量,所以都不能改變他們的值。
5、在定義const 物件時必須初始化,因為常量在定義後就不能被修改。例如:const string s="hello";且預設為檔案的區域性變數,要使const 變數能夠在其他的檔案中訪問,必須顯式地指定它為extern。例如:extern const int i=0;
C 中const的運用
1 欲阻止乙個變數被改變,可以使用const關鍵字。在定義該const變數時,通常需要對它進行初始化,因為以後就沒有機會再去改變它了 2 對指標來說,可以指定指標本身為const,也可以指定指標所指的資料為const,或二者同時指定為const 3 在乙個函式宣告中,const可以修飾形參,表明它是...
C 中const使用注意要點(二)
當const修飾類的成員變數 1 const修飾類的非靜態成員時必須在建構函式初始化列表上初始化 在建構函式內會提示表示式必須是可修改的左值,因為在建構函式內並不是初始化,僅僅是賦值,而const型別必須初始化。2 const修飾類的靜態成員必須在定義的地方對它初始化,因為靜態成員是無法在建構函式初...
c中的const與c 中的const
c中的const是乙個偽唯讀識別符號。include include int main 此時輸出a的值為20,被指標間接的改變了。c 中,const進行了增強,不在是乙個偽識別符號了。const int a 10 int p int a p 20 cout a p endl cout a endl ...