C++必知系列(二)——類型轉換

來源:互聯網
上載者:User

    為了保持與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++風格的類型轉換。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.