C 學習筆記13 型別轉換

2021-10-11 03:11:36 字數 1386 閱讀 4668

const_cast 運算子用於修改型別的 const / volatile 屬性。除了 const 或 volatile 屬性之外,目標型別必須與源型別相同。這種型別的轉換主要是用來操作所傳物件的 const 屬性,可以加上 const 屬性,也可以去掉 const 屬性。

class a  ;  

void function()

​ dynamic_cast 在執行時執行轉換,驗證轉換的有效性。如果轉換未執行,則轉換失敗,表示式 expr 被判定為 null。dynamic_cast 執行動態轉換時,type 必須是類的指標、類的引用或者 void*,如果 type 是類指標型別,那麼 expr 也必須是乙個指標,如果 type 是乙個引用,那個 expr 也必須是乙個引用。它將expr值轉換成型別為type的物件指標,主要用來實現類層次結構的提公升,在很多書中它被稱做「安全的向下轉型(safe downcasting)」,用於繼承體系中的向下轉型,將基類指標轉換為派生類指標,這種轉換較為嚴格和安全。如下面的**片段所示:

class

b;

classd:

public b ;

void

function

(b *pobjb)

如果pobjb指向乙個d型別的物件,pobj則指向該物件,所以對該指標執行d型別的任何操作都是安全的。但是,如果pobjb指向的是乙個b型別的物件,pobj將是乙個空指標,這在一定程度上保證了程式設計師所需要的「安全」,只是,它也付出了一定的執行時代價,而且代價非常大,實現相當慢。有一種通用實現是通過對類名稱進行字串比較來實現的,只是其在繼承體系中所處的位置越深,對strcmp的呼叫就越多,代價也就越大。如果應用對效能要求較高,那麼請放棄dynamic_cast。

reinterpret_cast 運算子把某種指標改為其他型別的指標。它可以把乙個指標轉換為乙個整數,也可以把乙個整數轉換為乙個指標。

class a ;  

class b ;

void f()

static_cast 運算子執行非動態轉換,沒有執行時類檢查來保證轉換的安全性。例如,它可以用來把乙個基類指標轉換為派生類指標。

class b ;  

class d : public b ;

void function(b* pb, d* pd)

之所以說第一種是不安全的,是因為如果pb指向的僅僅是乙個基類b的物件,那麼就會憑空生成繼承資訊。至於這些資訊是什麼、正確與否,無從得知。所以對它進行d型別的操作將是不安全的。

Solidity學習 (13)型別轉換

型別轉換,是乙個十分重要,常用的手段 一 隱式轉換 隱式轉換,就是當乙個運算子能支援不同型別,編譯器會隱式的嘗試將乙個運算元的型別,轉為另乙個運算元的型別,賦值同理。條件是 值型別間的互相轉換只要不丟失資訊,語義可通則可轉換。就是說,uint8可轉換到uint16 uint32 等,但不能反過來 同...

C 學習筆記(13) 類的型別轉換

c 的某些型別之間可以進行轉換,如int轉double,double轉int等等。而我們自定義的類 作為型別來看 也是可以進行轉換的。本篇筆記將總結c 類的型別轉換問題。一 型別轉換 可以將類定義成與基本型別或另乙個類相關,使得從一種型別轉換為另一種型別是有意義的。在這種情況下,程式設計師可以指示c...

C 學習筆記 07 型別轉換

型別轉換 賦值轉換 賦值轉換指的是將一種型別的值賦給另一種型別的變數,這時,值將會轉換為接收變數的型別,如語句 a b 如果a是long型,b是short型,則程式會將16位 short佔兩位元組 的b提公升為32位 long佔4位元組 並賦給a,直觀上講,型別的表達能力取決於該型別所佔的記憶體位數...