特性:(1):和c風格轉換相似,是一種靜態型別轉換,用於基本型別(int,char, float, double等等)之間的轉換
(2):用於基本型別值之間的強制轉換,不能用於基本型別指標之間的轉換
(3):用於有繼承關係物件之間的轉換和類指標之間的轉換(主要用於上行轉換:把派生類的指標或引用 轉換成 基類指標或引用,消除多重繼承帶來的型別歧義,是相對安全的)
示例:
int i = 0x12345;
char c = 'c';
int* pi = &i;
char* pc = &c;
c = static_cast
(i); //正確,將基本型別int型轉換成char型
pc = static_cast
(pi); //錯誤,不能用於指標的轉換
編譯結果:
(1):用於去除const變數的唯讀屬性**,是物件變得可以修改
(2):只能用於指標或引用
注意:盡量避免使用const_cast
示例:
const
int& j = 1; //用常量1初始化const引用j為乙個唯讀變數
int& k = const_cast
(j); //去除j的唯讀變數的屬性,使得可以用變數k修改j的值
const
int x = 2; //定義真正意義上的const常量x
int& y = const_cast
(x); //
int z = const_cast
(x); //錯誤,只能用於指標或引用之間的轉換
k = 5;
printf("k = %d\n", k);
printf("j = %d\n", j);
y = 8;
printf("x = %d\n", x);
printf("y = %d\n", y);
printf("&x = %p\n", &x);
printf("&y = %p\n", &y);
編譯結果:
(1):只能用於指標不相關型別間的強制轉換
(2):也可以用於整數和指標型別間的強制轉換,很少用
*注意:該強制轉換將指標的一種型別轉換為另一種型別,是一種不安全的轉換,盡量避免使用
示例:
int i = 0;
char c = 'c';
int* pi = &i;
char* pc = &c;
pc = reinterpret_cast
(pi); //正確
pi = reinterpret_cast
(pc); //正確
pi = reinterpret_cast
(i); //正確
c = reinterpret_cast
(i); //錯誤,只能用於指標之間的轉換
(1):首先必須要有虛函式的支援
(2):和c語言的強制型別轉換相比,可以說是一種動態型別準換,具有型別檢查的功能
(3):用於有繼承關係的類指標間的轉換(主要用於下行轉換:把基類的指標或引用 轉換成 派生類的指標或引用)
(4):用於有交叉關係的類指標間的轉換,即必須是類物件的指標
dynamic_cast具有一定的開銷,建議在測試**中使用。
虛函式與dynamic_cast型別轉換相比:
①虛函式更安全,不會出現強制轉換錯的情況
②虛函式效率更高:用函式指標,避免條件判斷
③虛函式不需要在編碼時確定物件的真實型別,而dynamic_cast必須告知轉換的型別,執行時若型別不當返回空指標或者拋異常
④虛函式適用性更強:虛函式是真正的動態繫結,型別轉換當增加或刪除乙個派生類時,dynamic_cast必須增減相應的**
示例:
int i = 0;
int* pi = &i;
//錯誤,只能用於類指標之間的強制型別轉換,並且該類指標指向的物件所屬的類必須含有虛函式
char* pc = dynamic_cast
(pi);
C 強制型別轉換
四種型別可能很多人都常常忽略就象我一樣,但是有時還是比較有用的。不了解的建議看看,一些機制我也不是十分了解,只是將一些用法寫出來讓大家看看。強制轉化無論從語法還是語意上看,都是c 中最難看的特徵之一。但是基於c風格的轉化的語義的不明確性及其一些潛在問題。強制型別轉化最終還是被c 接受了。1.stat...
C 強制型別轉換
標準c 中主要有四種強制轉換型別運算子 const cast,reinterpret cast,static cast,dynamic cast等等。1 static cast a 將位址a轉換成型別t,t和a必須是指標 引用 算術型別或列舉型別。表示式static cast a a的值轉換為模板中...
C 強制型別轉換
關於強制型別轉換的問題,很多書都討論過,寫的最詳細的是c 之父的 c 的設計和演化 最好的解決方法就是不要使用c風格的強制型別轉換,而是使用標準c 的型別轉換符 static cast,dynamic cast。標準c 中有四個型別轉換符 static cast,dynamic cast,reint...