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

詳解C++中常用的四種類型轉(zhuǎn)換方式

 更新時(shí)間:2022年08月18日 17:02:04   作者:lhb2998658795  
這篇文章主要為大家詳細(xì)介紹了C++中常用的四種類型轉(zhuǎn)換方式:static_cast<Type>、dynamic_cast<Type>、const_case<Type>和reinterpret_cast,感興趣的可以了解一下

1.靜態(tài)類型轉(zhuǎn)換:static_cast(exp)

1.1靜態(tài)類型轉(zhuǎn)換主要用于兩種轉(zhuǎn)換環(huán)境

1.1.1 C++內(nèi)置類型的轉(zhuǎn)換:與C風(fēng)格強(qiáng)轉(zhuǎn)類似。

與c相同的地方:

#include <iostream>
 
using namespace std;
 
int main()
{
    double a=3.14;
 
    cout << static_cast<int>(a) << endl;
 
    return 0;
}

不同的地方就是使用static_cast不能強(qiáng)轉(zhuǎn)內(nèi)置類型指針的,這點(diǎn)可以避免C風(fēng)格中的越界問題。

如圖所示:

1.1.2當(dāng)有繼承關(guān)系存在時(shí)的強(qiáng)轉(zhuǎn):

如果使用static_cast 由子類向父類轉(zhuǎn)型,向上轉(zhuǎn)型,天然安全安全。(應(yīng)為子類的空間肯定比父類的空間大,子類是在繼承父類的空間上面開辟),代碼如下:

#include <iostream>
 
using namespace std;
 
class A
{
public:
    int a=100;
 
    void Ashow_info()
    {
        cout<<this->a<<endl;
    }
};
 
class B:public A
{
public:
    int a=200;
    int b=300;
    int c=400;
    void Bshow_info()
    {
        cout<<this->a<<this->b<<this->c<<endl;
    }
};
 
 
int main()
{
   B* a=new B;
   static_cast<A*>(a)->Ashow_info();
 
    return 0;
}

結(jié)果圖:

我們可以通過子類安全的訪問到父類中的a值。

如果使用static_cast 由父類向子類轉(zhuǎn)型,向下轉(zhuǎn)型,是不安全。

那么何時(shí)不安全?何時(shí)安全?

不安全的情況介紹:

#include <iostream>
 
using namespace std;
 
class A
{
public:
    int a=100;
 
    void Ashow_info()
    {
        cout<<this->a<<endl;
    }
};
 
class B:public A
{
public:
    int a=200;
    int b=300;
    int c=400;
    void Bshow_info()
    {
        cout<<this->a<<this->b<<this->c<<endl;
    }
};
 
 
int main()
{
   A* a=new A;
   static_cast<B*>(a)->Bshow_info();
 
    return 0;
}

結(jié)果圖:

如圖所示結(jié)果中并沒有出現(xiàn)本應(yīng)該打出的200,300,400,這就是不知道子類空間是否被開辟而向下訪問造成的結(jié)果。

安全的情況:

#include <iostream>
 
using namespace std;
 
class A
{
public:
    int a=100;
 
    void Ashow_info()
    {
        cout<<this->a<<endl;
    }
};
 
class B:public A
{
public:
    int a=200;
    int b=300;
    int c=400;
    void Bshow_info()
    {
        cout<<this->a<<this->b<<this->c<<endl;
    }
};
 
 
int main()
{
   A* a=new B;
   static_cast<B*>(a)->Bshow_info();
 
    return 0;
}

結(jié)果圖:

如圖所示,此時(shí)我們可以打出200,300,400,等數(shù)值,說明當(dāng)我們知道子類空間被開辟時(shí)候,就可以安全的向下訪問。

2.動(dòng)態(tài)類型轉(zhuǎn)換:dynamic_cast(exp)

2.1概念

動(dòng)態(tài)類型轉(zhuǎn)換是依賴于虛函數(shù)的與繼承關(guān)系,沒有虛函數(shù),就無法使用動(dòng)態(tài)類型轉(zhuǎn)換。dynamic_cast是一個(gè)安全類型轉(zhuǎn)換,因?yàn)樗且蕾囉诤瘮?shù)實(shí)現(xiàn)動(dòng)態(tài)轉(zhuǎn)型。因?yàn)樘摫碇械牡谝粋€(gè)Slot位置保存了類型運(yùn)行識別信息。

注意使用的條件為:1)要有繼承關(guān)系 2)要有虛函數(shù)。

這個(gè)虛表的結(jié)構(gòu):

2.2代碼舉例說明

#include <iostream>
 
using namespace std;
 
class A
{
public:
 
 
    virtual void show_info()
    {
        cout<<"我是父親"<<endl;
    }
};
 
class B:public A
{
public:
 
    void show_info()
    {
        cout<<"我是兒子"<<endl;
    }
};
 
 
int main()
{
   A* a=new B;
   dynamic_cast<B*>(a)->show_info();
 
    return 0;
}

結(jié)果圖:

3.常類型轉(zhuǎn)換:const_case(exp)

就是用來修改const修飾的常引用和常指針的轉(zhuǎn)換方式

