最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

某日二師兄參加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++?OpenMP簡(jiǎn)單介紹

    C++?OpenMP簡(jiǎn)單介紹

    這篇文章主要介紹了C++?OpenMP簡(jiǎn)介,OpenMP?還支持自定義數(shù)據(jù)類型的歸約操作,需要通過(guò)omp?declare?reduction指令來(lái)聲明自定義操作符和數(shù)據(jù)類型的歸約方式,感興趣的朋友一起看看吧
    2023-05-05
  • Qt中導(dǎo)航欄實(shí)現(xiàn)的詳細(xì)指南

    Qt中導(dǎo)航欄實(shí)現(xiàn)的詳細(xì)指南

    在現(xiàn)代的圖形用戶界面中,工具欄是提供快速訪問(wèn)常用功能和命令的重要組件,本文主要介紹了Qt中導(dǎo)航欄實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • 如何在c++中實(shí)現(xiàn)字符串分割函數(shù)split詳解

    如何在c++中實(shí)現(xiàn)字符串分割函數(shù)split詳解

    這篇文章主要給大家介紹了關(guān)于如何在c++中實(shí)現(xiàn)字符串分割函數(shù)split的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • C++中strlen(),sizeof()與size()的區(qū)別

    C++中strlen(),sizeof()與size()的區(qū)別

    本文主要介紹了C++中strlen(),sizeof()與size()的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • VC++中HTControl控件類的CHTSlider控制桿控件類簡(jiǎn)介

    VC++中HTControl控件類的CHTSlider控制桿控件類簡(jiǎn)介

    這篇文章主要介紹了VC++中HTControl控件類的CHTSlider控制桿控件類,需要的朋友可以參考下
    2014-08-08
  • VSCode多根工作區(qū)功能實(shí)現(xiàn)

    VSCode多根工作區(qū)功能實(shí)現(xiàn)

    VSCode的多根工作區(qū)功能允許在一個(gè)窗口內(nèi)同時(shí)處理多個(gè)文件夾,適用于前后端分離項(xiàng)目、Monorepo項(xiàng)目管理、微服務(wù)架構(gòu)開(kāi)發(fā)等場(chǎng)景,本文主要介紹了VSCode多根工作區(qū)功能實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-12-12
  • C++單一職責(zé)原則示例代碼淺析

    C++單一職責(zé)原則示例代碼淺析

    我們?cè)谠O(shè)計(jì)一個(gè)類時(shí)要學(xué)會(huì)發(fā)現(xiàn)職責(zé),并把那些職責(zé)相互分離,其實(shí)要去判斷是否應(yīng)該分離出一個(gè)類來(lái)并不難,前面說(shuō)過(guò),一個(gè)類應(yīng)該只有一個(gè)引起它變化的原因,如果你能想到其它的原因也能去改變這個(gè)類,那么這個(gè)類就具有多于1個(gè)的職責(zé),就應(yīng)該考慮類的職責(zé)分離
    2023-02-02
  • 利用C語(yǔ)言替換文件中某一行的方法

    利用C語(yǔ)言替換文件中某一行的方法

    大家都知道C語(yǔ)言提供了文件操作,但是替換文件的某一行比較麻煩,下面是我使用的一個(gè)方法,現(xiàn)在分享給大家,有需要的朋友們可以參考借鑒。
    2016-09-09
  • C++繼承介紹

    C++繼承介紹

    C++繼承可以是單一繼承或多重繼承,每一個(gè)繼承連接可以是public,protected,private也可以是virtual或non-virtual
    2013-01-01
  • OpenCV實(shí)現(xiàn)圖像連通域

    OpenCV實(shí)現(xiàn)圖像連通域

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)圖像連通域,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06

最新評(píng)論

衡南县| 惠东县| 宁津县| 清新县| 北宁市| 西平县| 沅陵县| 清徐县| 望江县| 偃师市| 辉县市| 盐城市| 阜新| 囊谦县| 乌什县| 临沧市| 铜陵市| 福清市| 太原市| 河源市| 库车县| 滕州市| 碌曲县| 黑山县| 千阳县| 吐鲁番市| 湘潭县| 明水县| 汤原县| 宜城市| 珠海市| 盐城市| 商城县| 呼图壁县| 松桃| 阳城县| 左权县| 晋江市| 县级市| 莱西市| 苏州市|