c 的強制型別轉換

2021-08-14 21:12:23 字數 2543 閱讀 8506

特性:(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...