C 學習記錄 五 型別轉換運算子

2021-09-29 21:46:29 字數 4652 閱讀 6760

型別轉換是一種機制,讓程式設計師能夠暫時或永久性改變編譯器對物件地解釋。

注意型別轉換並不意味著程式設計師改變了物件本身,而只是改變了對物件地解釋。

可改變物件解釋方式地運算子稱為型別轉換運算子。

在這裡,我們將總結下:

如果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...