顯式型別轉換
參考資料
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_castreinterpret_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.當在...