2011-04-19 41 views
3
const int a = 1; 
int *p = const_cast<int*>(&a); 
*p = 2; 
cout << 「value a=」<< a << endl; 
cout << 「value *p=」 <<*p << endl; 
cout << 「address a=」 <<&a << endl; 
cout << 「address p=」 <<p << endl; 

輸出:C++的const_cast問題

value a=1 
value *p=2 
address a=0xbff1d48c 
address p=0xbff1d48c 

WHY ??? 爲什麼同樣的addr,diff值? 困惑。 謝謝!

+0

我喜歡它如何開始與BFF。 :) – Mehrdad 2011-04-19 03:33:53

+0

迂腐錯誤在代碼中發現這個錯誤! – 2011-04-19 04:16:19

回答

14

在C++語言中,嘗試修改常量對象是非法的。這種嘗試會導致未定義的行爲。

在您的程序中,*p = 2分配嘗試修改常量對象a。行爲是未定義的。你觀察到的怪異輸出就是:未定義的行爲。

對未定義的行爲沒有任何有意義的解釋。

(你的編譯器可能是翻譯cout << a;語句轉換成cout << 1;,因爲a值不能合法地改變。所以,不管你做你的a什麼,1總是會打印出來。)

+4

要添加一個實際的理由:可能const值被緩存在某處,因爲它是const,而另一個值不是。所以你看到了真正的價值,以及舊的價值,緩存。 (這只是一個猜測。) – 2011-04-19 03:29:59

2

除了AndreyT ,你可能會想知道,如果編輯常量給出未定義的行爲,那麼爲什麼我們需要const_cast<>const_cast<>是爲了獲得寫入權限而不是出生寫保護。只要嘗試下面的變化,它應該給予適當的行爲:

int b = 1; // 'b' is modifiable 
const int a = b; 
... 
+0

:)謝謝你〜... – 2011-04-19 03:39:41

+0

好點,雖然不是唯一的(例如'const_cast <>'也可以用來*添加*'const'限定)。 – 2011-04-19 04:11:05

+1

@Tony:static_cast(因此甚至隱式強制轉換)可用於_add_「const」限定。 'const_cast'是專門爲_remove_ const限定而設計的。 – 2011-04-19 06:36:03