C 提供了四個轉換運算子

2022-05-30 11:27:10 字數 2604 閱讀 3208

它們有著相同的結構,看起來像是模板方法。這些方法就是提供給開發者用來進行指標和引用的轉換的。

1、const_cast用法

const_cast是一種c++運算子,主要是用來去除復合型別中const和volatile屬性(沒有真正去除)。

變數本身的const屬性是不能去除的,要想修改變數的值,一般是去除指標(或引用)的const屬性,再進行間接修改。

用法:const_cast(expression)

通過const_cast運算子,也只能將const type*轉換為type*,將const type&轉換為type&。

也就是說源型別和目標型別除了const屬性不同,其他地方完全相同。

#includeusing

namespace

std;

void

consttest1()

void

consttest2()

intmain()

輸出:5

6若輸入7

則輸出8

解釋為什麼輸出8:

當常變數為 const int j =i 時,直接輸出j時,編譯器不能進行優化,也就是不能夠直接用i代替j;(r是a的引用,r變,a會變)

當常變數為const int j =5時,直接輸出j時,編譯器會進行優化,也就是用文字常量5直接代替j;

2)  static_cast

用法:static_cast (expression)

說明:該運算子把expression轉換為typeid型別,但沒有執行時型別檢查來確保轉換的安全性。

用途:

a) 用於類層次結構中基類和派生類之間指標或者引用的轉換。up-casting (把派生類的指標或引用轉換成基類的指標或者引用表示)是安全的;down-casting(把基類指標或引用轉換成子類的指標或者引用)是不安全的。

b) 用於基本資料型別之間的轉換,如把int轉換成char,這種轉換的安全性也要由開發人員來保證。

c) 可以把空指標轉換成目標型別的空指標(null pointer)。

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

注意: static_cast不能轉換掉expression的const、volitale或者__unaligned屬性。

class

a

virtual

void

b()

private

:

inti;

};class b:publica};

int main(void

)

3) reinterpret_cast

用法:reinterpret_cast (expression)

說明:轉換乙個指標為其他型別的指標,也允許將乙個指標轉換為整數型別,反之亦然。這個操作符能夠在非相關的型別之間進行轉換。操作結果只是簡單的從乙個指標到別的指標的值的二進位制拷貝,在型別之間指向的內容不做任何型別的檢查和轉換。這是乙個強制轉換。使用時有很大的風險,慎用之。

注意:reinterpret _cast不能轉換掉expression的const、volitale或者__unaligned屬性。

4)dynamic_cast

用法:dynamic_cast (expression)

說明:該運算子把expression轉換成typeid型別的物件。typeid必須是類的指標、類的引用或者void*。如果typeid是類的指標型別,那麼expression也必須是指標,如果typeid是乙個引用,那麼expression也必須是乙個引用。一般情況下,dynamic_cast用於具有多型性的類(即有虛函式的類)的型別轉換。

dynamic_cast依賴於rtti資訊,其次,在轉換時,dynamic_cast會檢查轉換的source物件是否真的可以轉換成target型別,這種檢查不是語法上的,而是真實情況的檢查。先看rtti相關部分,通常,許多編譯器都是通過vtable找到物件的rtti資訊的,這也就意味著,如果基類沒有虛方法,也就無法判斷乙個基類指標變數所指物件的真實型別,這時候,dynamic_cast只能用來做安全的轉換,例如從派生類指標轉換成基類指標。而這種轉換其實並不需要dynamic_cast參與。也就是說,dynamic_cast是根據rtti記載的資訊來判斷型別轉換是否合法的。

用途:主要用於類層次之間的up-casting和down-casting,還可以用於類之間的交叉轉換。在進行down-casting時,dynamic_cast具有型別檢查的功能,比static_cast更安全。檢測在執行時進行。如果被轉換的指標不是乙個被請求的有效完整的物件指標,返回值為null。當用於多型型別時,它允許任意的隱式型別轉換以及相反過程。不過,與static_cast不同,在後一種情況裡(注:即隱式轉 換的相反過程),dynamic_cast會檢查操作是否有效。也就是說,它會檢查轉換是否會返回乙個被請求的有效的完整物件。

注意:dynamic_cast不能轉換掉expression的const、volitale或者__unaligned屬性。

,四個運算子的求值順序

c語言中只有四個運算子 存在規定的求值順序。運算子 和運算子 首先對左側運算元求值,只在需要時才對右側運算元求值。運算子?有三個運算元 在a?b c中,運算元a首先被求值,根據a的值再求操作 數b或c的值。逗號運算子,首先對左側運算元求值,然後該值被 丟棄 再對右側運算元求值。注 分割函式引數的逗號...

C 運算子過載轉換運算子

為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...

C 四個預設成員函式 運算子過載

1 1 類的定義 在c 中,用 類 描述 物件 所謂的物件是指現實世界中的一切事物。類是建立物件的模板,乙個類可以建立多個物件,每個物件都是類的乙個具體 例項,擁有類的成員變數和成員函式。乙個簡單的類定義 class student 2 訪問限定符 宣告了對類的外部介面,所有來自外部的訪問通過介面進...