中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

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

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

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

聯(lián)系客服