const修飾變量,如下兩種定義形式在本質上是同樣的。它的含義是:const修飾的類型爲TYPE的變量value是不可變的。函數
TYPE const ValueName = value; const TYPE ValueName = value;
(2)將const改成外部鏈接,做用於擴大至全局,編譯時會分配內存,而且能夠不進行初始化,僅僅做爲聲明,編譯器認爲在程序其餘地方進行了定義.指針
extend const int ValueName = value;
char* const pContent;
修飾符const與指針變量緊鄰,說明指針變量不容許修改,既然指針變量的值不能修改,因此必定要在定義的時候給定初值(指向一個肯定存在的地方)code
const char *pContent;
若是在定義指針變量的時候,數據類型前用const修飾,被定義的指針變量就是指向常量的指針變量,指向常量的指針變量稱爲常量指針
定義一個常量指針後,指針指向的值就不能被改變,即不能經過指針變量直接更改指針指向的值對象
const char* const pContent;
若是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修飾普通變量以及指針的含義基本相同。編譯
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修飾類的成員函數,表示成員常量,不能被修改,同時它只能在初始化列表中賦值。class
class A { … const int nValue; //成員常量不能被修改 … A(int x): nValue(x) { } ; //只能在初始化列表中賦值 };
const修飾類的成員函數,則該成員函數不能修改類中任何非const成員函數。通常寫在函數的最後來修飾。
class A { … void function()const; //常成員函數, 它不改變對象的成員變量. //也不能調用類中任何非const成員函數。 };
對於const類對象/指針/引用,只能調用類的const成員函數,所以,const修飾成員函數的最重要做用就是限制對於const對象的使用。
a. const成員函數不被容許修改它所在對象的任何一個數據成員。
b. 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(); 正確