C 中const的運用及注意

2021-08-20 01:55:36 字數 1646 閱讀 2017

在我學習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 ...