欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
C++的const_cast的問(wèn)題
 C++的const_cast的問(wèn)題收藏
和上一篇文章一樣了,還是提起一下大約一年前我來(lái)公司面試所遇到的一道題目,題目很簡(jiǎn)單:C++有多少種cast,它們的名稱(chēng)和功能各是什么。(我之前的文章曾經(jīng)提到過(guò),但后來(lái)我發(fā)現自己寫(xiě)得并不夠簡(jiǎn)明)答案如下:
一共四種cast。1、static_cast,支持子類(lèi)指針到父類(lèi)指針的轉換,并根據實(shí)際情況調整指針的值,反過(guò)來(lái)也支持,但會(huì )給出編譯警告,它作用最類(lèi)似C風(fēng)格的“強制轉換”,一般來(lái)說(shuō)可認為它是安全的;2、dynamic_cast,支持子類(lèi)指針到父類(lèi)指針的轉換,并根據實(shí)際情況調整指針的值,和static_cast不同,反過(guò)來(lái)它就不支持了,會(huì )導致編譯錯誤,這種轉換是最安全的轉換;3、reinterpret_cast,支持任何轉換,但僅僅是如它的名字所描述的那樣“重解釋”而已,不會(huì )對指針的值進(jìn)行任何調整,用它完全可以做到“指鹿為馬”,但很明顯,它是最不安全的轉換,使用它的時(shí)候,你得頭腦清醒,知道自己在干什么;4、const_cast,這個(gè)轉換能剝離一個(gè)對象的const屬性,也就是說(shuō)允許你對常量進(jìn)行修改。
這樣回答即使得不了滿(mǎn)分,拿個(gè)八九十分應該也沒(méi)問(wèn)題了,我后來(lái)還專(zhuān)門(mén)寫(xiě)了些測試程序來(lái)驗證過(guò),對于第一第二第三種轉換都沒(méi)什么問(wèn)題,而const_cast卻似乎不能正常工作,代碼如下:
int main(int argc, char* argv[])
{
const int ic=100;
const_cast<int &>(ic)=200;
printf("%d\n", ic);
return 0;
}
結果不是我期待的200,而是100,我一開(kāi)始以為這是由于優(yōu)化選項的問(wèn)題,于是調整編譯器選項,全部不優(yōu)化,但還是一樣的結果,我開(kāi)始懷疑這是VC++的bug,于是使用Linux的g++來(lái)編譯,結果一樣,看來(lái)這和編譯器沒(méi)有關(guān)系,那我究竟做錯了哪里呢?或者我對const_cast理解錯了呢?我開(kāi)始改進(jìn)我的代碼,我嘗試不同的類(lèi)型:
class CTest
{
public:
CTest(int i){m_val = i;printf("construction [%d]\n", m_val);};
~CTest(){printf("destruction\n");};
void SelfAdd(){m_val++;};
int m_val;
};
int main(int argc, char* argv[])
{
const CTest test(1000);
CTest test2(1050);
const_cast<CTest &>(test)= test2;
printf("%d\n", test.m_val);
return 0;
}
這次總算得到了我想要得到結果,打印出了1050,說(shuō)明const_cast并沒(méi)有問(wèn)題,但前一個(gè)程序為什么不能正常工作?我繼續嘗試了不同的類(lèi)型,比如char,short,float,double等,發(fā)現了規律,凡是對結構體或類(lèi)進(jìn)行這個(gè)轉換,都是成功的,但對char,short等基本類(lèi)型的轉換都沒(méi)有成功。我進(jìn)一步改進(jìn)代碼,為了查看它們的值是否真的已經(jīng)被修改,我使用了指針:
int main(int argc, char* argv[])
{
const int ic = 100;
const int *pc=&ic;
const_cast<int &>(ic)++;
printf("%d,%d\n", ic, *pc);
return 0;
}
這次打印出來(lái)的結果是“100,101”,這就說(shuō)明常量ic的值確實(shí)已經(jīng)被改變了,但為什么直接打印ic就得不到正確的結果?那估計還是前邊想到的“優(yōu)化”的原因,可我一再確認我并沒(méi)有使用優(yōu)化編譯選項,而且g++的表現也如此??磥?lái)只好使用最后一招了,直接查看printf究竟做了些什么,在printf處設置斷點(diǎn),調試程序,然后打開(kāi)disassembly視圖查看反匯編代碼,一切真相大白。
原來(lái)雖然我沒(méi)有使用優(yōu)化,但系統還是對ic這個(gè)const進(jìn)行了預編譯般的替換,將它替換成“64h”(十六進(jìn)制的64就是十進(jìn)制的100),這究竟是不是C++的規范?我不知道,但我肯定這不是一般用戶(hù)想要的結果,對我來(lái)說(shuō),算是個(gè)C++的bug吧。通過(guò)解決這個(gè)問(wèn)題,我也學(xué)會(huì )了些東西,如果以后遇到類(lèi)似這種表面上再顯淺不過(guò),但就是不能正常工作的代碼片斷,要學(xué)會(huì )查看反匯編代碼,也許一切問(wèn)題迎刃而解,另外使用const_cast的時(shí)候應該注意些什么東西,嗯,自己思考一下吧。Java沒(méi)有const_cast,很多語(yǔ)言都沒(méi)有,(我只知道C++有)既然已經(jīng)被定義為常量,就是不希望它被改變,但現在又允許你改變它,這不是很可笑嗎?但難道它不是C++強大又靈活的又一體現嗎?不過(guò)話(huà)說(shuō)回來(lái)要看你怎么用了。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
C++轉型操作符
Lua腳本在C++下的舞步(入門(mén)指引)轉 | 泰然網(wǎng)
C語(yǔ)言面試題
C++類(lèi)型轉換總結
C語(yǔ)言中的const指針
C++ 類(lèi)型轉換
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久