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;
}
|