C++ 關鍵字 -- const

const修飾普通類型的變量

const修飾變量,如下兩種定義形式在本質上是同樣的。它的含義是:const修飾的類型爲TYPE的變量value是不可變的。函數

TYPE const ValueName = value; 

 const TYPE ValueName = value;

(2)將const改成外部鏈接,做用於擴大至全局,編譯時會分配內存,而且能夠不進行初始化,僅僅做爲聲明,編譯器認爲在程序其餘地方進行了定義.指針

extend const int ValueName = value;

const 修飾指針變量。

  • 指針常量 -- 指針自己是常量不可變
char* const pContent;

修飾符const與指針變量緊鄰,說明指針變量不容許修改,既然指針變量的值不能修改,因此必定要在定義的時候給定初值(指向一個肯定存在的地方)code

  • 常量指針 -- 指針所指向的內容是常量不可變
const char *pContent;

若是在定義指針變量的時候,數據類型前用const修飾,被定義的指針變量就是指向常量的指針變量,指向常量的指針變量稱爲常量指針
定義一個常量指針後,指針指向的值就不能被改變,即不能經過指針變量直接更改指針指向的值對象

  • 常指針常量 -- 二者都不可變;指針不能改變,指針指向的值也不能改變
const char* const pContent;

若是const位於*的左側,則const就是用來修飾指針所指向的變量,即指針指向爲常量;內存

若是const位於*的右側,const就是修飾指針自己,即指針自己是常量。編譯器

const參數傳遞和函數返回值。

  • const修飾函數參數
//a.傳遞過來的參數在函數內不能夠改變(無心義,由於Var自己就是形參)
void function(const int Var);

//b.參數指針所指內容爲常量不可變
void function(const char\* Var);

//c.參數指針自己爲常量不可變(也無心義,由於char\* Var也是形參)
void function(char\* const Var);

//d.參數爲引用,爲了增長效率同時防止修改。修飾引用參數時:
void function(const Class& Var); //引用參數在函數內不能夠改變
void function(const TYPE& Var); //引用參數在函數內爲常量不可變

這樣的一個const引用傳遞和最普通的函數按值傳遞的效果是如出一轍的,他禁止對引用的對象的一切修改,惟一不一樣的是按值傳遞會先創建一個類對象的副本, 而後傳遞過去,而它直接傳遞地址,因此這種傳遞比按值傳遞更有效.另外只有引用的const傳遞能夠傳遞一個臨時對象,由於臨時對象都是const屬性, 且是不可見的,他短期存在一個局部域中,因此不能使用指針,只有引用的const傳遞可以捕捉到這個傢伙.io

  • const 修飾函數返回值

    const修飾函數返回值其實用的並非不少,它的含義和const修飾普通變量以及指針的含義基本相同。編譯

a.const int fun1() //這個其實無心義,由於參數返回自己就是賦值。

 b. const int \* fun2() //調用時 const int \*pValue = fun2(); 

 //咱們能夠把fun2()看做成一個變量,即指針內容不可變。

 c.int\* const fun3() //調用時 int \* const pValue = fun2(); 

 //咱們能夠把fun2()看做成一個變量,即指針自己不可變。

通常狀況下,函數的返回值爲某個對象時,若是將其聲明爲const時,多用於操做符的重載。一般,不建議用const修飾函數的返回值類型爲某個對象或對某個對象引用的狀況。緣由以下:若是返回值爲某個對象爲const(const A test = A 實例)或某個對象的引用爲const(const A& test = A實例) ,則返回值具備const屬性,則返回實例只能訪問類A中的公有(保護)數據成員和const成員函數,而且不容許對其進行賦值操做,這在通常狀況下不多用到。function

const修飾類

  • const修飾成員變量

const修飾類的成員函數,表示成員常量,不能被修改,同時它只能在初始化列表中賦值。class

class A
 { 

 …

 const int nValue;  //成員常量不能被修改

 …

 A(int x): nValue(x) { } ; //只能在初始化列表中賦值

 };
  • const修飾成員函數

const修飾類的成員函數,則該成員函數不能修改類中任何非const成員函數。通常寫在函數的最後來修飾。

class A
 { 

 …

  void function()const; //常成員函數, 它不改變對象的成員變量. 

//也不能調用類中任何非const成員函數。

};

對於const類對象/指針/引用,只能調用類的const成員函數,所以,const修飾成員函數的最重要做用就是限制對於const對象的使用。

a. const成員函數不被容許修改它所在對象的任何一個數據成員。

b. const成員函數可以訪問對象的const成員,而其餘成員函數不能夠。

  • 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(); 正確
相關文章
相關標籤/搜索