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