C 型別轉換

2021-08-07 01:52:57 字數 3203 閱讀 1607

顯式型別轉換

參考資料

c++型別轉換大體上包括隱式型別轉換和顯式型別轉換。

隱式型別轉換是自動執行的,無需顯式的操作符。 隱式型別轉換發生在很多地方,比如函式實參到形參的型別轉換、函式返回值型別的自動轉換等等。

1.1 數值型別轉換

從小整數型別(char、short)轉換到int,或者從float轉換到double,這種「提公升型」的轉換通常不會造成數值差異。但是下面的一些情形可能存在一些轉換誤差,使得編譯器產生警告。

int a = -1;

unsigned

int b = a; // b = 2^32 - 1 = 4294967295

int a = -2; 

bool b = a; //則b = true

float a = -1.5f;

int b = a; // b = -1

1.2 指標型別轉換

指標通常存在以下轉換:

char* s = "help" + 3;
(int) x; // old-style cast, old-style syntax  

int(x); // old-style cast, functional syntax

因為在**中不顯眼,容易被忽略, 而且舊式強制轉換實際上是困難且容易出錯的。

2.1 explicit關鍵字

c++提供了關鍵字explicit,可以阻止不應該允許的經過轉換建構函式進行的隱式轉換的發生。即宣告為explicit的建構函式不能在隱式轉換中使用。

先看一下隱式轉換的情形:

// 類的通過建構函式的隱式轉換:

#include

using

namespace

std;

class a {};

class b

// conversion from a (assignment):

b& operator= (const a& x)

// conversion to a (type-cast operator)

operator a()

};int main ()

再看下面的乙個例子:

#include 

using

namespace

std;

class a {};

class b

b& operator= (const a& x)

operator a()

};void fn (b x) {} // 當我們希望x只能是b型別時,我們就需要禁止隱式型別轉換

int main ()

2.1 強制型別轉換

c++ 提供四種轉換操作符來實現顯式型別轉換:

2.1.1 static_cast

static_cast

(expression)

static_cast強制轉換只會在編譯時檢查,但沒有執行時型別檢查來保證轉換的安全性。同時,static_cast也不能去掉expression的const、volitale、或者__unaligned屬性。

其主要應用場景有:

2.1.2 dynamic_cast

dynamic_cast

(expression)

new_type 必須是乙個指標或引用或「指向 void 的指標」。 如果 new_type 是指標,則expression 的型別必須是指標,如果 type-id 是引用,則expression為左值。 如果轉型失敗會返回null**型物件為指標時)或丟擲異常**型物件為引用時)。dynamic_cast 會動用執行時資訊(rtti)來進行型別安全檢查,因此dynamic_cast 存在一定的效率損失。

dynamic_cast 的乙個重要作用就是要確保轉換結果應該指向乙個完整的目標型別。 下面給乙個示例:

#include 

#include

using

namespace

std;

class base };

class derived: public base ;

int main () catch (exception& e)

return

0;}

輸出結果為:

null pointer on second type

-cast

.

分析: 儘管pba和pbb都是base指標型別,但其指向的物件卻分別是derived 和 base。而由於base相比derived少了int a的定義,因此無法完整的由base轉到derived。

此外,dynamic_cast只有在基類存在虛函式(虛函式表)的情況下才有可能將基類指標轉化為子類。

2.1.3 const_cast

const_cast

(expression)

new_type 必須是乙個指標、引用或者指向物件型別成員的指標。

const_cast用於去除除物件的const或者volatile屬性。

void func(double& d)   

void constcast()

2.1.4 reinterpret_cast
reinterpret_cast

(expression)

new_type必須是乙個指標、引用、算術型別、函式指標或者成員指標。其轉換結果與編譯平台息息相關,不具有可移植性,因此在一般的**中不常見到它。reinterpret_cast 常用的乙個用途是轉換函式指標型別,即可以將一種型別的函式指標轉換為另一種型別的函式指標,但這種轉換可能會導致不正確的結果。總之,reinterpret_cast只用於底層**,一般我們都用不到它,如果你的**中使用到這種轉型,務必明白自己在幹什麼

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

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

C 型別轉換

在程式中,進行型別轉換是常見的事。那麼在 c 中支援以前語言的型別轉換方法,即用型別名進行強行轉換,例如 object objtest new newtype newtype newvalue newtype objtest 但是這樣轉換,有個嚴重的問題,就是在把 objtest 強轉換成 newt...

C 型別轉換

型別轉換是將一種型別的值對映為另一種型別的值。型別轉換實際上包含有自動隱含和強制的兩種。型別的自動隱式轉換 c 語言編譯系統提供的內部資料型別的自動隱式轉換規則如下 1.程式在執行算術運算時,低型別可以轉換為高型別。2.在賦值表示式中,右邊表示式的值自動隱式轉換為左邊變數的型別,並賦值給它。3.當在...