C 的四種型別轉換運算子

2021-10-05 23:29:16 字數 2092 閱讀 6531

#include

#include

using namespace std;

class complex

public:

operator double()

const

//型別轉換函式

private:

double m_real;

double m_imag;};

intmain()

#include

using namespace std;

intmain()

#include

using namespace std;

class a

private:

int m_a;

int m_b;};

intmain()

可以想象,用乙個 float 指標來操作乙個 char 陣列是一件多麼荒誕和危險的事情,這樣的轉換方式不到萬不得已的時候不要使用。將a轉換為int,使用指標直接訪問 private 成員刺穿了乙個類的封裝性,更好的辦法是讓類提供 get/set 函式,間接地訪問成員變數。

#include

#include

using namespace std;

class base

intget_a()

const

virtual void

func()

const

protected:

int m_a;};

class derived: public base

intget_b()

const

private:

int m_b;};

intmain()

向下轉型時是有風險的,dynamic_cast 會借助 rtti 資訊進行檢測,確定安全的才能轉換成功,否則就轉換失敗。那麼,哪些向下轉型是安全地呢,哪些又是不安全的呢?

#include

using namespace std;

class a

private:

int m_a;};

class b: public a

private:

int m_b;};

class c: public b

private:

int m_c;};

class d: public c

private:

int m_d;};

intmain()

else

pc = dynamic_cast>

(pa)

;//向下轉型失敗

if(pc ==

null

)else

cout <<

"-------------------------"

<< endl;

//情況②

pa = new d()

;//向上轉型都是允許的

pb = dynamic_cast>

(pa)

;//向下轉型成功

if(pb ==

null

)else

pc = dynamic_cast>

(pa)

;//向下轉型成功

if(pc ==

null

)else

return0;

}

從表面上看起來 dynamic_cast 確實能夠向下轉型,本例也很好地證明了這一點:b 和 c 都是 a 的派生類,我們成功地將 pa 從 a 型別指標轉換成了 b 和 c 型別指標。但是從本質上講,dynamic_cast 還是只允許向上轉型,因為它只會向上遍歷繼承鏈。造成這種假象的根本原因在於,派生類物件可以用任何乙個基類的指標指向它,這樣做始終是安全的。本例中的情況②,pa 指向的物件是 d 型別的,pa、pb、pc 都是 d 的基類的指標,所以它們都可以指向 d 型別的物件,dynamic_cast 只是讓不同的基類指標指向同乙個派生類物件罷了。

C 中四種型別轉換運算子的使用方法

c 的四個型別轉換運算子用法和區別歸納如下 具體歸納如下 reinterpret cast 該函式將乙個型別的指標轉換為另乙個型別的指標.這種轉換不用修改指標變數值存放格式 不改變指標變數值 只需在編譯時重新解釋指標的型別就可做到.reinterpret cast 可以將指標值轉換為乙個整型數,但不...

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型別,但沒有執行時型別檢查來保證轉換的安全性。它主要有如下幾種用法 用於...