c 的型別轉換

2021-06-20 10:44:07 字數 2282 閱讀 4919

1.c++的四種型別轉換

static_cast, dynamic_cast, reinterpret_cast, const_cast

語法格式:

static_cast(expr);

static_cast(expr);  

2.型別轉換的運用

(1).類的上下行轉換和交叉轉換

上行轉換: 派生類指標轉換到基類指標。

下行轉換: 基類指標轉換到派生類指標。

reinterpret_cast 可以用於上行轉換也可以用於交叉轉換,並且沒有任何限制條件,但是安全性由程式設計師保證。

static_cast 可以用於上下行轉換,但是在下行轉換的時候不進行型別檢查,所以轉換是不安全的,轉換安全行要由程式設計師保證。

dynamic_cast可以用於上下行轉換,在下行轉換的時候在編譯期間就會進行型別檢查,如果型別檢查失敗編譯就不能通過。dynamic_cast的型別檢查是利用虛函式表裡面的型別資訊,所以如果基類沒有虛函式的話,那就沒有虛函式表,那編譯就不能通過。       

ex:class b;   

class d:public b{};

int  main() 

改正的方法只需要在基類和子類有虛函式表就可以了:

class b };

交叉轉換:所謂交叉轉換就是乙個基類有不同的子類,轉換在這個基類的不同子類的物件指標之間進行。

static_cast 不能用於交叉轉換,編譯器會報錯。

dynamic_cast 能用於交叉轉換, 所依賴的仍然是虛函式表裡面的資訊。

ex:  

class b  };   

class d1:public b{};

class d2:public b{};

int  main()  

dynamic_cast轉換的結果為null的時候:

dynamic_cast 轉換依賴的是虛函式表裡面的資訊,但是在轉換的時候,如果型別不能匹配的話,那麼dynamic_cast 轉換將得到乙個null值。

ex:b *pb = new b;

//pd1的結果會是乙個null值,因為型別不匹配

d1 *pd1 = dynamic_cast(pb);

if(pd1 == null )

//pd2的值也會是乙個null值,因為型別不匹配

d2 *pd2 = dynamic_cast(new d1);

//pb1 不會是乙個null值,因為型別匹配,並且是乙個上行轉換

b *pb1 = dynamic_cast(new d1);

(2)基本型別之間的轉換:

基本型別,比如int, char, short 等之間的轉換是預設完成的,或者通過static_cast 也可以。

ex:int a;

char c = a;

char c1 = static_cast(a);

(3)基本型別指標之間的轉換

基本型別指標之間的轉換只能使用 reinterpret_cast.

ex:char *pchar;

byte *pbyte = reinterpret_cast(pchar);

(4).void* 和 基本型別指標、物件指標之間的轉換

reinterpret_cast肯定是可以的。

static_cast也是可以的,static_cast就是為這個設計的。

ex:byte *pbyte = new byte;

void *pvoid = static_cast(pbyte);

char *pchar = static_cast(pvoid);

dynamic_cast 只能用於 類物件指標到 void*的轉換, 並且要求這個類具有虛函式表。

ex:b *pb;

void *pvoid = dynamic_cast(pb);

pb = dynamic_cast(pvoid);//這裡會報錯,dynamic_cast不允許做這樣的轉換。這裡可以換成  static_cast

(5). 數和指標之間的轉換

數和指標之間的轉換只能使用 reinterpret_cast.

ex:int a=0x1234;

char* pchar = reinterpret_cast(a);

a = reinterpret_cast(pchar);

3.const_cast

const_cast 是用來去除指標或者引用的 const 屬性,  它的作用不是為了修改變數,而是為了能讓函式接受這個變數作為引數。

mysql型別轉換c 型別轉換 C 型別轉換

一 簡介 型別轉換 把資料從一種型別轉換另一種型別 我們要求等號兩邊參與運算子必須型別一致,如果不一致,滿足下列條件會發生自動型別轉換或者隱式型別轉換。1.兩種型別相容 例如 int和double 相容 都是數字型別 2.目標型別大於源型別 double int 顯示型別轉換 1.兩種型別相相容 i...

C 的型別轉換

2008 03 15 12 59 強制型別轉換容易引發錯誤,所以被認為是一種醜陋的語法。c 中有乙個觀念 醜陋的語法就應該用醜陋的方式表達。所以,c 的轉換操作符使用 x cast 這種一種繁瑣的形式。目的是為了讓你在使用型別轉換前三思而行,看看是不是又不需要型別轉換的方法或設計。更重要的是,c風格...

C 型別的轉換

型別的轉換c 中型別轉換 顯隱 的機制分為兩種 一 隱式轉換 implicit conversions 二 顯式轉換 explict conversions 隱式轉換不需要指明欲轉變的型別 顯式轉換明確地使用轉換運算子 cast 指定要轉換成哪一種型別。c 允許程式設計師如果對於溢位進行處理 che...