C++類型轉換歸結總結。本站提示廣大學習愛好者:(C++類型轉換歸結總結)文章只能為提供參考,不一定能成為您想要的結果。以下是C++類型轉換歸結總結正文
學過C++的人都曉得,C++是強類型說話,是以變量在應用前就要聲明數據類型,分歧數據類型分派的內存空間年夜小也是分歧,在轉換類型時特別須要留意這個成績,以避免數據喪失或越界溢出。本文將具體歸結總結一下C++的類型轉換。
C++從C成長而來,也繼續兩種C作風的轉換:隱式轉換和顯式轉換。
1.隱式轉換
隱式轉換是指由編譯體系主動停止,不須要人工干涉的類型轉換,例如:
short a = 2000; int b; b = a;
隱式轉換,也包含結構函數和運算符的轉換,例如:
class A {}; class B { public: B (A a) {} }; A a; B b = a;
2.顯式轉換
和隱式轉換相反,顯式轉換要應用強迫類型轉換運算符停止轉換,例如:
double x = 10.3; int y; y = int (x); // 函數式寫法 y = (int) x; // C作風寫法
以上類型轉換曾經知足了根本類型的轉換了。然則假如想轉換類和指針,有時期碼可以編譯,在運轉進程中會失足。例如:
#include <iostream> class CDummy { float i,j; public: CDummy () { i=1; j=1; } }; class CAddition { int x,y; public: CAddition () { x=1; y=1; } int result() { return x+y;} }; int main () { CDummy d; CAddition * padd; padd = (CAddition*) &d; std::cout << padd->result(); return 0; }
這段代碼會在運轉期失足,在履行padd->result()時產生異常,有些編譯器會異常加入。
傳統明白的類型轉換,可以轉換成任何其他指針類型任何指針,它們指向的類型有關。在隨後的挪用成員的成果,會發生一個運轉時毛病或不測的成果。
C++尺度轉換運算符
傳統的類和指針的類型轉換方法很不平安,能夠會在運轉時異常加入,尺度C++ 供給了四個轉換運算符:dynamic_cast、reinterpret_cast、static_cast、 const_cast
dynamic_cast <new_type> (expression)
reinterpret_cast <new_type> (expression)
static_cast <new_type> (expression)
const_cast <new_type> (expression)
1.dynamic_cast
dynamic_cast只能用於指針和援用的對象。其目標是確保類型轉換的成果是一個有用的完成所要求的類的對象,所以當我們從一個類轉換到這個類的父類,dynamic_cast老是可以勝利。dynamic_cast可以轉換NULL指針為不相干的類,也能夠任何類型的指針為void指針。
class CBase { }; class CDerived: public CBase { }; CBase b; CDerived d; CBase* pb = dynamic_cast<CBase*>(&d); // 子類轉父類,准確 //CDerived* pd = dynamic_cast<CDerived*>(&b); // 父類轉子類,毛病
當新的類型不是被轉換的類型的父類,dynamic_cast沒法完成指針的轉換,前往NULL。當dynamic_cast轉換援用類型時,碰到掉敗會拋出Bad_cast 異常。
2.static_cast
static_cast可以履行相干的類的指針之間的轉換,可以在子類和父類之間互相轉換,但父類指針轉成子類指針是不平安的。static_cast沒有在運轉時停止平安檢討,是以我們要先確保轉換是平安的。另外一方面,static_cast比較dynamic_cast少了在類型平安檢討的開支。
class CBase {}; class CDerived: public CBase {}; CBase * a = new CBase; CDerived * b = static_cast<CDerived*>(a);
上述代碼是正當的,b指向一個不完全的對象,能夠在運轉期招致毛病。
static_cast也能夠用來履行任何其他非指針的轉換,如根本類型enum, struct, int, char, float等之間的尺度轉換:
double d = 3.14159265; int i = static_cast<int>(d); void* p = static_cast<void*>(&i); //隨意率性類型轉換成void類型
3.reinterpret_cast
reinterpret_cast轉換成任何其他指針類型,乃至有關的類,任何指針類型。操作的成果是從新說明類型,但沒有停止二進制的轉換。一切的指針轉換是許可的:不論是指針指向的內容照樣指針自己的類型。
class A {}; class B {}; A * a = new A; B * b = reinterpret_cast<B*>(a)
reinterpret_cast還可以用來轉換函數指針類型,例如:
typedef void(*Func)(); // 聲明一種函數指針界說,前往void Func pFunc; // 界說FuncPtr類型的數組 //pFunc = &test; // 編譯毛病!類型不婚配 pFunc = reinterpret_cast<Func>(&test); // 編譯勝利!轉換函數指針類型
4.const_cast
const_cast用於把持對象的常量性,去失落類型的const或volatile屬性。
#include <iostream> void print (char * str){ std::cout << str ; } int main () { const char* c = "hello world"; print ( const_cast<char *> (c) ); return 0; }