const名叫常量限定符,用來限定特定變數,以通知編譯器該變數是不可修改的。使用const,可以避免在函式中對某些不應修改的變數造成可能的改動。
非const 變數預設為extern,這樣就不可以被程式其它檔案訪問,要想const變數能夠被在其他的檔案中訪問,必須顯式地指定它為extern,如extern const int buffsize = 1024;
const引用是指向const物件的引用,如下例:
const int ival = 1024;
const int &refval = ival;
而不可以這樣:int &refval2 = ival;可以讀取但不能修改refval的值。
const引用可以初始化為不同型別的物件或者初始化為右值,如字面值常量:
int i = 42;
const int &r = 42;
const int &r2 = r+i;
這樣做完全可以,但是如果同樣的初始化對於非const引用卻是不合法的,導致編譯時錯誤。
也就是:非const引用只能繫結到與該引用同型別的物件,const引用則可以繫結到不同但相關的型別的物件或繫結到右值。
2.指標變數賦值
首先看下面賦值情況:
int b = 500;
const int* a = &b; [1]
int const *a = &b; [2]
int* const a = &b; [3]
const int* const a = &b; [4]
判斷該賦值的規則如下:
如果const位於星號的左側,則const就是用來修飾指標所指向的變數,即指標指向為常量;如果const位於星號的右側,const就是修飾指標本身,即指標本身是常量。
因此,[1]和[2]的情況相同,都是指標所指向的內容為常量(const放在變數宣告符的位置無關,[1]和[2]是等價的),這種情況下不允許對內容進行更改操作,如不能*a = 3 ;
[3]為指標本身是常量,而指標所指向的內容不是常量,這種情況下不能對指標本身進行更改操作,如a++是錯誤的;
[4]為指標本身和指向的內容均為常量。
3.類變數賦值
const a* c=new a();
a* e = c;
解析:根據規則,const位於星號的左側,所以修飾的變數c的值是常量,而a* e = c,即將常量賦值給指標,而宣告指標的目的是為了對其指向的內容進行改變,所以不正確。
a* const c = new a();
a* b = c;
解析:根據規則,const位於星號的右側,所以修飾的變數c的指標是常量,正確。
a f;
const a& e = f;
解析:e定義為const型別,只能訪問宣告為const的函式(不改變成員變數的函式),而不能訪問一般的成員函式。
4.作為引數和返回值的const修飾符
void fun0(const a* a );
void fun1(const a& a);
呼叫函式的時候,用相應的變數初始化const常量,則在函式體中,按照const所修飾的部分進行常量化,如形參為const a* a,則不能對傳遞進來的指標內容進行改變,保護了原指標所指向的內容;如形參為const a& a,則不能對傳遞進來的引用物件進行改變,保護了原物件的屬性。引數const通常用於引數為指標或引用的情況;
const a fun2( );
const a* fun3( );
const rational operator*(const rational& lhs, const rational& rhs)
返回值用const修飾可以防止允許這樣的操作發生:
rational a,b;一般用const修飾返回值為物件本身(非引用和指標)的情況多用於二目操作符過載函式並產生新物件的時候。radional c;
(a*b) = c;
一般情況下,函式的返回值為某個物件時,如果將其宣告為const時,多用於操作符的過載。通常,不建議用const修飾函式的返回值型別為某個物件或對某個物件引用的情況。原因是如果返回值為某個物件為const(const a test = a 例項)或某個物件的引用為const(const a& test = a例項) ,則返回值具有const屬性,則返回例項只能訪問類a中的公有(保護)資料成員和const成員函式,並且不允許對其進行賦值操作,這在一般情況下很少用到。
5. 類成員函式const的使用
一般放在函式體後,形如:void fun() const;
如果乙個成員函式的不會修改該類資料成員,那麼最好將其宣告為const,因為const成員函式中不允許對該類資料成員進行修改,如果修改,編譯器將報錯,這大大提高了程式的健壯性。
6. const使用總結
要避免最一般的賦值操作錯誤,如將const變數賦值;
在引數中使用const應該使用引用或指標,而不是一般的物件例項;
const在成員函式中的三種用法(引數、返回值、函式)要很好的使用;
不要輕易的將函式的返回值型別定為const;
除了過載操作符外一般不要將返回值型別定為對某個物件的const引用;
c const用法總結
看了好多博主寫的關於const的總結,總是仁者見仁,智者見智,好多博主都多多少少的有一些錯誤,在這總結一下c const的用法,我的文章中也可能會有錯誤,望指正!一.定義常量 1 const修飾變數 int const a 5 const int a 5 這兩種定義方法是一樣的,都是不希望a的值發生...
C const用法總結
一 c語言中 1.const修飾的是常變數,存放在 段,僅僅是在編譯階段看常變數是否做左值,其他處理和普通變數一樣 2.若修飾全域性變數,其屬性是global。二 c 中 1.const修飾的量稱為常量,在編譯階段將用到常量的地方替換成常量初始化的值 注 1 一定要初始化,因為要做替換 2 不能做左...
c const與 define的用法總結
1 const a.可以用來定義常量 修飾函式引數 修飾函式返回值等三個作用。編譯階段 b.被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程式的健壯性。2 define define是乙個巨集定義,可以定義乙個全域性變數,在整個檔案中都可以使用,它只是乙個字元替換操作,不做型別檢查...