用法:const_cast<type_id> (expression)
此運算符是用來消除類型的const和volatile屬性的。
看到const_cast的你應該知道,他是用來轉換掉表達式的const性質的。對也,只有使用我們的const_cast才能將const性質轉換掉!
ok,我們來看一段代碼:
[cpp]
const char m = 't';
const char *cm = &m;
char *n = const_cast<char*>(cm);
*n = 'a';
cout << *n << endl;
很好,代碼編譯通過,你應該能看的出來,他的結果不應該是‘t'吧,對的 最後的輸出結果是’a',我們給n指針所指向的變量重新變了值了~ 很好,這就是我們的const_cast的功勞!
但是如果是這樣:
[cpp]
const char m = 't';
const char *cm = &m;
char *n = cm;
*n = 'a';
cout << *n << endl;
很悲劇,無法編譯通過!
看到上面兩段代碼大家應該稍微有點明白了吧,但是再看下面:
[cpp]
const char m = 't';
const char *cm = &m;
char *n = (char*)cm;
*n = 'a';
cout << *n << endl;
oh。。編譯也是通過的,而且最後的結果還是a~~,這是為什麼呢 ?
其實,在C++中,指針之間的轉換是不檢查類型的,他們是任意轉換的,什麼指針都可以轉換!
就是這樣!
哦 對了,const_cast是不能用來執行任何類型的轉換的,這樣都會引起編譯錯誤的!
[cpp]
const char m = 't';
const char *cm = &m;
int *n = const_cast<int*>(cm);
*n = 'a';
cout << *n << endl;
很不幸,這段代碼報錯了,看一下錯誤提示:
oh~ 確實是這樣的!
說到這裡我想說一下,絕對不要去修改const變量的值, 但是這樣說的話要const_cast有什麼用呢?
在這裡《C++Primer 第四版》中有一個例子,假設有一個函數s,他有一個唯一的參數是char*類型的,我們對他只讀,不寫! 在訪問這個函數的時候,我們最好的選擇是修改它讓它接受const char*類型的參數! 但是如果不行的話 我們就要用const_cast,用一個const值調用s函數了!
[cpp]
void s(char *)
{
cout << 'a' << endl;
}
char a = 's';
const char *ss = &a;
s(const_cast<char*> (ss));
ok,我們編譯通過了!