型別轉換是一種機制,讓程式設計師能夠暫時或永久性改變編譯器對物件地解釋。
注意型別轉換並不意味著程式設計師改變了物件本身,而只是改變了對物件地解釋。
可改變物件解釋方式地運算子稱為型別轉換運算子。
在這裡,我們將總結下:
如果c++應用程式都編寫的很完善,其儲於型別是安全的且是強型別的世界,則沒必要進行型別轉換,也不需要型別轉換運算子。
然而現實世界中,不同模組往往由使用不同環境的個人和廠商編寫,他們需要互相協作。
因此程式設計師經常需要讓編譯器按其所需的方式解釋資料,讓應用程式能夠成功編譯並正常執行。
且看例子:雖然c++編譯器支援bool,但是多年前使用c語言編寫的庫仍在使用。這些針對c語言編譯器必須依賴整型來儲存布林值,因此對這些編譯器來說,bool型別類似於下面這樣:
typedef unsigned short bool;
而返回布林值的函式可能這樣宣告:
bool isx();
如果要在新應用程式中使用乙個這樣的庫,而該應用程式將使用最新的c++編譯器進行編譯,則程式設計師必須讓其使用的c++編譯器能夠理解資料型別bool,同時讓庫能夠理解shujuleixingbool。謂詞,可使用型別轉換:
bool bcppresult = (bool)isx(); //c-style cast
c++優點之一是型別安全。
例如,大多數c++編譯器都不會讓如下的語句通過編譯:
char* pszstring = "hello world";
int* pbuf = pszstring; //error: cannot convert char* to int*
這是非常正確的!
當前,c++編譯器仍需向後相容,以確保遺留**能夠通過編譯,因此支援下面的語法:
int* pbuf = (int*)pszstring;
雖然型別轉換有缺點,但也不能拋棄型別轉換的概念。
在很多情況下,型別轉換是合理需求,可以解決重要的相容性問題。c++提供了一種新的型別轉換運算子,專門用於基於繼承的情形,這種情形在c語言中並不存在。
4個c++型別轉換運算子如下:
這四個型別轉換運算子的使用語法相同:
destination_type result = cast_type (object_to_be_casted);
static_cast用於在相關型別的指標之間進行轉換,還可顯式地執行標準資料型別地轉換——這種轉換原本將自動或隱式地進行。
用於指標時,static_cast實現了基本地編譯階段檢查,確保指標被轉換為相關型別。
這改進了c風格型別轉換,在c語言中,可將指向乙個物件地指標轉換為完全不相關的型別,而編譯器不會而編譯器不會報錯。使用static_cast可將指標向上轉換為基本型別,也可向下轉換為派生型別:
base* pbase = new derived(); //construct a derived object
derived* ppderived = static_cast(pbase); //ok!
//cunrelated is not related to base via any inheritance heirarachy
cunrelated* punrelated = static_cast(pbase); //error
//the cast above is not permitted as types are unrelated
注意:將derived*轉換為base*被稱為向上轉換,無需使用任何顯式型別轉換運算子就能進行這種轉換:
derived objderived;
base* pbase = &objderived; //ok!
將base*轉換為derived*被稱為向下轉換,如果不適用顯式型別轉換運算子,就無法進行這種轉換:
derived objderived;
base* pbase = &objderived; //upcast->ok!
derived* pderived = pbase; //error:downcast needs explicit cast
base* pbase = new base();
derived* pderived = static_cast(pbase); //still no errors!
其中pderived實際上指向乙個不完整的derived物件,因為它指向的物件實際上式base()型別。由於static_cast只在編譯階段檢查轉換型別是否相關,而不執行執行階段檢查,因此pderived->somederivedclassfunction()能夠通過編譯,但是在執行階段可能導致意外結果。
除用於向上轉換和向下轉換以外,static_cast還可以在很多情況下將隱式型別轉換為顯式型別,易引起程式設計師注意:
double dpi = 3.14159266;
int num = static_cast(dpi); //****** an otherwise implicit cast,explicit
在上述**中,使用mum = dpi將獲得同樣的效果,但是用static_cast可讓**閱讀者注意到這裡使用了型別轉換,並指出(對知道static_cast的人而言)編譯器根據編譯階段可使用的資訊進行了必要的調整,以便執行所需的型別轉換。
顧名思義,於靜態型別轉換相反,動態型別轉換在執行階段(即應用程式執行時)執行型別轉換。可檢查dynamic_cast的結果,以判斷型別轉換是否成功。使用dynamic_cast運算子的典型語法如下:
destination_type* pdest = dynamic_cast (psource);
if (pdest) //check for success of the casting operation before using pointer
pdest->callfunc();
例如:
base* pbase = new derived();
//perform a downcast
derived* pderived = dynamic_cast (pbase);
if (pderived) //check for success of the cast
pderived->callderivedclassfunction();
如上**所示,給定乙個指向基類物件的指標,程式設計師可使用dynamic_cast進行型別轉換,並在使用前檢查指標指向的目標物件型別。在上述示例**中,目標物件的型別顯然是derived,因此這些**只有演示價值。
然而,事情並非總是如此。例如,將derived*傳遞給接受base*引數的函式時。該函式可以使用dynamic_cast判斷基類指標指向的物件的型別,再執行該型別特有的操作。
總之,可使用dynamic_cast在執行階段判斷型別,並在安全時使用轉換後的指標。
且看下面**:
#include using namespace std;
class fish
carp* piscarp = dynamic_cast (inputfish);
if(piscarp)
cout<<"verifing type using virtual fish::swim: "}int main()
{carp mylunch;
carp mydinner;
detectfishtype(&mydinner);
cout《這是乙個繼承結構:tuna和carp從fish繼承派生而來。為了方便解釋,這兩個派生類不僅實現了虛函式swim(),還分別包含了乙個特有的函式,即tuna::becomedinner()和carp::talk()。這個示例的獨特之處在於,給定乙個基類指標(fish*),我們可以動態得檢測他們指向得是tuna或者carp。
reinterpret_cast是c++中與c風格型別轉換最接近得型別轉換運算子。它讓程式設計師能夠能夠將一種物件型別轉換為另一種,不管他們是否相關;也就是說,它們用如下語法強制重新解釋型別:
base* pbase = new base();
cunrelated* punrelated = reinterpret_cast(pbase);
這種型別轉換實際上是強制編譯器接受static_cast通常不允許得型別轉換,通常用於低階程式(如驅動程式),在這種程式中,需要將資料轉換為api能夠接受得簡單型別(例如,有些api只能使用位元組流,即unsigned char*):
someclass* pobject = new someclass();
//need to send the object as a byte-stream...
unsigned char* pbytes = reinterpret_cast (pobject);
上述**使用得型別轉換並沒有改變源物件得二進位制表示,但讓編譯器允許程式設計師訪問someclass物件包含的各個位元組。由於其他c++型別轉換運算子都不允許執行這樣得轉換,因此使用reinterpret_cast時,我們將受到型別轉換不安全(不可移植)得警告。
略。略。
c 型別轉換運算子
c 中有4個型別轉換運算子,使裝換過程更規範 dynamic cast type name expression 如果轉型失敗則返回0,即空指標。該運算子的用途是,使得能夠在類層次結構中進行向上轉換 由於 is a關係,這樣的型別轉換時安全的 而不允許其他轉換。二 const cast const ...
C 型別轉換運算子
隱式轉換,是針對不同型別之間的賦值和運算,函式呼叫傳遞引數 這些的轉換都是由編譯器自動完成 char ch int i ch 顯式轉換 由程式設計師在變數前面新增型轉換 char pc char pb void ps void pa 通過上述的兩種方式,c語言大部分的型別轉換都可以順利進行,c 繼承...
C 型別轉換運算子
用於 指向派生類物件的 基類指標轉換成派生類指標。如果轉換失敗,則返回0,即空指標。通過判斷轉換是否成功,來決定是否用派生類裡的函式 基類中可能沒有那個函式 class a class b public a class c public b a a new a a b new b a c new c...