真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

【C++】類型轉(zhuǎn)換-創(chuàng)新互聯(lián)

目錄

在溪湖等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站制作、成都做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作定制網(wǎng)站制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷推廣,外貿(mào)網(wǎng)站建設(shè),溪湖網(wǎng)站建設(shè)費(fèi)用合理。

一、C語言風(fēng)格類型轉(zhuǎn)換

二、C++風(fēng)格類型轉(zhuǎn)換

1.static_case

2.reinterpret_case

3、const_case

4、dynamic_case

三、RTTI

總結(jié)


一、C語言風(fēng)格類型轉(zhuǎn)換

在C語言中,如果賦值運(yùn)算符左右兩側(cè)類型不同,或者形參與實(shí)參類型不匹配,或者返回值類型與接受返回值類型不一致時(shí),就需要發(fā)生類型轉(zhuǎn)換,C語言一共有兩種形式的類型轉(zhuǎn)換

1、隱式類型轉(zhuǎn)換 :編譯器在編譯階段自動(dòng)進(jìn)行,能轉(zhuǎn)就轉(zhuǎn),不能轉(zhuǎn)就編譯失敗

2、顯示類型轉(zhuǎn)換 :需要用戶手動(dòng)轉(zhuǎn)換

無論是隱式類型轉(zhuǎn)換還是顯式類型轉(zhuǎn)換,都是要產(chǎn)生臨時(shí)對象的,并不會修改原來的對象

整型之間的轉(zhuǎn)換 :由占用內(nèi)存小的轉(zhuǎn)換為大的叫做提升

大的轉(zhuǎn)換成小的叫做截?cái)?/p>二、C++風(fēng)格類型轉(zhuǎn)換

C++提出自己的類型轉(zhuǎn)換風(fēng)格的原因是:

1、隱式類型轉(zhuǎn)換可能在一定的情況下出現(xiàn)問題,例如精度丟失

2、顯示類型轉(zhuǎn)換將所有的情況都混合在一起,代碼不夠清晰,且具有一定的風(fēng)險(xiǎn)

C++提供了四種類型轉(zhuǎn)換

1.static_case

static_case類似于上面的隱式類型轉(zhuǎn)換,不能將兩個(gè)不相關(guān)的類型進(jìn)行轉(zhuǎn)換

void test_static_case()
{
    int i = 0;
    double j = static_cast(i);

    double* m = reinterpret_cast(&i);
}

2.reinterpret_case

reinterpret_case類似與上面的強(qiáng)制類型轉(zhuǎn)換,它通常為操作數(shù)的位模式提供較低層次的重新解釋,用于將一種類型轉(zhuǎn)換為另一種不同的類型

不過類型并不相關(guān)不能轉(zhuǎn)換,就如同C語言的強(qiáng)制類型轉(zhuǎn)換

void test_reinterpret_case()
{
    int* p = reinterpret_cast(new Node);
    Node n;
    int m = reinterpret_cast(n);
}

指針當(dāng)然是沒有問題的,不過下面的就會報(bào)錯(cuò)

3、const_case

const_case最常用的用途就是刪除變量的const屬性,方便賦值

它本質(zhì)與reinterpret_case相同,都是強(qiáng)制類型轉(zhuǎn)換,不過C++將其分離出來,目的是提醒,將會修改常量。

void test_const_case()
{
    const int a = 20;
    int* p = const_cast(&a);
    *p = 3;

    //跟vs下的情況類似
    cout<< a<< endl;
    cout<< *p<< endl;
}

我們使用了p去修改常量,那么輸出結(jié)果是什么呢?

這時(shí)很多同學(xué)就會疑惑,為什么是20,3我明明已經(jīng)修改了a的值?

這是因?yàn)閍被聲明為常量,編譯器就會作出一定的優(yōu)化,將a存儲到寄存器或者直接變成宏,因?yàn)椴⒉簧婕暗街档男薷模覀兺ㄟ^指針去修改a,修改的是在內(nèi)存中的a,而在寄存器中保存的a的值并沒有被影響,所以,輸出結(jié)果是20,3

4、dynamic_case

dynamic_case并不屬于C語言的兩種類型轉(zhuǎn)換的范疇,因?yàn)樗⒉粫a(chǎn)生臨時(shí)對象

dynamic_cast用于將一個(gè)父類對象的指針/引用轉(zhuǎn)換為子類對象的指針或引用(動(dòng)態(tài)轉(zhuǎn)換) 在dynamic_case之前有兩個(gè)概念 向上轉(zhuǎn)型:子類對象指針/引用->父類指針/引用(不需要轉(zhuǎn)換,賦值兼容規(guī)則) 向下轉(zhuǎn)型:父類對象指針/引用->子類指針/引用(用dynamic_cast轉(zhuǎn)型是安全的)

所謂的向上轉(zhuǎn)換就是切片,派生類對象轉(zhuǎn)換為基類對象

向下轉(zhuǎn)換與向上轉(zhuǎn)換相反,它是基類轉(zhuǎn)換為派生類

在多態(tài)時(shí)我們知道,要傳基類或者派生類,用基類的指針或者引用來接收,對于引用來說,這里并不考慮,因?yàn)镃++默認(rèn)不支持將一個(gè)類的對象賦值給另一個(gè)類

基類指針可能是指向基類也可能指向派生類,有時(shí)我們想要調(diào)用派生類自己的成員時(shí),就需要將它強(qiáng)制轉(zhuǎn)換為派生類指針,但是這種轉(zhuǎn)換是不安全的,我們無法知道,指向的是基類還是派生類,如果指向的是基類,我們強(qiáng)制類型轉(zhuǎn)換,就會出現(xiàn)越界的問題,所以為了區(qū)分這種情況,出現(xiàn)了dynamic_case

注意:

1. dynamic_cast只能用于父類含有虛函數(shù)的類 2. dynamic_cast會先檢查是否能轉(zhuǎn)換成功,能成功則轉(zhuǎn)換,不能則返回0

class A
{
public:
    virtual void func() {}

    int _a = 0;
};

class B : public A
{
public:
    int _b = 0;
};



//func 是為了實(shí)現(xiàn)多態(tài)
void func(A* pa)
{
    B* pb = dynamic_cast(pa);
    if(pb)
    {
        cout<< "轉(zhuǎn)換成功"<< endl;
        cout<< pb->_a<< " : "<< pb->_b<< endl;
    }
    else
    {
        cout<< "轉(zhuǎn)換失敗"<< endl;
        cout<< pa->_a<< endl;
    }
}

void test_dynatic_case()
{
    A a;
    B b;

    func(&a);
    func(&b);
}

三、RTTI

RTTI:Run-time Type identifification的簡稱,即:運(yùn)行時(shí)類型識別。 C++通過以下方式來支持RTTI: 1. typeid運(yùn)算符 2. dynamic_cast運(yùn)算符 3. decltype


總結(jié)

以上就是今天要講的內(nèi)容,本文僅僅簡單介紹了C++的類型轉(zhuǎn)換

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


網(wǎng)頁名稱:【C++】類型轉(zhuǎn)換-創(chuàng)新互聯(lián)
當(dāng)前網(wǎng)址:http://weahome.cn/article/jcooi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部