當前位置:才華齋>計算機>C語言>

c++中const關鍵字

C語言 閱讀(2.94W)

const是一個C++語言的限定符,它限定一個變數不允許被改變。使用const在一定程度上可以提高程式的安全性和可靠性。下面是小編分享的c++中const關鍵字,一起來看一下吧。

c++中const關鍵字

  define與const的區別

ne作用在預處理時,是簡單地字元替換

2. const作用在編譯時,具有型別檢查的功能

3. const必須進行初始化

 常量指標與指標常量

#include <iostream>

using std::endl;

using std::cout;

int main()

{

int a = 100;

const int *pa = &a;

int * const pb = &a;

return 0;

}

  小結

const int *pa = &a;-->常量指標

可以改變指標指向,不能改變所指變數的值。

int * const pb = &a;

不能改變指標指向,可以改變所指變數的值。

  C/C++中CONST用法總結

1、修飾常量時:

const int temp1; //temp1為常量,不可變

int const temp2; //temp2為常量,不可變

2、修飾指標時:

主要看const在*的前後,在前則指標指向的內容為常量,在後則指標本身為常量;

const int *ptr; //*ptr為常量;

int const *ptr; //*ptr為常量;

int* const ptr; //ptr為常量;

const int * const ptr; //*ptr、ptr均為常量;

3、const修飾類物件時:

const修飾類物件時,其物件中的任何成員都不能被修改。const修飾的物件,該物件的任何非const成員函式都不能呼叫該物件,因為任何非const成員函式都會有修改成員變數的可能。

class TEMP{

void func1();

void func2() const;

}

const TEMP temp;

1(); //錯誤;

2(); //正確;

4、const修飾成員變數:

const修飾的成員變數不能被修改,同時只能在初始化列表中被初始化,因為常量只能被初始化,不能被賦值;

賦值是使用新值覆蓋舊值建構函式是先為其開闢空間然後為其賦值,不是初始化;而初始化列表開闢空間和初始化是同時完成的,直接給與一個值,所以const成員變數一定要在初始化列表中完成。

class TEMP{

const int val;

TEMP(int x)val(x){}; //只能在初始化列表中賦值;

}

5、const修飾類的成員函式

const成員函式表示該成員函式不能修改類物件中的任何非const成員變數。一般const寫在函式的後面,形如:void func() const;

如果某個成員函式不會修改成員變數,那麼最好將其宣告為const,因為const成員函式不會對資料進行修改,如果修改,編譯器將會報錯;

class TEMP{

void func()const; //常成員函式,不能修改物件中的成員變數,也不能呼叫類中任何非const成員函式;

}

對於const類物件,只能呼叫類中的const成員函式,所以const修飾成員函式的作用主要就是限制對const物件的使用。

6、const在函式宣告中的使用:

在函式宣告中,const可以修飾函式的返回值,也可以修飾具體某一個形參;

修飾形參時,用相應的變數初始化const常量,在函式體內,按照const所修飾的部分進行常量化;

修飾函式返回值時,一般情況下,const修飾返回值多用於操作符的過載。通常不建議用const修飾函式的返回值型別為某個物件或某個物件引用的情況;

7、const常量與define巨集定義的區別:

1)處理階段不同:

define是在預處理階段,define常量從未被編譯器看見,因為在預處理截斷就已經替換了;

const常量在編譯階段使用。

2)型別和安全檢查不同

define沒有型別,不做任何檢查,僅僅是字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤

const常量有明確的型別,在編譯階段會進行型別檢查;

3)儲存方式不同

define是字元替換,有多少地方使用,就會替換多少次,不會分配記憶體;

編譯器通常不會為const常量分配空間,只是將它們儲存在符號表內,使他們成為一個編譯期間的一個常量,沒有讀取記憶體的操作,效率也很高;

8、mutable關鍵字:

在C++中,mutable是為了突破const的限制而設定的。被mutable修飾的`變數,將永遠處於可變的狀態,即使在一個const函式中,甚至結構體變數或者類物件為const,其mutable成員也可以被修改:

class ST {

public:

int a;

mutable int showCount;

void Show()const;

};

void ST::Show()const{

//a=1;//錯誤,不能在const成員函式中修改普通變數

showCount++;//正確

}

mutable只能修飾非靜態資料成員;

9、const_cast:

用於修改型別的const或volatile屬性。

用法:

:const_cast<type_id> (expression)

該運算子用來修改型別的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的型別是一樣的。

1)常量指標被轉化成非常量的指標,並且仍然指向原來的物件;

2)常量引用被轉換成非常量的引用,並且仍然指向原來的物件;

3)const_cast一般用於修改底指標。如const char *p形式。

建議:

1、應該儘可能使用const,它會允許你指定一個語義約束(也就是指定一個不能被改動的物件),而編譯器會強制實施這項約束。它允許你告訴編譯器和其他程式設計師某值應該保持不變。

2、將某些東西宣告為const可幫助編譯器偵測出錯誤用法。const可被施加於任何作用域內的物件、函式引數、函式返回型別、成員函式本體;

3、編譯器強制實施bitwise constness,但你編寫程式時應該使用“概念上的常量性”(conceptual constness);

4、當const和non_const成員函式有著實質等價的實現時,令non-const版本呼叫const版本可避免程式碼重複;