為了保持與C的相容性,C++保留了C的所有類型轉換約定與機制,在C裡分隱式與顯式類型轉換,隱式類型轉換有如下兩種常見情況:
1. 所有基本類型間;
2. 所有類型指標與void*之間;
在C++裡,增加了三類隱式類型轉換,前兩種屬於自訂隱式類型轉換:
1. 通過有參建構函式,將指定參數類型的對象隱式轉換為建構函式調用建立的對象;
class CA
{
public:
CA(int a) {...}
};
void test(CA ca) {...}
int a = 10;
test(a); //通過建構函式CA(int)將a轉換為隱式構造的一個CA對象
2. 通過類內定義的類型轉換函式(operator Type()形式);
class CA
{
public:
operator bool() {...}
};
CA a;
if(a) //實際調用a.operator bool()將a轉換為bool型值
{...}
3. 衍生類別體系中孩子類指標向父輩類指標間的轉換;
C++裡增加一種基本類型bool,bool型變數只可能取值true(1),false(0),所有整型與bool型間均可發生隱式轉換,需要注意的是所有非零值均轉換為true,零值轉換為false。對於顯式類型轉換,C裡所有顯式轉換形式都基本為:Type a = (Type)b;這種轉換機制過於暴力與低級,可能造成很多疏忽的錯誤,重要的是無法表明轉換的語義,意圖,可能是相互關聯類型間的轉換,例如派生體系間的轉換,可能是去const修飾符的轉換,可能是低級的位元組意義重新解釋,例如void*轉換為int等,對此C++根據轉換的類型及所代表的含義對顯式轉換進行了分類,採用了新式的轉換文法,另外由於C++增加了RTTI機制,從而增加一類運行時類型轉換機制,共分四類如下:
1. static_cast<T>: 靜態類型轉換,用在相互關聯類型間,常見的有派生體系間的向下轉換,基本類型間的轉換等,這種轉換經常會發生值的變動,不相互關聯類型用此機制會產生編譯器錯誤;
2. const_cast<T>: 用於const型到非const型間的轉換;
3. reinterpret_cast<T>: 對底層位元組的重新解釋,一般用於兩個不相互關聯類型但有相同的記憶體結構間的轉換,C++對於類型是靠名字區分的,而非記憶體模型,例如void*轉換為int,這種轉換經常帶來了極大的靈活性,有時很簡潔的解決一些編程問題;
4. dynamic_cast<T>: 運行時類型轉換,處於RTTI的需要,用來在運行時完成繼承體系的向下轉換,這種轉換存在一定的運行時開銷,一般不鼓勵經常使用;
C的類型轉換風格簡潔,緊湊,但過於低級,C++的新式風格型別安全,語義明確,但可能冗長一些,權衡一下,一般還是鼓勵盡量使用C++風格的類型轉換。