C++中const用法總結(轉)

轉自:http://www.cppblog.com/jukevin/archive/2008/12/27/70499.html
C++中const用法總結
作者JuKevin 
1. const修飾普通變量和指針
const修飾變量,一般有兩種寫法: 
const TYPE value; 
TYPE const value; 
這兩種寫法在本質上是一樣的。它的含義是:const修飾的類型爲TYPE的變量value是不可變的。 
對於一個非指針的類型TYPE,無論怎麼寫,都是一個含義,即value只不可變。 
例如: 
const int nValue; //nValue是const 
int const nValue; // nValue是const 
但是對於指針類型的TYPE,不同的寫法會有不同情況,例如: 
A. const char *pContent; 
B. char * const pContent; 
C. char const *pContent; 
D. const char* const pContent; 
  
對於前三種寫法,我們可以換個方式,給其加上括號 
A. const (char) *pContent; 
B. (char*) const pContent; 
C. (char) const *pContent; 
這樣就一目瞭然。根據對於const修飾非指針變量的規則,很明顯,A=C. 
  
- 對於A,C, const修飾的類型爲char的變量*pContent爲常量,因此,pContent的內容爲常量不可變. 
- 對於B, 其實還有一種寫法: const (char*) pContent; 
含義爲:const修飾的類型爲char*的變量pContent爲常量,因此,pContent指針本身爲常量不可變. 
- 對於D, 其實是A和B的混合體,表示指針本身和指針內容兩者皆爲常量不可變 
  
總結: 
(1) 指針本身是常量不可變 
(char*) const pContent; 
const (char*) pContent; 
  
(2) 指針所指向的內容是常量不可變 
const (char) *pContent; 
(char) const *pContent; 
  
(3) 兩者都不可變 
const char* const pContent; 
  
還有其中區別方法: 
沿着*號劃一條線, 
如果const位於*的左側,則const就是用來修飾指針所指向的變量,即指針指向爲常量; 
如果const位於*的右側,const就是修飾指針本身,即指針本身是常量。 
2. const修飾函數參數
const修飾函數參數是它最廣泛的一種用途,它表示函數體中不能修改參數的值(包括參數本身的值或者參數其中包含的值)。它可以很好 
void function(const int Var); //傳遞過來的參數在函數內不可以改變(無意義,因爲Var本身就是形參) 
void function(const char* Var); //參數指針所指內容爲常量不可變 
void function(char* const Var); //參數指針本身爲常量不可變(也無意義, 因爲char* Var也是形參) 
  
參數爲引用,爲了增加效率同時防止修改。 
修飾引用參數時: 
void function(const Class& Var);//引用參數在函數內不可以改變 
void function(const TYPE& Var); //引用參數在函數內爲常量不可變 
  
3. const 修飾函數返回值
const修飾函數返回值其實用的並不是很多,它的含義和const修飾普通變量以及指針的含義基本相同。 
(1) const int fun1() 這個其實無意義,因爲參數返回本身就是賦值。 
(2) const int * fun2() 
調用時 const int *pValue = fun2(); 
我們可以把fun2()看作成一個變量,那麼就是我們上面所說的1.(1)的寫法,即指針內容不可變。 
(3) int* const fun3() 
調用時 int * const pValue = fun2(); 
我們可以把fun2()看作成一個變量,那麼就是我們上面所說的1.(2)的寫法,即指針本身不可變。 
4. const修飾類對象/對象指針/對象引用
const修飾類對象表示該對象爲常量對象,其中的任何成員都不能被修改。對於對象指針和對象引用也是一樣。 
const修飾的對象,該對象的任何非const成員函數都不能被調用,因爲任何非const成員函數會有修改成員變量的企圖。 
例如: 
class AAA 
{
  void func1(); 
void func2() const; 
const AAA aObj; 
aObj.func1(); × 
aObj.func2(); 正確 
  
const AAA* aObj = new AAA(); 
aObj->func1(); × 
aObj->func2(); 正確 
  
5. const修飾成員變量
const修飾類的成員函數,表示成員常量,不能被修改,同時它只能在初始化列表中賦值。 
  
class A 
  … 
  const int nValue; //成員常量不能被修改 
  … 
  A(int x): nValue(x) {}; //只能在初始化列表中賦值 
  
6. const修飾成員函數
const修飾類的成員函數,則該成員函數不能修改類中任何非const成員函數。一般寫在函數的最後來修飾。 
  
class A 
  … 
void function()const; //常成員函數, 它不改變對象的成員變量. 也不能調用類中任何非const成員函數。 
對於const類對象/指針/引用,只能調用類的const成員函數,因此,const修飾成員函數的最重要作用就是限制對於const對象的使用。 
  
7. const常量與define宏定義的區別
(1) 編譯器處理方式不同 
define宏是在預處理階段展開。 
const常量是編譯運行階段使用。 
(2) 類型和安全檢查不同 
define宏沒有類型,不做任何類型檢查,僅僅是展開。 
const常量有具體的類型,在編譯階段會執行類型檢查。 
(3) 存儲方式不同 
define宏僅僅是展開,有多少地方使用,就展開多少次,不會分配內存。 
const常量會在內存中分配(可以是堆中也可以是棧中)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章