Const

const修飾普通變量和指針c#

const修飾變量,通常有兩種寫法:安全

1
2
const  TYPE value;
TYPE  const  value;

這兩種寫法在本質上是同樣的。它的含義是:const修飾的類型爲TYPE的變量value是不可變的。函數

對於一個非指針的類型TYPE,不管怎麼寫,都是一個含義,即value值不可變。 例如:spa

1
2
const  int  nValue;     //nValue是const
int  const  nValue;     //nValue是const

可是對於指針類型的TYPE,不一樣的寫法會有不一樣狀況:指針

1.  指針自己是常量不可變,必須進行初始化!code

1
char const  pContent;   //錯誤,沒有進行初始化!

2.  指針所指向的內容是常量不可變對象

1
2
const  char  *pContent;
char  const  *pContent;

3.  二者都不可變內存

1
const  char const  pContent;

將*號和變量之間的全都括起來:ci

若是const位於括號的外面,則const就是用來修飾指針所指向的變量,即指針指向的內容爲常量;編譯器

若是const位於括號的裏面,則const就是修飾指針自己,即指針自己是常量。

 

const修飾函數參數

表示在函數體中不能修改參數的值(包括參數自己的值或者參數其中包含的值):

1
2
3
4
void  function( const  int  Var);      //傳遞過來的參數在函數內不能夠改變(值傳遞,無心義)
void  function( char const  Var);    //參數指針自己爲常量不可變(也是值傳遞,無心義)
void  function( const  char * Var);    //參數指針所指內容爲常量不可變
void  function( const  Class& Var);   //引用參數在函數內不能夠改變

    參數const一般用於參數爲指針或引用的狀況,若輸入參數採用「值傳遞」方式,因爲函數將自動產生臨時變量用於複製該參數,該參數本就不須要保護,因此不用const修飾。

 

const修飾類對象/對象指針/對象引用

const修飾類對象表示該對象爲常量對象,其中的任何成員都不能被修改。對於對象指針和對象引用也是同樣。

const修飾的對象,該對象的任何非const成員函數都不能被調用,由於任何非const成員函數會有修改爲員變量的企圖,只能調用類的const成員函數。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
class  AAA
{
    void  func1();
    void  func2()  const ;
}
const  AAA aObj;
aObj.func1();  //錯誤
aObj.func2();  //正確
 
const  AAA* aObj =  new  AAA();
aObj->func1();  //錯誤
aObj->func2();  //正確

 

const修飾數據成員

const數據成員只在某個對象生存期內是常量,而對於整個類而言倒是可變的。由於類能夠建立多個對象,不一樣的對象其const數據成員的值能夠不一樣。因此不能在類聲明中初始化const數據成員由於類的對象未被建立時,編譯器不知道const 數據成員的值是什麼,例如:
class A
{
    const int size = 100;   //錯誤
    int array[size];            //錯誤,未知的size
}
const數據成員的初始化只能在類的構造函數的初始化列表中進行。

要想創建在整個類中都恆定的常量,能夠用類中的枚舉常量來實現,例如:
class A
{

enum {size1=100, size2 = 200 };

int array1[size1];

int array2[size2];

}

  枚舉常量不會佔用對象的存儲空間他們在編譯時被所有求值。可是枚舉常量的隱含數據類型是整數,其最大值有限,且不能表示浮點數。

 

const修飾成員函數

const修飾類的成員函數,用const修飾的成員函數不能改變對象的成員變量

把const寫在成員函數的最後

 void function()  const;   //常成員函數, 它不改變對象的成員變量. 也不能調用類中任何非const成員函數

 

const修飾成員函數的返回值

把const寫在成員函數的最前面

一般,不建議用const修飾函數的返回值類型爲某個對象或對某個對象引用的狀況。 

1
2
3
4
const  char  * GetString( void );
char  *str=GetString();  //將出現編譯錯誤
//正確的用法是:
const  char  *str=GetString();  //返回值只能被賦給加const修飾的同類型指針

 

const常量與define宏定義的區別

l  編譯器處理方式不一樣

define宏是在預處理階段展開。

const常量是編譯運行階段使用。

l  類型和安全檢查不一樣

define宏沒有類型,不作任何類型檢查,僅僅是展開。

const常量有具體的類型,在編譯階段會執行類型檢查。

l  存儲方式不一樣

define宏僅僅是展開,有多少地方使用,就展開多少次,不會分配內存

const常量會在內存中分配(能夠是堆中也能夠是棧中)

 

mutable關鍵字

mutalbe的中文意思是「可變的,易變的」,跟constant(既C++中的const)是反義詞。在C++中,mutable也是爲了突破const的限制而設置的。

被mutable修飾的變量(mutable只能用於修飾類的非靜態數據成員),將永遠處於可變的狀態,即便在一個const函數中。

1
2
3
4
5
6
7
8
9
10
11
class  ClxTest
{
     public :
     void  Output()  const ;
     private :
     mutable  int  m_iTimes;
};
void  ClxTest::Output()  const
{
     return  ++m_iTimes;
}
相關文章
相關標籤/搜索