日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > CPP開發(fā)者


我們先來回憶以下,C 語言的強制類型轉換形式:

 (type) expr;

這種舊式強制類型轉換從表現形式上來說不夠清晰明了,容易看漏,一旦轉換過程出現問題,追蹤起來也就更加困難。


為了解決以上問題,C++不僅兼容了C的強制轉換,來引入了新的轉換方法。


強制類型轉換的形式:

cast-name<type>(exper);

其中,type是轉換的目標類型,exper是要轉換的值,cast-name 有以下四種:

  1. static_cast

  2. dynamic_cast

  3. const_cast

  4. reinterpret_cast


接下來,我們逐個進行分析。


1、static_cast


這里先介紹下頂層const和底層const的概念:


(1)頂層const,表示指針本身是常量,例如:

int *const p1 = &i;p1 = &j; //編譯報錯,不能修改p1指向++(*p1); //可以,可以修改p1所指向的值的內容

(2)底層const,表示指針所指的對象是一個常量,例如:

const int *p2 = &i;p2 = &j; //可以,可以修改p2的指向++(*p2); //編譯報錯,不能修改p2所指向的值的內容

那么再來說說static_cast:任何具有明確定義的類型轉換,除了不包含底層const,都可以使用 static_cast。例如:

double d = 0.1;void* p = &d; double *dp = static_cast<double*>(p);

static_cast本質上是傳統(tǒng)c語言強制轉換的替代品。


通常,該操作符用于非多態(tài)類型的轉換,任何標準轉換都可以使用它。


2、dynamic_cast


用于將基類指針或引用安全的轉換成派生類的指針或引用(運行時類型識別)。


dynamic_cast運算符的使用形式如下:

dynamic_cast(e)dynamic_cast(e)dynamic_cast(e)

其中,type必須是一個類類型,并且通常情況下該類型應該含有虛函數,在第一種形式中,e必須是有效指針;在第二種形式中,e必須是一個左值,在第三種形式中,e不能是左值。


如果轉換目標是指針并且轉換失敗,則結果是0,如果轉換目標是引用并且轉換失敗的,則會拋出異常。


因此,dynamic_cast操作符一次執(zhí)行兩個操作。首先驗證被請求的轉換是否有效,只有轉換有效,操作符才實際進行轉換。


3、const_cast


只能用于改變運算對象的底層const(去掉const屬性)

例:

const char *p1;char* p2 = const_cast<char*>(p1);

注意,我們去掉了const屬性,編譯器不會再阻止我們對該對象進行寫操作,但要注意,通過p2寫值是未定義行為。


4、reinterpret_cast


該操作符用于將一種類型轉換為另一種不同的類型,


比如可以把一個指針類型轉換為一個整數,再把整數轉換為指針類型,并且還是原來那個指針。


“通常為運算對象的位模式提供較低層次上的重新解釋“,即是將變量以二進制形式被重新解釋為新的類型,這個操作本質是依賴于機器的,也就是說,還需要考慮移植性。要想安全的使用reinterpret_cast,必須對涉及的類型和編譯器實現轉換的過程都非常了解。


reinterpret_casts 的最普通的用途,就是在函數指針類型之間進行轉換。


簡單總結


  1. 基本類型(非多態(tài))的轉換用static_cast。

  2. 多態(tài)類之間的類型轉換用dynamic_cast。

  3. 去掉const屬性用const_cast。

  4. 不同類型的指針類型轉換用reinterpreter_cast。(慎用)

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
關閉