C const用法總結

2021-05-28 09:55:05 字數 2748 閱讀 4552

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;

radional c;

(a*b) = c;

一般用const修飾返回值為物件本身(非引用和指標)的情況多用於二目操作符過載函式並產生新物件的時候。

一般情況下,函式的返回值為某個物件時,如果將其宣告為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是乙個巨集定義,可以定義乙個全域性變數,在整個檔案中都可以使用,它只是乙個字元替換操作,不做型別檢查...