C 中的4種型別轉換

2021-08-08 10:57:42 字數 2125 閱讀 4347

c語言中實現了基本型別的轉換機制,比如int轉double,char轉int等等。轉換的格式也很簡單

(轉換型別)變數或者

轉換型別(變數)

在c語言中這種方法很簡潔高效,可以對任意型別做強制轉換,但缺點也是不少,比如double轉int的時候會出現精度損失。

當到了c++的時候,因為類型別及c++的多型等機制,使得乙個物件的記憶體結構可以變得很複雜,顯然c風格的簡單粗暴的型別轉換機制會為c++程式帶來很大的風險。

比如父類物件向子類型別轉型,是不安全的轉換,但是c風格的轉換卻是可以通過的。

因此c++的標準中,實現了4種型別轉換符,不僅相容c的基本型別,還能適用於類型別的轉換,並且根據需求場景的不同,使用相對應的型別轉換符可以有效提高程式的健壯性和可維護性。

具體的形式如下:

cast(expression)

型別轉換符《目標轉換型別》(被轉換變數)

如果type是引用型別的話轉換的結果是乙個左值。

static_cast是最常用的型別轉換符,作用類似於c風格的強制轉換,一般建議c++程式中使用static_cast代替傳統的c風格轉換。因為作用是類似於c風格的強制轉換也就是說static_cast不會進行執行時的型別檢查,轉換不一定是安全的。

同時static_cast的轉換不會去除變數的const、volatile、或者__unaligned屬性。

用法示例

int interger;

double double=6.7777;

interger = static_cast

(double);//6

簡單總結一下就是,static_cast其實和c風格的功能是一樣的,只是在轉換的時候編譯器不會出現警告資訊。使用static_cast的時候我們程式設計師需要自行判斷轉換的安全性。

這乙個運算子是比較有意思的,可以消除乙個被const/volatile符號修飾的變數的const/volatile屬性。嗯,我們只看const的話,可以發現c++提供了乙個剝奪常量的常量屬性的操作,看起來好矛盾,為什麼要這樣做不會很多餘嗎?個人覺得這個運算操作的存在,貫徹了c++之父對c++的設計理念,不讓語言本身的特性成為限制程式設計師攔路虎,限制思維。所以在c++中存在乙個剝奪常量的常量屬性的操作是合理的。

以下是c++primer第五版中給出的例子

const

char *pc;

char *p=const_cast

(pc);//正確:但通過p寫值是未定義的行為

然後下面是我寫的例子

const

int a=3;

int &b = const_cast

(a);

b = 4;

cout

<" "

<<&acout

<" "

<<&b

string& shorter(const

string str1,const

string str2)

可以不建立額外的副本,就可以返回兩個const輸入的字串的較小者。基本const_cast也就這個用途用的多。

reinterpret_cast按照字面意思來看,重新解釋,意思就是它可以對任意的無關型別之間進行轉換,也就是新舊型別都有相同的二進位制值,但程式對這一段二進位制值解釋的意義缺不一樣,這就很厲害了。下面是我在網上查閱到的乙個比較好的部落格

c++標準轉換運算子reinterpret_cast

。 總之一句話,這乙個轉換符慎用。

顧名思義:動態轉換。dynamic_cast是4種轉換運算子中唯一乙個在執行時進行型別轉換的運算子,配合另乙個typeid運算子使用就可以手工實現人們常說的rtti(執行時型別識別)。

dynamic_cast的使用如下:

dynamic_cast

base *pb;

derived *pd = dynamic_cast

(pb);

關於dynamic_cast能夠進行執行時型別檢查的原理背後,也有前人去**了一下。可以看這篇博文c++ dynamic_cast實現原理

c 中的4種型別轉換

1.c 中有哪4個和型別轉換相關的關鍵字?這些關鍵字都有什麼特點?應該在哪些場合下使用.c語言中的強制型別轉換可以隨意的轉換我們想要的型別了,格式如下 型別 變數名 為什麼c 還要引入新的4種型別轉換呢?這是因為新的型別轉換控制符可以很好的控制型別轉換的過程,允許控制各種型別不同的轉換.還有一點好處...

C 中4種型別轉換方式

首先型別轉換,比如以下 int i double d 12.0 i int d 但是這種強制轉換符對於類和類的指標來說,就比較麻煩,所以c 標準定義了四個新的轉換符 轉換乙個指標為其他型別的指標,也允許乙個指標轉換為整數型別,反之亦然 include using namespace std clas...

C 中4種 型別轉換 方式

dynamic cast var reinterpret cast var static cast var const cast var 1 執行時,檢查轉換 2 基類中一定要有虛函式 不能用於基礎型別 否則編譯不通過 3 成功的話返回的是指向類的指標或引用,轉換失敗的話則會返回null 更多請檢視...