C C 之型別轉換

2022-06-05 05:54:11 字數 1522 閱讀 6925

目錄三、dynamic_cast

四、const_cast

五、reinterpret_cast

六、總結

在c語言中,我們經常會對資料進行型別轉換,但都是強制性的型別裝換,自然就會引發訪問不安全的問題,可能不經意間將指向const物件的指標轉換成非const物件的指標,可能將基類物件指標轉成了派生類物件的指標,這種轉換很容易出bug,需要嚴格審查**才能消除這種隱患,而且這種轉換方式不利於我們審查**,且程式執行時也可能會出bug,所以c++為了提高型別裝換的安全性,關於型別轉換引入了四種方式:static_cast、const_cast、dynamic_cast、reinterpret_cast,接下來看下其四種型別裝換的應用場景。

基本資料型別之間的轉換使用,例如float轉int,int轉char等,在有型別指標和void*之間轉換使用,子類物件指標轉換成父類物件指標也可以使用static_cast。

非多型型別轉換一般都使用static_cast,而且最好把所有的隱式型別轉換都是用static_cast進行顯示替換,不能使用static_cast在有型別指標之間進行型別轉換。

#include using namespace std;

struct base

};struct derive : public base

};int main()

用於將父類的指標或引用轉換為子類的指標或引用,此場景下父類必須要有虛函式(只要擁有虛函式就行),因為dynamic_cast是執行時檢查,檢查需要執行時資訊rtti.如果不清楚什麼是rtti,可以去了解下c++的rtti機制。

#include using namespace std;

struct base

};struct derive : public base

};int main()

用於常量指標或引用與非常量指標或引用之間的轉換,只有const_cast才可以對常量進行操作,一般都是用它來去除常量性,去除常量性是危險操作,還是要謹慎操作。

int main()
沒啥場景,類似c語言中的強制型別轉換,什麼都可以轉,萬不得已不要使用,一般前三種轉換方式不能解決問題了使用這種強制型別轉換方式。

int main()
方式

使用場景

static_cast

基本資料型別之間的轉換使用,例如float轉int,int轉char等;子類物件指標轉換成父類物件指標也可以使用static_cast;在有型別指標和void*之間轉換使用,不能使用static_cast在有型別指標之間進行型別轉換。

dynamic_cast

用於將父類的指標或引用轉換為子類的指標或引用,此場景下父類必須要有虛函式(只要擁有虛函式就行)

const_cast

用於常量指標或引用與非常量指標或引用之間的轉換。

reinterpret_cast

類似c語言中的強制型別轉換,什麼都可以轉,盡量不要使用此方式。

C 之型別轉換

一 static cast型別轉換 static cast 應用於c 可以隱式轉換的型別之間,包括雙向隱式轉換和單向隱式轉換。例如 雙向隱式轉換 int a char b a static cast b 可以直接通過隱式轉換,轉換型別 a b b static cast a 可以直接通過隱式轉換,轉...

Effective C 之型別轉換

阿里面試過去好久了,可惜筆試做的太爛了,gg,不過還是要繼續完善自己的知識體系的。這個型別轉換的問題,被面試官問到了,然後一臉尼克楊的蒙蔽表情。其實早就找到了,這個問題,一直因為忙別的,沒有好好總結一下。effective c 條款27 儘量減少轉型動作 c 的設計目標之一是,保證 型別錯誤 絕不可...

More Effective C 之型別轉換

1.條款之優先考慮c 風格的型別轉換 c 通過引用4種新的型別轉換克服了c風格的型別轉換的缺點。這四種操作符是 static cast,const cast,dynamic cast以及reinterpret cast。大多數情況下,關於這些操作符應該知道的是,我們所習慣的寫法為 type expr...