首頁  >  文章  >  後端開發  >  C++型別如何進行轉換

C++型別如何進行轉換

醉折花枝作酒筹
醉折花枝作酒筹原創
2021-06-28 14:54:502647瀏覽

方法:1、static_cast,非多型類型的轉換;2、reinterpret_cast,轉換成另一種不相關型別;3、const_cast,刪除變數的const屬性,再賦值;4、dynamic_cast ,用於類別繼承層次間指標或引用轉換。

C++型別如何進行轉換

本教學操作環境:windows7系統、C 17版本、Dell G3電腦。

C++型別如何進行轉換

C 為了規範C中的型別轉換,加強型別轉換的視覺性,引進了四個強制型別轉換運算子:static_cast, reinterpret_cast, const_cast , dynamic_cast 

他們本質上都是模板類別。

下面分別來介紹:

1.static_cast

#它用於非多態類型的轉換(靜態轉換),對應於C中的隱式類型轉換但他不能用於兩個不相關類型的轉換,如整形和整形指標之間的轉換,雖然二者都是四個位元組,但他們一個表示數據,一個表示地址,類型不相關,無法轉換。

該轉換在編譯時完成,和C風格的型別轉換相似,不過要注意下面幾點

不能在沒有派生關係的兩個類別類型之間轉換

不能去除掉原有類型的型別修飾符,例如const,volatile,__unaligned

#轉換物件時由於沒有動態型別檢查,所以由基類物件轉換成衍生類別物件的時候有安全隱患

void Test()
{
    //C中的方式
    int i = 10;
    double d1 = i;//隐式类型转换
    //int *p = i;//无法隐式类型转换,只能强制类型转换
    int *p = (int*)i;
    //C++中的方式
    double d2 = static_cast<double>(i);
    //相当于创建一个static_cast<double>类型的匿名对象赋值给d2
    int* p2 = static_cast<int*>(i);//无法转换,会报错
}

C++型別如何進行轉換

2.reinterpret_cast

#reinterpret的意思是重新解釋,可將一種類型轉換成另一種不相關類型,對應C中的強制型別轉換,處理無法進行隱式轉換的情況

void Test()
{
    int i = 10;
    int* p2 = reinterpret_cast<int*>(i);
}

強制型別轉換有時可以很暴力的處理一些問題 

如下例:

對於一個帶參數的函數,如何不傳參也可以呼叫函數?

void Fun(int s)
{
    cout << s << endl;
}
typedef void(*FUNC)();
void Test()
{
    FUNC pf = reinterpret_cast<FUNC>(Fun);
    pf();
}

C中的強制型別轉換也可以處理。

雖然我們透過這種BUG的方式轉換函數指針,但是這樣的程式碼是不可移植的,有時會產生不確定的結果,所以不建議這樣來用 

如此處輸出的s的值就為一個隨機值,雖然用戶在外部未傳參,但是該函數在調用時會創建形參,該形參未初始化,自然是隨機值 

C++型別如何進行轉換

3.const_cast

他的功能就是刪除變數的const屬性,方便再次賦值

該轉換在編譯時完成,用於解除const,volatile修飾符,只能轉換指標或引用

#
void Test3()
{
    const int i = 10;
    int *p = const_cast<int*>(&i);
    *p = 20;
    cout << i << endl;
    cout << *p << endl;
}

4.dynamic_cast

###################### ####主要用於“安全地向下轉型”,用於類別繼承層次間的指標或參考轉換。主要還是用於執行“安全的向下轉型(safe downcasting)”,也即是基類物件的指標或引用轉換為同一繼承層次的其他指標或引用。 #########至於「先上轉型」(即衍生類別指標或引用型別轉換為其基類型別),本身就是安全的,儘管可以使用dynamic_cast進行轉換,但這是沒必要的,普通的轉換已經可以達到目的,畢竟使用dynamic_cast是需要開銷的。 ###
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()
{
    Base *base ;
    Derived *der = new Derived;
    //base = dynamic_cast<Base*>(der); //正确,但不必要。
    base = der; //先上转换总是安全的
    base->Show();
    system("pause");
}
###推薦教學:《###C####》###

以上是C++型別如何進行轉換的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn