C 顯式轉換

2022-08-30 13:54:14 字數 1806 閱讀 4536

任何具有明確定義的型別轉換,只要不包含底層const,都可以使用static_cast(c++ primer)。更為簡單的解釋就是,使用這個型別轉換符,能夠進行比較自然的轉換,類別相近的轉換,而有一些型別差距明顯的轉換則不可以,例如:

不能用於不同型別的指標之間轉換(void * 除外);

不能用於整型與指標之間的轉換;

不能用於不同型別的引用之間的轉換。

示例如下:

int n = 0, * ptr = &n, &ref = n;

char ch = static_cast(n); // 正確

void *vptr = static_cast(ptr); // 正確

char *cptr = static_cast(ptr); // 錯誤,指標型別不同且不是void*

int *iptr = static_cast(n); // 錯誤,整型不能轉換為指標

char &cref = static_cast(ref); // 錯誤,引用型別不同

reinterpret_cast通常為運算物件的位模式提供較低層次的重新解釋,轉換時,執行的是逐個位元複製的操作。常常用於進行各種不同型別的指標之間、不同型別的引用之間以及指標和能容納指標的整數型別之間的轉換,示例如下:

int n = 0, * ptr = &n, &ref = n;

char ch = reinterpret_cast(n); // 錯誤,reinterpret_cast不會對其進行擷取

void *vptr = reinterpret_cast(ptr); // 正確

char *cptr = reinterpret_cast(ptr); // 正確

int *iptr = reinterpret_cast(n); // 正確

char &cref = reinterpret_cast(ref); // 正確

可以看出,即使是兩個不相關的型別之間也可以使用reinterpret_cast進行轉換,但是在這其中很多轉換的危險性是很大的,需要程式設計師來保證其安全。

const_cast只能改變運算物件的底層const,將常量物件轉換成為常量物件,這種行為也被稱為「去掉const性質」。如果物件本身不是乙個常量,使用強制型別轉換獲得寫許可權是合法的行為。而如果物件是乙個常量,再使用const_cast執行寫操作就會產生未定義後果。示例如下:

const char *cptr;

char *p = const_cast(cptr); // 正確,但通過p寫值是未定義的

dynamic_cast可以將基類的指標顯式轉換為派生類的指標,或將基類的引用顯式轉換為派生類的引用。但是它不是無條件轉換,在轉換前它會檢查指標(或引用)所指向物件的實際型別是否與轉換的目的型別相容,如果相容轉換才會發生,才能得到派生類的指標(或引用)。使用形式如下:

dynamic_cast(e);

dynamic_cast(e);

dynamic_cast(e);

第一種形式中,e必須是乙個有效指標;第二種形式中,e必須是乙個左值;第三種形式中,e不能是左值。如果一條dynamic_cast語句的轉換目標是指標型別且轉換失敗了,則結果為0;如果轉換目標是引用型別並且失敗了,則dynamic_cast運算子將丟擲乙個bad_cast異常。

需要注意的是,dynamic_cast的許多實現版本執行速度相當慢。例如許多的實現版本中會有比較類名稱字串的操作,如果是深層繼承或多重繼承成本更高,在要求效率的**中應該要慎用這種轉換。

C 顯式轉換

標準c 包含乙個顯式的轉換語法 static cast 用於 良性 和 適度良性 的轉換,包括不用強制轉換 const cast 用於 const 和 或 volatile 進行轉換 reinterpret cast 轉換為完全不同的意思。為了安全的使用它,關鍵必須轉換回原來的型別。轉換成的型別一般...

C 顯式型別轉換

對於型別轉換,我在查資料的時候看到了一種很有意思的解釋,我們可以這樣理解型別轉換 某塊記憶體中的資料是不變的,而型別就是我們戴上的眼鏡,當我們戴上一種眼鏡後,我們就會用對應的型別來解釋記憶體中的資料,這樣不同的解釋就得到了不同的資訊。所謂強制型別轉換實際上就是換上另一副眼鏡後再來看同樣的那塊記憶體資...

c 顯式型別轉換

乙個命名的強制型別轉換具有以下形式 cast name expression 其中,type是轉換的目標型別,而expression是要轉換的值。如果type是引用型別,則結果是左值。cast name是static cast dynamic cast const cast reinterpret ...