C++面試八股文之static_cast你了解嗎
某日二師兄參加X(jué)XX科技公司的C++工程師開(kāi)發(fā)崗位第20面:
面試官:C++中支持哪些類型轉(zhuǎn)換?
二師兄:C++支持C風(fēng)格的類型轉(zhuǎn)換,并在C++11引入新的關(guān)鍵字規(guī)范了類型轉(zhuǎn)換。
二師兄:C++11引入四種新的類型轉(zhuǎn)換,分別是static_cast
、dynamic_cast
、const_cast
、和reinterpret_cast
。
二師兄:static_cast
用途最廣泛,除了后面三種類型轉(zhuǎn)換外,其他的類型轉(zhuǎn)換都能使用static_cast
完成。
二師兄:dynamic_cast
主要用于運(yùn)行時(shí)的從父類指針向子類指針轉(zhuǎn)換,如果轉(zhuǎn)換不成功則返回nullptr
。
#include <iostream> struct Base { virtual void fun() {} }; struct Derived : public Base { virtual void fun() override {} }; int main(int argc, char const *argv[]) { Base* b1 = new Base; Base* b2 = new Derived; Derived* d1 = dynamic_cast<Derived*>(b1); //d1 == nullptr Derived* d2 = dynamic_cast<Derived*>(b2); //d2 != nullptr }
二師兄:const_cast
主要用于去除指針或引用類型的const
屬性。此操作可能會(huì)導(dǎo)致未定義的行為,所以需要慎用。
#include <iostream> void function(const int& val) { int& v = const_cast<int&>(val); v = 42; } int main(int argc, char const *argv[]) { int val = 1024; function(val); std::cout << val << std::endl; //val == 42 } //----------------------------------------------- #include <iostream> static constexpr int val_static = 1024; void function(const int& val) { int& v = const_cast<int&>(val); v = 42; } int main(int argc, char const *argv[]) { function(val_static); std::cout << val_static << std::endl; } // Segmentation fault
二師兄:reinterpret_cast
可以將指針或引用轉(zhuǎn)換為任何類型的指針或引用。reinterpret_cast
實(shí)現(xiàn)依賴于編譯器和硬件,可能導(dǎo)致未定義的行為。
#include <iostream> int main(int argc, char const *argv[]) { int i = 42; double d = 42.0; long* l1 = reinterpret_cast<long*>(&i); long* l2 = reinterpret_cast<long*>(&d); std::cout << *l1 << std::endl; //*i1 == 42 std::cout << *l2 << std::endl; //*i2 == 4631107791820423168 X86_64 GCC 11.3 }
面試官:好的。既然已經(jīng)有C風(fēng)格的類型轉(zhuǎn)換,C++11為什么還要引入新的類型轉(zhuǎn)換關(guān)鍵字?
二師兄:主要有三點(diǎn),更安全、更靈活、可讀性更好。
面試官:知道什么是隱式轉(zhuǎn)換嗎?
二師兄:了解一些。隱式轉(zhuǎn)換是指在表達(dá)式中自動(dòng)進(jìn)行的類型轉(zhuǎn)換。比如int
和 double
相加,會(huì)把int
先轉(zhuǎn)為double
,然后再進(jìn)行求和。
面試官:隱式轉(zhuǎn)換有哪些優(yōu)勢(shì)和缺陷?
二師兄:隱式轉(zhuǎn)換的優(yōu)勢(shì)是代碼簡(jiǎn)潔。但是有很大缺陷,有些情況隱式轉(zhuǎn)換的結(jié)果和程序員的意圖不一致,會(huì)導(dǎo)致難以發(fā)現(xiàn)的問(wèn)題。所以在實(shí)際項(xiàng)目中一般會(huì)添加編譯選項(xiàng)-Werror=conversion
來(lái)禁止隱式轉(zhuǎn)換。
面試官:那你知道explicit
關(guān)鍵字有什么作用嗎?
二師兄:也是禁止隱式轉(zhuǎn)換的一個(gè)方式:
struct Foo { Foo(int i):val_(i){} int val_; }; struct Goo { explicit Goo(int i):val_(i){} int val_; }; void function1(Foo f){} void function2(Goo g){} int main(int argc, char const *argv[]) { Foo f = 1024; //編譯通過(guò),可以把int類型轉(zhuǎn)換成Foo Goo g = 1024; //編譯失敗,不能把int類型轉(zhuǎn)換成Goo function1(42); //編譯通過(guò),可以把int類型轉(zhuǎn)換成Foo function2(42); //編譯失敗,不能把int類型轉(zhuǎn)換成Goo }
面試官:如何把一個(gè)自定義類型轉(zhuǎn)換成一個(gè)int
類型?
二師兄:需要重載operator int()
運(yùn)算符:
#include <iostream> struct Foo { Foo(double d):val_(d){} double val_; explicit operator int(){ return static_cast<int>(val_); } }; int main(int argc, char const *argv[]) { Foo f(42.5); int i = static_cast<int>(f); std::cout << i << std::endl; //i == 42 }
面試官:好的,回去等消息吧。
到此這篇關(guān)于C++面試八股文之static_cast你了解嗎的文章就介紹到這了,更多相關(guān)C++ static_cast內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言數(shù)據(jù)在內(nèi)存中的存儲(chǔ)流程深入分析
使用編程語(yǔ)言進(jìn)行編程時(shí),需要用到各種變量來(lái)存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類型,來(lái)分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么2022-10-10C++實(shí)踐數(shù)組類運(yùn)算的實(shí)現(xiàn)參考
今天小編就為大家分享一篇關(guān)于C++實(shí)踐數(shù)組類運(yùn)算的實(shí)現(xiàn)參考,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02Qt 實(shí)現(xiàn)鋼筆畫(huà)線效果示例及詳細(xì)原理
這篇文章主要介紹了Qt 實(shí)現(xiàn)鋼筆畫(huà)線效果示例及詳細(xì)原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04C語(yǔ)言動(dòng)態(tài)與靜態(tài)分別實(shí)現(xiàn)通訊錄詳細(xì)過(guò)程
這篇文章主要為大家介紹了C語(yǔ)言動(dòng)態(tài)與靜態(tài)分別實(shí)現(xiàn)通訊錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02關(guān)于C++函數(shù)模版的實(shí)現(xiàn)講解
今天小編就為大家分享一篇關(guān)于關(guān)于C++函數(shù)模版的實(shí)現(xiàn)講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12C語(yǔ)言實(shí)現(xiàn)職工管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)職工管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11