c c 的四種型別轉換

2021-10-06 01:11:13 字數 2223 閱讀 1990

他的主要作用就是去掉(指標或者引用)常量屬性的型別轉換。

例如,當我們想將乙個常量a的指標轉成乙個int*,在c語言中可以用如下的方式強制轉換。

int

main()

但是在c++中,我們就有了const_cast,就可以使用如下的方式轉換:

int

main()

可以將其看成乙個模板,在模板裡面提供轉換成的型別

注意!!

上述兩種轉換在底層**成彙編指令過後)實現是一模一樣的char* p = (char*)&a;是可以的,但是char* p2 = const_cast(&a);是不可以的。因為,const_cast在提供強轉的時候,需要表示式(位址型別)與左邊定義的型別,包括要轉換的型別應該保持一致。防止了任意轉換型別導致一些不可預期的問題。

const_cast引用這裡面必須是指標或引用型別 int int&*>

他的主要作用是提供編譯器認為安全的型別轉換(沒有任何聯絡的型別之間的轉換就被否定了),也是我們最常用的一種轉換方式。

例如,如果像下面這樣寫編譯器就會直接報錯

int

*p =

nullptr

;short

* b =

static_cast

<

short

*>

(a);

另外,基類型別 <=>派生類型別 可以用static_cast轉換

他的作用就類似於c風格的強制型別轉換。你想要怎樣轉換都可。

他的主要作用是用在繼承結構中,可以支援rtti型別識別的上下轉換

為了更好的解釋他的作用,我們先實現乙個繼承的**如下:

class

base

;class

derive1

:public base};

class

derive2

:public base};

void

showfunc

(base* p)

intmain()

執行結果如下:

上述**都實現的是動態繫結,最後輸出自己對應的函式。

但是當我們的需求改變,當訪問到derive2物件時,要實現derive02func()方法時應該怎麼辦呢?

首先,需求更改了 derive2實現新功能的api介面函式如下:

class

derive2

:public base

void

derive02func()

};

接下來就思考void showfunc(base* p)裡面如何修改了。

因為需求改變了,當訪問到derive2物件時,要實現derive02func()方法,所以要關注*p的型別

在我們之前所學的知識裡面可以用

typeid

(*p)

.name()

=="derive2"

來進行乙個型別的比較,但是這樣不好。

這時就要提出我們的dynamic_cast型別轉換了。

derive2* pd2 = dynamic_cast(p);

把p型別的指標轉成derive2* 型別的指標dynamic_cast會檢查p指標是否指向的是乙個derive2型別的物件。通過p 訪問vfptr進而訪問物件的vftable 裡面存放了rtti資訊 如果是dynamic_cast轉換型別成功,返回derive2物件的位址,給pd2,否則返回nullptr

因此,void showfunc(base* p)裡面**實現如下:

void

showfunc

(base* p)

else

}

執行結果如下:

由此可以看出static_cast編譯時期的型別轉換,dynamic_cast執行時期的型別轉換,支援rtti資訊識別的

四種型別轉換

c 中四種型別轉換是 static cast,dynamic cast,const cast,reinterpret cast 1 const cast 用於將const變數轉為非const 2 static cast 用於各種隱式轉換,比如非const轉const,void 轉指標等,static...

c 四種型別轉換

c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a。c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...

cpp四種型別轉換

static cast 用法 static cast type id expression 該運算子把expression轉換為type id型別,但沒有執行時型別檢查來保證轉換的安全性。它主要有如下幾種用法 用於類層次結構中基類和子類之間指標或引用的轉換。進行上行轉換 把子類的指標或引用轉換成基類...