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

C++11新特性之四種類型轉(zhuǎn)換cast說明

 更新時間:2023年02月09日 13:01:55   作者:面條有點辣  
類型轉(zhuǎn)換是項目中常使用的一種語法規(guī)則,幾乎每個編程語言都不可避免的涉及到這方面,下面這篇文章主要給大家介紹了關(guān)于C++11新特性之四種類型轉(zhuǎn)換cast說明的相關(guān)資料,需要的朋友可以參考下

引言

C++11引入了四種類型轉(zhuǎn)換接口,它們分別是static_cast、const_cast、dynamic_cast、reinterpret_cast。

為什么要使用這四種轉(zhuǎn)換呢?

給出面向?qū)ο缶幊毯兔嫦驅(qū)ο笤O(shè)計的五個基本原則,SOLID原則。

  • Single Responsibility Principle:單一職責(zé)原則
  • Open Closed Principle:開閉原則
  • Liskov Substitution Principle:里氏替換原則
  • Law of Demeter:迪米特法則
  • Interface Segregation Principle:接口隔離原則
  • Dependence Inversion Principle:依賴倒置原則

這里不詳細(xì)敘述五個基本原則,我們使用的cast接口和里氏替換原則有關(guān)。

里氏替換原則: “派生類(子類)對象可以在程式中代替其基類(超類)對象。” 以上內(nèi)容并非利斯科夫的原文,而是譯自羅伯特·馬?。≧obert Martin)對原文的解讀[1]

1、static_cast

1.1 基本類型轉(zhuǎn)換

1.2 類的上行轉(zhuǎn)換(安全)

用于子類指針或引用轉(zhuǎn)換為父類指針或引用。

#include <iostream>
using namespace std;

class Base
{
public:
    Base() {};
    virtual void Show() { cout << "This is Base class"; }
};
class Derived :public Base
{
public:
    Derived() {};
    void Show() { cout << "This is Derived class"; }
};
int main()
{
    Derived* der = new Derived;
    auto  Derived = static_cast<Base*> (der);
    //向上轉(zhuǎn)換一直是安全的
    Derived->Show();
    system("pause");
}

輸出結(jié)果為

This is Derived class

存在虛函數(shù)重載,則父類的函數(shù)被隱藏不能使用。

由于使用dynamic_caststatic_cast方法會存在開銷,則一般使用下列方法進(jìn)行向上轉(zhuǎn)換。

class Base
{
public:
    Base(){};
    virtual void Show(){cout<<"This is Base class";}
};
class Derived:public Base
{
public:
    Derived(){};
    void Show(){cout<<"This is Derived class";}
};
int main()
{
    Base *base ;
    Derived *der = new Derived;
    //向上轉(zhuǎn)換總是安全
    base = der; 
    base->Show();
    system("pause");
}

1.3 類的下行轉(zhuǎn)換(不安全)

將父類指針、引用轉(zhuǎn)換為子類指針、引用,但需要程序員自己檢查,因此這種轉(zhuǎn)換方式也不存在額外的開銷。

2、const_cast

2.1 改變常量屬性

  • 常量指針轉(zhuǎn)化為非常量指針;
  • 常量引用轉(zhuǎn)化為非常量引用;
  • 常量對象轉(zhuǎn)化為非常量對象

3、dynamic_cast

該轉(zhuǎn)換是運行時轉(zhuǎn)換,其余都是編譯時轉(zhuǎn)換。主要用于安全的向下進(jìn)行轉(zhuǎn)換。同時當(dāng)指針是智能指針時,使用dynamic_cast向下轉(zhuǎn)換不能成功,需使用dynamic_point_cast來進(jìn)行轉(zhuǎn)換。

3.1 類的上行轉(zhuǎn)換(安全)

此處和static_cast是一樣的,不再過多敘述。

#include <iostream>
using namespace std;

class Base
{
public:
    Base() {};
    virtual void Show() { cout << "This is Base calss"; }
};
class Derived :public Base
{
public:
    Derived() {};
    void Show() { cout << "This is Derived class"; }
};
int main()
{
    Derived* der = new Derived;
    auto  Derived = dynamic_cast<Base*> (der);
    //向上轉(zhuǎn)換一直是安全的
    Derived->Show();
    system("pause");
}

3.2 類的下行轉(zhuǎn)換(安全)

因為有類型檢查所以是安全的,但類型檢查需要運行時類型信息,這個信息位于虛函數(shù)表中,所以必須要有虛函數(shù),否則會轉(zhuǎn)換失敗。
在dynamic_cast轉(zhuǎn)換中分為兩種情況。

1、當(dāng)基類指針指向派生對象時能夠安全轉(zhuǎn)換。

2、基類指針指向基類時會做檢查,轉(zhuǎn)換失敗,返回結(jié)果0。

#include <iostream>
using namespace std;

class Base
{
public:
    Base() {};
    virtual void Show() { cout << "This is Base class" << endl; }
};
class Derived :public Base
{
public:
    Derived() {};
    void Show() { cout << "This is Derived class" << endl; }
};
int main()
{
    //第一種情況
    Base* base = new Derived;
    Derived* der = dynamic_cast<Derived*>(base);
    //基類指針指向派生類對象時能夠安全轉(zhuǎn)換
    der->Show();
    //第二種情況
    Base *base1 = new Base;

    if (Derived* der1 = dynamic_cast<Derived*> (base1))
    {
        der1->Show();
    }
    else
    {
        cout << "error!";
    }
    delete(base);
    delete(base1);
    system("pause");
}

This is Derived class
error!

引用則和指針不同,指針在C++11中存在空指針,而引用不存在空引用,會引發(fā)bad_cast異常。

#include <iostream>
using namespace std;

class Base
{
public:
    Base() {};
    virtual void Show() { cout << "This is Base class" << endl; }
};
class Derived :public Base
{
public:
    Derived() {};
    void Show() { cout << "This is Derived class" << endl; }
};
int main()
{
    //基類引用子類
    Derived b;
    Base& base1 = b;
    Derived& der1 = dynamic_cast<Derived&>(base1);
    der1.Show();

    //基類引用基類
    Base a;
    Base& base2 = a;
    try
    {
        Derived& der2 = dynamic_cast<Derived&>(base2);
    }
    catch(bad_cast)
    {
        cout << "bad_cast error!!" << endl;
    }
    system("pause");
}

This is Derived class
bad_cast error!!

4、reinterpret_cast

4.1 非關(guān)聯(lián)類型的轉(zhuǎn)換

操作結(jié)果是一個指針到其他指針的二進(jìn)制拷貝,沒有類型檢查。

總結(jié)

到此這篇關(guān)于C++11新特性之四種類型轉(zhuǎn)換cast說明的文章就介紹到這了,更多相關(guān)C++11類型轉(zhuǎn)換cast內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言遞歸應(yīng)用實現(xiàn)掃雷游戲

    C語言遞歸應(yīng)用實現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C語言遞歸應(yīng)用實現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C/C++中可變參數(shù)的用法詳細(xì)解析

    C/C++中可變參數(shù)的用法詳細(xì)解析

    可變參數(shù)的使用方法遠(yuǎn)遠(yuǎn)不止以下介紹的幾種,不過在C,C++中使用可變參數(shù)時要小心,在使用printf()等函數(shù)時傳入的參數(shù)個數(shù)一定不能比前面的格式化字符串中的’%’符號個數(shù)少,否則會產(chǎn)生訪問越界,運氣不好的話還會導(dǎo)致程序崩潰
    2013-09-09
  • 貪吃蛇C語言代碼實現(xiàn)(難度可選)

    貪吃蛇C語言代碼實現(xiàn)(難度可選)

    這篇文章主要為大家詳細(xì)介紹了貪吃蛇C語言代碼實現(xiàn),游戲難度可供選擇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • VS2019中在源文件中如何使用自己寫的頭文件

    VS2019中在源文件中如何使用自己寫的頭文件

    通過頭文件的形式直接調(diào)用自定義的函數(shù),從而免去對函數(shù)的原型進(jìn)行聲明,本文就詳細(xì)的介紹一下VS2019中在源文件中如何使用自己寫的頭文件,感興趣的可以了解一下
    2021-09-09
  • C語言操作XML文件的技術(shù)和方法

    C語言操作XML文件的技術(shù)和方法

    XML因其靈活性和標(biāo)準(zhǔn)化特性,被廣泛應(yīng)用于數(shù)據(jù)交換、配置文件、Web服務(wù)等領(lǐng)域,C語言作為一種高效、底層的編程語言,在處理XML數(shù)據(jù)方面也有廣泛的應(yīng)用,本文將深入探討C語言操作XML的技術(shù)和方法,需要的朋友可以參考下
    2025-03-03
  • C語言實現(xiàn)十六進(jìn)制轉(zhuǎn)換為十進(jìn)制的方法詳解

    C語言實現(xiàn)十六進(jìn)制轉(zhuǎn)換為十進(jìn)制的方法詳解

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)十六進(jìn)制轉(zhuǎn)換為十進(jìn)制的方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,需要的可以參考一下
    2022-11-11
  • C++超集C++/CLI模塊的基本用法

    C++超集C++/CLI模塊的基本用法

    這篇文章介紹了C++超集C++/CLI模塊的基本用法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • C語言實現(xiàn)經(jīng)典排序算法的示例代碼

    C語言實現(xiàn)經(jīng)典排序算法的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C語言實現(xiàn)經(jīng)典排序算法中的冒泡排序、選擇排序、插入排序、希爾排序,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-08-08
  • 基于C語言char與unsigned char的區(qū)別介紹

    基于C語言char與unsigned char的區(qū)別介紹

    本篇文章小編為大家介紹,基于C語言char與unsigned char的區(qū)別介紹。需要的朋友參考下
    2013-04-04
  • 解析VC中創(chuàng)建DLL,導(dǎo)出全局變量,函數(shù)和類的深入分析

    解析VC中創(chuàng)建DLL,導(dǎo)出全局變量,函數(shù)和類的深入分析

    本篇文章是對VC中創(chuàng)建DLL,導(dǎo)出全局變量,函數(shù)和類進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評論

措美县| 白玉县| 顺平县| 黄冈市| 集贤县| 大方县| 平凉市| 堆龙德庆县| 平原县| 噶尔县| 钟祥市| 和平县| 沂源县| 中超| 漠河县| 天津市| 陇川县| 惠来县| 张家港市| 沁源县| 曲水县| 绍兴市| 平昌县| 秀山| 东平县| 泾源县| 宝应县| 湾仔区| 汨罗市| 竹北市| 五台县| 中牟县| 耿马| 高淳县| 禹城市| 龙门县| 昌吉市| 鲜城| 平乡县| 平泉县| 房山区|