c 之四種型別轉換

2021-08-08 19:33:39 字數 1654 閱讀 6105

const_cast的主要用途是去掉物件引用或指標的const屬性。但是即使轉換後,對原始的const物件也不能真正的改變其值,只能是改變其引用或者*指標的值(具體如何實現沒有深入研究,參考下面的**)。

const_cast的使用場景不在於要修改const物件的值,而是主要用在引數傳遞等場景。參考**中的注釋。

#include 

using

namespace

std;

void test_const_cast(void)

int main(int argc, char ** argv)

static_cast和dynamic_cast的驗證都記載在如下的**中,**的注釋為驗證的結論。在最後會有乙個static_cast和dynamic_cast的不同的說明。

#include 

using

namespace

std;

class a ;

class b ;

class a1 : public a ;

class a2 : public a ;

class c

virtual ~c(){}

void gettype( void )

void testc( void )

void intc( void )

private:

int a;

};class c1 : public c ;

class d

void gettype( void )

void testd( void )

};void test(void)

int main(int argc, char ** argv)

除了dynamic_cast以外的轉換,其餘的3種型別轉換操作符的行為的都是在編譯期就得以確定的,轉換是否成功,並不依賴被轉換的物件。而dynamic_cast則不然.

首先,dynamic_cast依賴於rtti資訊.

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

從上面的static_cast的**驗證中可以看出來,static_cast在無關類之間的轉換會報錯;而dynamic_cast在無關類之間的轉換不會報錯。dynamic_cast的轉換需要轉換類好被轉換類都有虛函式表。如果沒有虛函式表,那麼只能執行安全轉換了,即從派生類轉換成基類。

雖然dynamic_cast能在無關類之間進行轉換,但是需要注意轉換後的型別安全性需要程式設計師自己來驗證,比如說呼叫轉換前後的類共有的函式,那麼能夠呼叫到,但是如果兩個類對這個函式的實現不同,比如轉換前的類的實現中呼叫了私有成員變數b,但是轉換後的類中的這個函式呼叫了私有成員變數a,因為轉換前的類中沒有成員變數a,那麼轉換後呼叫成員變數a肯定會出錯,導致程式崩潰,具體參考實驗**。

c 四種型別轉換

c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a。c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...

C 四種型別轉換

include include includeusing namespace std static cast 用法 static cast type id expression 該運算子把expression轉換為type id型別,但沒有執行時型別檢查來保證轉換的安全性。它主要有如下幾種用法 用於...

C 四種型別轉換

1 static cast 1.上行轉換,把派生類的指標或引用轉換成基類,此時是安全的 2.下行轉換,把基類的指標或者引用轉換成派生類,因為沒有動態監測,所以是不安全的 3.顯示型別轉換,如int轉float等 4.任意型別空指標轉任意型別空指標 5.任意型別表示式轉為void型別 如下 int a...