他的主要作用就是去掉(指標或者引用)常量屬性的型別轉換。
例如,當我們想將乙個常量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型別,但沒有執行時型別檢查來保證轉換的安全性。它主要有如下幾種用法 用於類層次結構中基類和子類之間指標或引用的轉換。進行上行轉換 把子類的指標或引用轉換成基類...