3.1代碼說明

#include <iostream>
 
using namespace std;
 
int main()
{
    const int& a=100;
 
    const_cast<int&>(a)=200;
 
    cout<<a<<endl;
 
 
    return 0;
}

結(jié)果圖:

由圖可知我們修改了常引用的數(shù)值。

4. 解釋類型轉(zhuǎn)換: reinterpret_cast(exp)

4.1概念

這要類型轉(zhuǎn)換方式,是可以慶用于任何類型,他的底層的實(shí)現(xiàn)就是對底層二進(jìn)制數(shù)據(jù)的一個(gè)拷貝。所以也是一個(gè)不安全的強(qiáng)轉(zhuǎn)。

4.2由于這個(gè)一般都不用,從我們最有可能的會(huì)用到的情況下抽出來一種,代碼如下:

當(dāng)我們想把一個(gè)數(shù)的地址,用10進(jìn)制的表達(dá)出來的時(shí)候,如下,光一個(gè)int 是裝不下地址的十進(jìn)制,所以系統(tǒng)就會(huì)給我們報(bào)錯(cuò)。

 這個(gè)時(shí)候reinterpert_cast就起到了作用,我們可以把他轉(zhuǎn)為long long類型,如下:

#include <iostream>
 
using namespace std;
 
int main()
{
  int a=10;
 
  int *p=&a;
 
 
  cout<<reinterpret_cast<long long>(p)<<endl;
    return 0;
}

結(jié)果圖:

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

相關(guān)文章

  • C++通過msxml調(diào)用webservice示例分享

    C++通過msxml調(diào)用webservice示例分享

    這篇文章主要介紹了C++通過msxml調(diào)用webservice示例分享,需要的朋友可以參考下
    2014-03-03
  • C++中string字符串分割函數(shù)split()的4種實(shí)現(xiàn)方法

    C++中string字符串分割函數(shù)split()的4種實(shí)現(xiàn)方法

    最近筆試經(jīng)常遇到需要對字符串進(jìn)行快速分割的情景,下面這篇文章主要給大家介紹了關(guān)于C++中string字符串分割函數(shù)split()的4種實(shí)現(xiàn)方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • C語言小知識之為什么要使用指針詳析

    C語言小知識之為什么要使用指針詳析

    指針是C語言中一個(gè)非常重要的概念,也是C語言的特色之一,使用指針可以對復(fù)雜數(shù)據(jù)進(jìn)行處理,能對計(jì)算機(jī)的內(nèi)存分配進(jìn)行控制,在函數(shù)調(diào)用中使用指針還可以返回多個(gè)值,這篇文章主要給大家介紹了C語言小知識之為什么要使用指針的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • 利用C++實(shí)現(xiàn)計(jì)算機(jī)輔助教學(xué)系統(tǒng)

    利用C++實(shí)現(xiàn)計(jì)算機(jī)輔助教學(xué)系統(tǒng)

    我們都知道計(jì)算機(jī)在教育中起的作用越來越大。這篇文章主要為大家詳細(xì)介紹了如何利用C++編寫一個(gè)計(jì)算機(jī)輔助教學(xué)系統(tǒng),感興趣的可以了解一下
    2023-05-05
  • 解析C/C++指針、函數(shù)、結(jié)構(gòu)體、共用體

    解析C/C++指針、函數(shù)、結(jié)構(gòu)體、共用體

    這篇文章主要介紹了C/C++指針、函數(shù)、結(jié)構(gòu)體、共用體的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • c++??復(fù)制消除問題解決示例詳析

    c++??復(fù)制消除問題解決示例詳析

    這篇文章主要為大家介紹了c++??復(fù)制消除問題解決示例詳析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 詳解C/C++實(shí)現(xiàn)各種字符轉(zhuǎn)換方法合集

    詳解C/C++實(shí)現(xiàn)各種字符轉(zhuǎn)換方法合集

    這篇文章主要為大家詳細(xì)介紹了C/C++中實(shí)現(xiàn)各種字符轉(zhuǎn)換的方法,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C++具有一定借鑒價(jià)值,需要的可以參考一下
    2022-09-09
  • MFC中exe圖標(biāo)修改的方法

    MFC中exe圖標(biāo)修改的方法

    修改窗口標(biāo)題圖標(biāo)可通過導(dǎo)入圖標(biāo),然后在CMainFrame.:OnCreate函數(shù)中加載圖標(biāo)即可, 代碼如下:
    2013-04-04
  • 基于C++實(shí)現(xiàn)BMI身體質(zhì)量指數(shù)計(jì)算工具

    基于C++實(shí)現(xiàn)BMI身體質(zhì)量指數(shù)計(jì)算工具

    BMI(Body?Mass?Index,身體質(zhì)量指數(shù)),也稱為體重指數(shù),是一種常用的衡量成人人體肥胖程度的指標(biāo),本文就來用C++編寫一個(gè)簡單的BMI計(jì)算工具吧
    2023-10-10
  • OpenCV實(shí)現(xiàn)車牌字符分割(C++)

    OpenCV實(shí)現(xiàn)車牌字符分割(C++)

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)車牌字符分割,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11

最新評論