欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++面試八股文之static_cast你了解嗎

 更新時間:2023年06月21日 08:40:24   作者:二進(jìn)制架構(gòu)  
C++11引入四種新的類型轉(zhuǎn)換,分別是static_cast、dynamic_cast、const_cast、和reinterpret_cast,下面就來和大家講講static_cast中面試常考的知識點吧

某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第20面:

面試官:C++中支持哪些類型轉(zhuǎn)換?

二師兄:C++支持C風(fēng)格的類型轉(zhuǎn)換,并在C++11引入新的關(guān)鍵字規(guī)范了類型轉(zhuǎn)換。

二師兄:C++11引入四種新的類型轉(zhuǎn)換,分別是static_castdynamic_cast、const_cast、和reinterpret_cast。

二師兄:static_cast用途最廣泛,除了后面三種類型轉(zhuǎn)換外,其他的類型轉(zhuǎn)換都能使用static_cast完成。

二師兄:dynamic_cast主要用于運(yùn)行時的從父類指針向子類指針轉(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屬性。此操作可能會導(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實現(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)鍵字?

二師兄:主要有三點,更安全、更靈活、可讀性更好。

面試官:知道什么是隱式轉(zhuǎn)換嗎?

二師兄:了解一些。隱式轉(zhuǎn)換是指在表達(dá)式中自動進(jìn)行的類型轉(zhuǎn)換。比如int 和 double相加,會把int先轉(zhuǎn)為double,然后再進(jìn)行求和。

面試官:隱式轉(zhuǎn)換有哪些優(yōu)勢和缺陷?

二師兄:隱式轉(zhuǎn)換的優(yōu)勢是代碼簡潔。但是有很大缺陷,有些情況隱式轉(zhuǎn)換的結(jié)果和程序員的意圖不一致,會導(dǎo)致難以發(fā)現(xiàn)的問題。所以在實際項目中一般會添加編譯選項-Werror=conversion來禁止隱式轉(zhuǎn)換。

面試官:那你知道explicit關(guān)鍵字有什么作用嗎?

二師兄:也是禁止隱式轉(zhuǎn)換的一個方式:

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;	//編譯通過,可以把int類型轉(zhuǎn)換成Foo
    Goo g = 1024;   //編譯失敗,不能把int類型轉(zhuǎn)換成Goo
    function1(42);  //編譯通過,可以把int類型轉(zhuǎn)換成Foo
    function2(42);  //編譯失敗,不能把int類型轉(zhuǎn)換成Goo
}

面試官:如何把一個自定義類型轉(zhuǎn)換成一個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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言數(shù)據(jù)在內(nèi)存中的存儲流程深入分析

    C語言數(shù)據(jù)在內(nèi)存中的存儲流程深入分析

    使用編程語言進(jìn)行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個變量時,就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么
    2022-10-10
  • C++實踐數(shù)組類運(yùn)算的實現(xiàn)參考

    C++實踐數(shù)組類運(yùn)算的實現(xiàn)參考

    今天小編就為大家分享一篇關(guān)于C++實踐數(shù)組類運(yùn)算的實現(xiàn)參考,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • C++可以函數(shù)重載而C不可以的原因分析

    C++可以函數(shù)重載而C不可以的原因分析

    函數(shù)重載是指在同一個作用域內(nèi),可以定義多個函數(shù),它們具有相同的名稱但是參數(shù)列表不同,為什么C++可以函數(shù)重載而C不可以,接下來就有小編來給大家介紹一下C++可以函數(shù)重載而C不可以的原因,需要的朋友可以參考下
    2023-12-12
  • c語言中unsigned修飾符的使用

    c語言中unsigned修飾符的使用

    在C語言中,unsigned是一種無符號整數(shù)修飾符,本文主要介紹了c語言中unsigned修飾符的使用,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • Qt 實現(xiàn)鋼筆畫線效果示例及詳細(xì)原理

    Qt 實現(xiàn)鋼筆畫線效果示例及詳細(xì)原理

    這篇文章主要介紹了Qt 實現(xiàn)鋼筆畫線效果示例及詳細(xì)原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • C語言 指針的初始化賦值案例詳解

    C語言 指針的初始化賦值案例詳解

    這篇文章主要介紹了C語言 指針的初始化賦值案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語言動態(tài)與靜態(tài)分別實現(xiàn)通訊錄詳細(xì)過程

    C語言動態(tài)與靜態(tài)分別實現(xiàn)通訊錄詳細(xì)過程

    這篇文章主要為大家介紹了C語言動態(tài)與靜態(tài)分別實現(xiàn)通訊錄,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 關(guān)于C++函數(shù)模版的實現(xiàn)講解

    關(guān)于C++函數(shù)模版的實現(xiàn)講解

    今天小編就為大家分享一篇關(guān)于關(guān)于C++函數(shù)模版的實現(xiàn)講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C語言 變量詳解及示例代碼

    C語言 變量詳解及示例代碼

    本文主要介紹C語言 變量,這里整理了C語言 變量的基礎(chǔ)知識,并附有示例代碼和詳細(xì)講解,希望能幫助學(xué)習(xí)C語言的朋友
    2016-08-08
  • C語言實現(xiàn)職工管理系統(tǒng)

    C語言實現(xiàn)職工管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)職工管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11

最新評論