C 強制型別轉換

2021-08-22 19:06:29 字數 2119 閱讀 2210

c語言

c++

void test()

raii: 建構函式初始化與儲存資源,析構函式自動釋放資源。也稱為「資源獲取就是初始化」,是c++等程式語言常用的管理資源、避免記憶體洩露的方法。它保證在任何情況下,使用物件時先構造物件,最後析構物件。

rtti:(run-time type identification ) 通過執行時型別資訊程式能夠使用基類的指標或引用來檢查這些指標或引用所指的物件的實際派生型別。

typeid

(a).name

()

static_cast
static_cast用於非多型型別的轉換(靜態轉換),任何標準轉換都可以用它,但是不可以用於兩個不相關的型別進行轉換。

void test()

reinterpret_cast
reinterpret_cast用於將一種型別轉換為不同的型別。

typedef

void (*func)();

int dosomething(int i)

void test()

reinterpret_cast( )

t 必須是乙個指標、引用、算術型別、函式指標或者成員指標。它可以把乙個指標轉換成乙個整數,也可以把乙個整數轉換成乙個指標(先把乙個指標轉換成乙個整數,再把該整數轉換成原型別的指標,還可以得到原先的指標值)。

也就是說需要傳參的函式在經過reinterpret_cast強制轉換之後不傳引數也可以呼叫。

reinterpret_cast和static_cast的主要區別在多重繼承。例如:

class a

;class b

;class c : public a, public b

{};int main()

上面這段**中, 前兩個輸出值相同,第三個偏移了四個位元組,這是因為static_cast計算了父子類指標轉換的偏移量,並將之轉換到正確的位址(c裡面有m_a,m_b,轉換為b*指標後指到m_b處),reinterpret_cast卻不會做這一層轉換。

慎用reinterpret_castconst_cast

const_cast最常用的屬性就是刪除變數的const屬性,方便賦值。

int main()

dynamic_cast

dynamic_cast用於將乙個父類物件的指標轉換為子類物件的指標或引用(動態轉換)

dynamic_cast只能用於含有虛類的函式

dynamic_cast會先檢查是否能成功轉換,能轉換則轉換,如果不能則返回。

虛函式重寫時,傳入的父類的指標或引用,這個指標有兩種情況。

如果是第一種情況傳入的父類指標強轉成子類指標沒有問題,但是第二種情況父類的指標強轉成子類指標就會造成越界。所以轉換的時候需要檢測指標的型別,這時候就有了dynamic_cast。

class a

};class b : a

{};void fun(a* pa)

explicit關鍵字

explicit關鍵字阻止經過轉換建構函式進行的隱式轉換的發生。

c++ 單引數的建構函式的類支援隱式型別轉換

注意單引數建構函式才可以使用

智慧型指標就使用了explicit防止**型別轉化

class c

//c(int c) //單引數型別的建構函式支援隱式型別的轉換

//:_c(c)

//{}

private:

int _c;

};int main()

C 強制型別轉換

四種型別可能很多人都常常忽略就象我一樣,但是有時還是比較有用的。不了解的建議看看,一些機制我也不是十分了解,只是將一些用法寫出來讓大家看看。強制轉化無論從語法還是語意上看,都是c 中最難看的特徵之一。但是基於c風格的轉化的語義的不明確性及其一些潛在問題。強制型別轉化最終還是被c 接受了。1.stat...

C 強制型別轉換

標準c 中主要有四種強制轉換型別運算子 const cast,reinterpret cast,static cast,dynamic cast等等。1 static cast a 將位址a轉換成型別t,t和a必須是指標 引用 算術型別或列舉型別。表示式static cast a a的值轉換為模板中...

C 強制型別轉換

關於強制型別轉換的問題,很多書都討論過,寫的最詳細的是c 之父的 c 的設計和演化 最好的解決方法就是不要使用c風格的強制型別轉換,而是使用標準c 的型別轉換符 static cast,dynamic cast。標準c 中有四個型別轉換符 static cast,dynamic cast,reint...