C 命名型的強制型別轉換

2021-06-02 11:37:48 字數 2802 閱讀 8258

舊式強制轉換符號有下列兩種形式

// c++強制轉換符號

type (expr);

// c 語言強制轉換符號

(type) expr;

如果我們希望自己的**在c++和c 語言中都能

夠編譯的話那麼只能使用c 語言的強制轉換符號

c++4種強制轉換 cast_name(pxpression)

static_cast 最常用,類似c中的轉換  任何隱式轉換可以用此關閉警告

dynamic_cast 將子類指標轉成父類

const_cast 去掉const屬性

reinterpret_cast 對運算元的位模式進行較低層次的重新解釋 例如可以從int到double  按位拷貝,更常見用途是指標型別的轉換

命名的強制型別轉換符號的一般形式如下:

cast_name(expression);

其中cast_name為static_cast,dynamic_cast,const_cast和reinterpret_cast之一,type為轉換的目標型別,而expression則是被強制轉換的值。強制轉換的型別指定了在expression上執行某種特定型別的轉換。

1.static_cast

它用來進行比較安全的、基於內容的資料型別轉換(編譯器會生成**進行轉換)。基本資料型別之間的轉換都適用於static_cast。static_cast可以對物件也可以對指標也可以對引用使用,該運算子把expression轉換為type型別,但沒有執行時型別檢查來保證轉換的安全性。

①用於類層次結構中基類和子類之間指標或引用的轉換。

進行上行轉換(把子類的指標或引用轉換成基類表示)是安全的;

進行下行轉換(把基類指標或引用轉換成子類表示)時,由於沒有動態型別檢查,所以是不安全的。

②用於基本資料型別之間的轉換,將乙個較大的算術型別賦值給較小的型別。這種轉換的安全性也要開發人員來保證。

③把空指標轉換成目標型別的空指標。

④把任何型別的表示式轉換成void型別,把void指標轉換成原來的指標型別

2.const_cast

該操作符時用於去除const屬性,即將指向const物件的指標qi轉換為指向非const物件的指標。const_cast只可以對指標和引用使用,如果你要把乙個const物件值轉化為非const物件值只能用隱式執行或通過使用static_cast、c 樣式轉換或函式樣式轉換執行。

//code

#include

using namespace std;

int main()

執行結果:

i:429875

p=this is a example.

此時結果,i與p的值是完全相同的。reinterpret_cast的作用是說將指標p的值以二進位制(位模式)的方式被解釋為整型,並賦給i,乙個明顯的現象是在轉換前後沒有數字損失。

4.dynamic_cast

該操作符用於執行時檢查該轉換是否型別安全,但只在多型型別時合法,即該類至少具有乙個虛擬方法。dynamic_cast與static_cast具有相同的基本語法,dynamic_cast主要用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換。在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;在進行下行轉換時,dynamic_cast具有型別檢查的功能,比static_cast更安全。

通常在基類和派生類之間轉換時使用, 是run-time cast。dynamic_cast 支援在執行時刻識別由指標或引用指向的類物件.

轉換前型別必須是指向多型型別的指標(即要有虛函式),或多型型別的引用,否則編譯會出錯。這是由於執行時型別檢查需要執行時型別資訊,而這個資訊儲存在類的虛函式表。

用法:dynamic_cast< t >( a )

該運算子把a轉換成t型別的物件。t必須是類的指標、類的引用或者void *;

如果t是類指標型別,那麼a也必須是乙個指標,如果t是乙個引用,那麼a也必須是乙個引用。

它可以將基類的指標或引用轉換為派生類的指標或引用。它在轉換前會檢查指標(或引用)所指向物件的實際型別是否與轉換的目的型別相容,如果相容轉換才會發生,才能得到派生類的指標(或引用),否則:①如果執行的是指標型別的轉換,會得到空指標;②如果執行的是用引用型別的轉換,會丟擲異常。

在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;

在進行下行轉換時,dynamic_cast具有型別檢查的功能,比static_cast更安全。

class b;

class d:public b;

void func(b *pb)

在上面的**段中,如果pb指向乙個d型別的物件,pd1和pd2是一樣的,並且對這兩個指標執行d型別的任何操作都是安全的;

但是,如果pb指向的是乙個b型別的物件,那麼pd1將是乙個指向該物件的指標,對它進行d型別的操作將是不安全的(如訪問m_szname),

而pd2將是乙個空指標。

另外要注意:b要有虛函式,否則會編譯出錯;static_cast則沒有這個限制。

這是由於執行時型別檢查需要執行時型別資訊,而這個資訊儲存在類的虛函式表(

關於虛函式表的概念,詳細可見)中,只有定義了虛函式的類才有虛函式表,

沒有定義虛函式的類是沒有虛函式表的。

另外,dynamic_cast還支援交叉轉換(cross cast)。如下**所示。

class a

};class b:public a;

class d:public a;

void foo()

在函式foo中,使用static_cast進行轉換是不被允許的,將在編譯時出錯;而使用 dynamic_cast的轉換則是允許的,結果是空指標。

命名的強制型別轉換

強制型別轉換的格式為 cast name expression static cast 任何具有明確定義的型別轉換,只要不包含底層const,都可以使用static cast,例如 int i,j double k static cast j i 當需要把乙個較大的算數型別轉換成乙個較小的算數型別時...

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的值轉換為模板中...