const修飾符全面理解

2021-07-11 11:23:06 字數 2703 閱讀 5608

const修飾符就是為了將變數宣告為不可變的常量,使程式更加的健壯。

(1)為什麼define應該用const enum inline來替代(effective c++):

const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤(邊際效應) 。

define作用於預編譯階段,也就是說在預編譯階段把所有define的常量替換為相應字元,常量沒有進入符號表,這樣如果出錯編譯器只會提示相應字元出錯不會 不好進行判斷,所以define宣告的常量應該用const或者列舉替代來宣告常量,這樣才能加入到字元表,出錯很容易除錯。

define宣告的形式函式的巨集,應該用inline 模板函式進行替代,因為巨集不具有安全性,其並不是乙個統一的整體,應用內聯函式替代。

小插曲,enum與const定義常量是的優缺點:const與enum各有優缺點,最大的區別就是enum只能用於定義整數,而不能定義浮點數;而對於定義邏輯關係較近的一組符號常量時比較適合使用enum,不適合使用const.

(2)const修飾類的資料成員:

class a 

const 資料成員只在某個物件生存期內是常量,而對於整個類而言卻是可變的。因為類可以建立多個物件,不同的物件其const資料成員的值可以不同。所以不能在類 宣告中初始化const資料成員,因為類的物件未被建立時,編譯器不知道const 資料成員的值是什麼。如 

class a 

const資料成員的初始化只能在類的建構函式的初始化表中進行。要想建立在整個類中都恆定的常量,應該用類中的列舉常量來實現。如 

class a 

; int array1[size1]; 

int array2[size2]; 

} 列舉常量不會占用物件的儲存空間,他們在編譯時被全部求值。但是列舉常量的隱含資料型別是整數,其最大值有限,且不能表示浮點數。 

(3)const修飾類的成員函式:

一般放在函式體後,形如:void fun() const; 

任何不會修改資料成員的函式都因該宣告為const型別。如果在編寫const成員函式時,不慎修改了資料成員,或者呼叫了其他非const成員函式,編譯器將報錯,這大大提高了程式的健壯性。l另外,const修飾的成員函式只能呼叫const成員函式如: 

class stack 

; int stack::getcount(void) const 

(4)const物件:

常物件是指物件的資料成員的值在物件被呼叫時不能被改變。常物件必須進行初始化,且不能被更新。不能通過常物件呼叫普通成員函式,但是可以通過普通物件呼叫常成員函式。常物件只能呼叫常成員函式。

class a

int getw()

void setwh(int x,int y)

a(int x,int y)

a()//本例中不能省略

};void main()

{   

a a;//非常物件可以不初始化

a.setwh(3,9);

a const b;    //常物件必須宣告的同時初始化,正確的是 a const b(3,6)。

b.setwh(3,7); // 假如上面改正後用這一句,還是錯誤應為b是常物件不能呼叫非常成員函式,切其值呼叫時不能改變,setwh()

cout<< a.getarea()<

system("pause");

也就是說常物件在初始化的時候必須通過建構函式進行初始化,並且const物件只能呼叫cosnt函式,這樣可以保證其健壯性,確保const物件沒有對

資料成員進行任何的修改。

(5)const 修飾指標:

如果const位於星號的左側,則const就是用來修飾指標所指向的變數,即指標指向為常量;如果const位於星號的 右側,const就是修飾指標本身,即指標本身是常量(efficetve c++)。

(6) const 修飾函式:

i:const修飾函式引數,此處需要謹記就是說內建資料型別(如int double char等)應該直接用值傳遞的方式,這樣簡單易懂,效率高(函式內部維持此變數的拷貝);如果為非內建資料型別,如struct或class等,函式傳參應該是const 指標 或者cosnt 引用,最好用const引用,因為引用比指標更加的安全。如void func(a a)改為void func(const a &a) 或者func(const a* a).(當然此處有乙個前提就是傳遞過來的引數不進行改變才加const,如果改變的話就不加const修飾符)。

ii:const修飾函式返回值。只需要考慮特殊的返回const指標這種情況。如果給採用「指標傳遞」方式的函式返回值加const修飾,那麼函式返回值(即指標)的內容不能被修改,該返回值只能被賦給加const 修飾的同型別指標。onst char * getstring(void); 

如下語句將出現編譯錯誤: 

char *str=getstring(); 

正確的用法是: 

const char *str=getstring(); 

同時,str指標可以指向其他字串,但是*str的值不能被修改。

CONST修飾符的理解

目前在進行c語言補習時,發現很多的同學對於const這個關鍵字的理解存在很大的誤解。現在總結下對這個關鍵字理解上的誤區,希望在以後的程式設計中,能夠靈活使用const這個關鍵字。1 const修飾的變數是常量還是變數 對於這個問題,很多同學認為const修飾的變數是不能改變,結果就誤認為該變數變成了...

CONST修飾符的理解

目前在進行c語言補習時,發現很多的同學對於const這個關鍵字的理解存在很大的誤解。現在總結下對這個關鍵字理解上的誤區,希望在以後的程式設計中,能夠靈活使用const這個關鍵字。1 const修飾的變數是常量還是變數 對於這個問題,很多同學認為const修飾的變數是不能改變,結果就誤認為該變數變成了...

const 型別修飾符

const是用來限定所指定的變數或者函式不可作修改。1 修飾變數 當const用來修飾變數的時候,const所指定部分不可修改。a.修飾常規變數 如 const int a 10 int const a 10 這兩種方式的效果一樣,都是將a描述為常量,a的值在被賦初值後不可以修改。但是這和由巨集定義...