1. 程式人生 > >C++中CONST用法總結

C++中CONST用法總結

1、修飾常量時:

?

1

2

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

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

2、修飾指標時:

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

?

1

2

3

4

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

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

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

const int * const

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

3、const修飾類物件時:

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

?

1

2

3

4

5

6

7

class TEMP{

    void func1();

    void func2() const;

  }

  const TEMP temp;

  temp.func1(); //錯誤;

  temp.func2(); //正確;

4、const修飾成員變數:

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

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

?

1

2

3

4

class TEMP{

const int val;     

    TEMP(int x)val(x){}; 

//只能在初始化列表中賦值;

  }

5、const修飾類的成員函式

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

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

?

1

2

3

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成員也可以被修改:

?

1

2

3

4

5

6

7

8

9

10

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屬性。

  用法:

?

1

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版本可避免程式碼重複;