C++是一門類型安全(type-safe)的編程語言,它對類型的檢查是十分嚴格的。一個const char*類型的數據是不允許被修改的,如果程序違反了這條規定,編譯器將毫不留情地提示錯誤,不讓通過。作爲程序員,須知道這樣的限制是很有實際意義的,畢竟大多數情況下我們需要類型安全的代碼。但是有的時候,我們真的需要修改const char*類型的數據,怎麼辦?沒問題,C++同樣也是一門相當靈活的編程語言,它提供了const_cast<>專門處理這種需求。
舉個例子。看下面的代碼:
char szArray[]="Constring";
const char* str1=szArray;
str1[0]='c'; //#1 Error
char* str=const_cast<char*>(str1);
str[0]='c'; //#2 OK
#1處將會出錯,編譯不能通過;而一旦使用const_cast<>去除str1所指內存的常量性後,再去修改它的內容就被允許了。可見強制修改const char*類型數據的方法是:使用const_cast<>去除字符串的常量性,讓它可以被修改。
不過,有一種特別的情況不可忽視,看下面的代碼:
const char* str1="Constring";
char* str=const_cast<char*>(str1);
str[0]='c'; //#3 Runtime Error
編譯器沒有報錯,因爲上面的代碼沒有語法問題;可是,程序一旦跑起來卻會在#3處拋出了access violation異常,出現運行時錯誤。原因很簡單,"Constring"存放於常量數據區,是不可修改的。這種強制性是不容商量的,它不是語法上的約束,而是內存安全方面語義上的約束。
總結一下,一共有3點:
(1)const char*類型的數據從語法上看是不可被修改的,程序員在大多數情況真的應該“循規蹈矩”;
(2)只有在的確需要修改的時候,才使用const_cast<>轉型操作抹去const數據的常量性,進而對數據進行修改,動作雖然“粗魯”但可行;
(3)常量數據區的數據的const屬性是不容商量的,就算你用const_cast<>騙過了編譯器,程序跑起來後也一定會出現異常。