C 中,有哪4種與型別轉換相關的關鍵字

時間 2021-09-02 07:15:46

1樓:匿名使用者

1)static_cast (content) 靜態轉換.在編譯期間處理

它主要用於c++中內建的基本資料型別之間的轉換.但是沒有執行時型別的檢測來保證轉換

的安全性.

a.用於基類和子類之間的指標或引用的轉換。這種轉換把子類的指標或引用轉換為基類表示是安全的;

進行下行轉換,把基類的指標或引用轉換為子類表示時,由於沒有進行動態型別檢測,所以是不安全的;

b.把void型別的指標轉換成目標型別的指標(不安全).

c.用於內建的基本的資料型別之間的轉換.

d.把任何型別的表示式轉換成void型別的.

注意:static_cast不會轉換掉content的const,volatile,__unaligned屬性

2)const_cast(content):去常轉換;編譯時執行;

它主要作用同乙個型別之間的去常和新增常屬性之間的轉換.不能用做不同的型別之間的轉換.

它可以把乙個不是常屬性的轉換成常屬性的,同時它也可以對乙個本是常屬性的型別進行去常.

3)dynamic_cast(content) 動態型別轉換;也是向下安全轉型;是在執行的時候執行;

通常用於基類和派生類之間的轉換.轉換時會進行型別安全檢查。

a.不能用於內建的基本資料型別之間的轉換.

b.dynamic_cast轉換成功的話返回的是類的指標或引用,失敗返回null;

c.dynamic_cast進行的轉換的時候基類中一定要有虛函式,因為只有類中有了虛函式,

才說明它希望讓基類指標或引用指向其派生類物件的情況,這樣才有意義.

這是由於執行時型別檢查需要執行時型別的資訊,而這些資訊儲存在虛函式表中.

d.在類的轉換時,在類層次間進行轉換的時候,dynamic_cast和static_cast進行上行轉換

的時候效果是一樣的;但是在進行下行轉換的時候,dynamic_cast會進行型別檢查所以

它更安全.它可以讓指向基類的指標轉換為指向其子類的指標或是其兄弟類的指標;

4)reinterpret_cast(content)重解釋型別轉換;

它有著和c風格強制型別轉換同樣的功能;它可以轉化任何的內建資料型別為其他的型別,

同時它也可以把任何型別的指標轉化為其他的型別;它的機理是對二進位制資料進行重新的

的解釋,不會改變原來的格式,而static_cast會改變原來的格式;

2樓:匿名使用者

static_cast、reinterpret_cast、const_cast、dynamic_cast

c++有哪四個型別轉換相關的關鍵字

3樓:電商運營的機會

1、const_cast

號稱唯一具有常量性移除的轉型操作符,這個說法實在很廢話,不解釋。平時幾乎沒有用過,遇到需要這個關鍵字的時候,都是直接修改了介面的型別,也不會去用這個關鍵字,一般來說老介面設計有問題啊。明明是const的,非得轉成non-const實在彆扭。

2、dynamic_cast

號稱安全向下轉型(safe downcasting),就是把乙個父型別轉成它的子型別,如果不是父子關係則會返回0,比如一種用法:

assert(dynamic_cast(pbase));

曾經認為是唯一好用又常用的轉型操作符,但在吃過虧後發現也要三思而後用,比較喜歡無腦,所以不再喜歡它了。

不止一本書上說這個操作符有效能問題,但是它們沒有給出具體的度量值,也不會告訴你效能分析軟體沒法將它的耗時與語句直接對應上,比如會把使用這個操作符的語句耗時顯示在unknown分組中,太操蛋了。google的c++編碼規範中也明確禁用此關鍵字,可惜我仍然還沒反應過來,吃了大虧。

總之,熱點程式裡面不要用。

3、static_cast

把編譯器隱式執行的轉型搞成顯式的,特別是有告警的型別轉換加上它就ok啦,比如double轉int。偶爾用用,敲這麼多字,還是c風格省心……

4、reinterpret_cast

對運算元的位模式做轉化,比如把乙個結構體轉成char*。從來沒用過,這名字實在陌生得緊,不看書真心想不起來。一般都會把源操作記憶體塊轉成void,然後使用的地方再找到想要的字段,轉成想要的型別,工作中還沒見過**直接用的。

excel中有幾類不同的資料如A類 B類 C類,先如何從這幾類資料中隨機挑選組成新的資料如A1B3C

用rand函式可以實現你的要求。先把各類資料分別輸到abc列中手機回答字數限制,後兩個括號補上相應內容。補充 附圖 randbetween 1,10 是指行號為1 10行,根據需要你可以改為2 18等,每列的行可以不一致,比如a1 a6,b1 b6,c1 c6三列6行中有三種不同型別的資料則在e g...

C一種寫法,有點看不懂,求教,C 程式碼中,有幾句看不懂,求助。為什麼new了乙個物件,後面大括號裡面是另外乙個new操作?

這個是泛型,比如呼叫可以是 get abc 返回值就是乙個int 但是這個泛型有要求就是,t必須是baseentity或者他的子類,而且必須有個無參建構函式.對於那個奇怪的問題,可能是基類的成員,這個基類可能是他的父類,也可能是他的爺爺類.object是所有類的基類,所以所有類都有object的幾個...

債券型基金裡,分a b類和c類,這兩種基金有什麼區別

麻木 1 收益期限不同 a類屬於前端收費,長期投資會有不錯的收益 資金持有時間超過兩年的投資者b類其實是較為合適的 c類是適合一些購買持有時間不定的投資者,持有滿30天不需要贖回費用。2 收費不同 a類一般是代表前端收費,b類代表後端收費,而c類是沒有申購費。 山東總督 說實話,這樣子令人感到很尷尬...