程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [C/C++學習]之三、const_cast

[C/C++學習]之三、const_cast

編輯:C++入門知識

用法: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,我們編譯通過了!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved