2012-04-24 39 views
0

試圖瞭解const_cast的用法。代碼如下:const_cast C++對我不起作用

const char* text="bb"; 
(const_cast<char&>(*text))='a'; 
cout<<*text; 

...產生運行時錯誤。

另一個問題,在內存中,運行時(它)如何知道這個區域是否爲常量,這種標記是什麼?

+0

恕我直言 - 這是一個壞主意使用強制轉換 - 避免它們,只有在必要時才使用它們。我有強烈的感覺,那些使用演員的人在他們的設計上有錯誤。 – 2012-04-24 18:33:56

回答

8

該代碼調用未定義的行爲;寫入字符串文字是無效的(實際上也不適用於任何const對象)。

C++標準沒有定義這將如何失敗(或者即使它必須失敗)。但在典型的平臺上,將由操作系統和底層硬件來檢測問題。 "bb"的存儲通常位於可執行文件的專用部分,該部分標記爲只讀。見例如http://en.wikipedia.org/wiki/Memory_protection

然而,const_cast的用途不會調用未定義的行爲。例如:

int x = 5; // Not a const object 

const int *p = &x; 

int *q = const_cast<int *>(p); 

*q = 6; // This is ok 
+0

爲什麼你說字符串const必須失敗,你在這裏指的是什麼? – Moatz 2012-04-24 23:28:43

+0

@Moatz:我的意思是不能保證寫入字符串文字會導致崩潰或錯誤消息。 – 2012-04-24 23:35:05

0

該字符串可能放在靜態內存中。所以這是一個未定義的行爲。 試試這個

char t[]="bb"; 
const char* text = t; 
(const_cast<char&>(*text))='a'; 
cout<<*text; 

您只能const_cast會,你知道的東西是不是真的常量。在這種情況下,即使文本是const,我們也知道它指向的是不是const的。因此我們可以安全地拋棄const。

+0

2-如何從stackoverflow獲得有關C++相關問題的通知? 3-任何建議如何得到這本書:羅伯特Sedgewick算法在C++ part1-4 最好, – Moatz 2012-04-24 23:26:39

+0

如何將字符串放置爲靜態? t []和char *之間有什麼不同? – Moatz 2012-04-24 23:27:43

+0

'char []'是一個數組。 'char *'是一個指向可能使用'char []'或''blah「'或'malloc(n)'創建的char的指針' – balki 2013-02-08 16:07:31

0

一般來說,運行時不知道是否知道某個特定變量是否實際爲const。如果拋棄const -ness,如果最終寫入一個定義爲const的變量(而不是正常變量,您碰巧有一個const指針/引用),則會得到未定義的行爲。

如果他們想要命令運行時知道const的事情,那麼當你寫入const變量時,他們可能會規定特定的行爲(例如拋出特定的異常)。有些系統很容易支持 - 但其他系統不會,所以不需要特定的響應。