顯式轉換型別函式詳解

2021-06-01 12:04:34 字數 2074 閱讀 6845

在c++中顯式轉換型別的操作函式有static_cast,reinterpret_cast,const_cast和dynamic_cast,前面三個是在編譯時實現,後面乙個dynamic_cast是在執行時實現,這些操作函式都是模板函式,

static_cast(expression)

reinterpret_cast(expression)

const_cast(expression)

dynamic_cast(expression)

new_type是要轉變成的型別,expression是變數,轉變後返回新型別的資料

1.reinterpret_cast(expression)

該函式是將乙個型別的指標轉換成另一種型別指標或者是乙個整形數,注意expression是指標型別,不能轉變非指標變數,這種轉換不改變指標變數資料存放的格式.

double *a = 10;

int * b = reinterpret_cast(a); //相當於隱式轉換int *b = (int*)a;

long c = reinterpret_cast(a); //轉變為非指標變數

class a{};

class b{};

a *pa = new a;

b *pb = reinterpret_cast(pa); //轉換類指標

//不能用於非指標型別轉變

double a = 10;

int b = reinterpret_cast(a); //錯誤的

//不能將const指標轉換為void*指標

const int * pa = new int;

void * pv = reinterpret_cast(pa); //錯誤

2.const_cast(expression)

用於去除指標的常量屬性,轉換為同型別的非常量型別,也可以反過來,將非常量的指標轉換為同型別的常量指標,只能對於指標型別!

const int *a = new int;

int *b = const_cast(a);

const int * c = const_cast(b);

//對於非指標變數都無法通過編譯

const int a = 10;

int b = const_cast(a); //錯誤

int *c = const_cast(a); //錯誤

3.static_cast(expression)

用於基本型別之間和具有繼承關係的類之間的轉換,這種轉換會改變變數的內部表示方式,也可以用於指標型別,但不必reinterpret_cast<>()效率高.

int a = 10;

double b = static_cast(a);

class a{};

class b:public a{};

b b;

a a = static_cast(b); //繼承的轉換

在轉換具有繼承關係的類物件是指標型別時,存在一定的危險

4.dynamic_cast(expression)

這個是在執行的時候才進行型別轉換,與其他3個不同之一,只能用於繼承類物件指標或引用之間進行型別轉換,以及沒有繼承關係的繼承類但被轉換類具有虛函式的物件進行轉換.

可以判斷轉換是否成功,對於指標,轉換失敗,則會返回null指標,對於引用,轉換失敗,則會丟擲bad_cast異常.

//對於具有繼承關係的

class a{};

class b:public a{};

a *a = new a;

b *b = dynamic_cast(a);

if(!b)

else

a a;

b &b = dyamic_cast(a); //引用轉換

class a };

class b{};

a *a = new a;

b *b = dynamic_cast(a);

//接著可以使用if語句判斷是否轉換成功

5 2 3 顯式型別轉換(函式式記法)

1 後跟被圓括號括起來的表示式列表的簡單型別說明符 7.1.5 構造了給定表示式列表的指定型別值。如果表示式列表為單個表示式,這個型別轉換表示式等價於相應的轉型 強制型別轉換 表示式 5.4 如果簡單型別說明符指定乙個類型別,這個類型別必須是完全的。如果表示式列表指定了多個值,型別必須為具有適當建構...

顯式型別轉換和隱式型別轉換

typeof六種資料型別 number string boolean undefined object function var num 123 console.log typeof num number var num1 true console.log typeof num1 string va...

C 顯式型別轉換

對於型別轉換,我在查資料的時候看到了一種很有意思的解釋,我們可以這樣理解型別轉換 某塊記憶體中的資料是不變的,而型別就是我們戴上的眼鏡,當我們戴上一種眼鏡後,我們就會用對應的型別來解釋記憶體中的資料,這樣不同的解釋就得到了不同的資訊。所謂強制型別轉換實際上就是換上另一副眼鏡後再來看同樣的那塊記憶體資...