C++:const_cast只能用來操作指針和引用嗎?
C++:const_cast只能用來操作指針和引用嗎?
這是一種類轉(zhuǎn)換操作符,也許是你領(lǐng)會錯了它的用法。你展示一段代碼,說說你期待的效果和實際的效果,我們可以分析看看是什么情況。
哦,剛才沒仔細(xì)想。
const_cast 是只能用于指針或者引用的。無法對變量本身使用。
c++ const_cast的問題,為啥會那樣?
con
在學(xué)習(xí)到const_cast時引發(fā)的疑惑,尋求協(xié)助,謝謝~
//問題一:不會,a仍然是常量,任何轉(zhuǎn)換都不能將被轉(zhuǎn)換對象轉(zhuǎn)換成別的形式,而只能是使用轉(zhuǎn)換后的結(jié)果。//問題二:對于C++,簡單類型的常量會視情況給予分配內(nèi)存空間或不分配而直接按符號常量來處理,當(dāng)被定義的常量后面有取該常量地址的操作時(即使用&運算符),它會被分配內(nèi)存空間而等同與C語言中的常量,當(dāng)沒有對其進(jìn)行取地址運算時,它就等同于#define定義的宏,即符號常量。
第6行中的arr也存在相同的情形,即可能被分配空間也可能被當(dāng)成符號常量,比如arr[2]可能被實現(xiàn)成*(arr+2)也可能直接將arr[2]當(dāng)成一個符號常量,這要看編譯器是否進(jìn)行了深度優(yōu)化百科。
//問題三:定義在全局?jǐn)?shù)據(jù)區(qū)中的標(biāo)識符,其中的static只有一個作用:即禁止使用extern關(guān)鍵字聲明它以在別的文件中使用該標(biāo)識符,基于此,value與普通常量沒什么差別,只是無法在別的文件中使用value而已。//問題四:在我的VC6編譯器中,即使移除static也會出現(xiàn)內(nèi)存非法操作錯誤,這個問題是C++標(biāo)準(zhǔn)中未明確規(guī)定所導(dǎo)致的,C++并沒有規(guī)定常量必須放到哪種類型的內(nèi)存中,但編譯器經(jīng)常會將常量放到只讀內(nèi)存中,而只讀內(nèi)存是不允許寫操作的,因此第四行會出現(xiàn)內(nèi)存非法操作的運行時錯誤。//問題五:value何時被重新分配內(nèi)存了?對value取地址取的就是定義value時的地址。//問題六:在你的這段代碼中,很明顯value被編譯器實現(xiàn)成了符號常量,因此*pa=10修改的是另一個“克隆”內(nèi)存區(qū),而你輸出value時等價于直接輸出5,而常量數(shù)組arr則被實現(xiàn)成非符號常量即真正的有內(nèi)存地址的常量,因此可以修改其中的值。
const_cast的問題
因為 const int i=3; 是 const,按 語言規(guī)定,初始化后 它的值將 **改變,所以 i 永遠(yuǎn)保持3。至于 這個原則是如何實現(xiàn)的,編譯器知道。
const_cast 是 指針轉(zhuǎn)換時 去掉 const 的意思。
否則 int *pb= (pa); 也通不過編譯。允許 *pb=4; 是因為 它不是 const *pa 是 const , *pa=4; 將不允許。通過 *pb=4; 而改變了 *pa 是 漏洞。