c++為了規範c中的型別轉換,加強型別轉換的可視性,引入了四種強制型別轉換操作符:static_cast, reinterpret_cast, const_cast, dynamic_cast
他們本質上都是模板類。
下面分別來介紹:
1.static_cast
它用於非多型型別的轉換(靜態轉換),對應於c中的隱式型別轉換,但他不能用於兩個不相關型別的轉換,如整形和整形指標之間的轉換,雖然二者都是四個位元組,但他們乙個表示資料,乙個表示位址,型別不相關,無法進行轉換。
有這麼一種特殊的情況:
class a
private:
int _a;
};void test()
對於a a2 = 20;
這一行**,等號右邊是乙個整型,左邊是自定義a型別,兩者型別完全不相關,理論上是不能進行轉換的,但是編譯器卻沒有報錯,原因是a型別的建構函式只有乙個引數,編譯器會用20構造乙個a型別的臨時物件,再呼叫拷貝建構函式建立a2,由於在一條表示式中既有構造又有拷貝構造,編譯器會進行優化,將二者合二為一,只呼叫了建構函式。因此,單參的建構函式會進行隱式型別轉換,c++中即可用static_cast來轉。但是這種隱式型別轉換有時候是不安全的,尤其是在使用智慧型指標時,當我們將乙個不需要使用者自己管理釋放空間的指標交給智慧型指標時,系統並不會報錯,但是智慧型能指標使用完會呼叫析構函式來釋放空間,此時就會出問題。
為了防止這種單參建構函式的隱式型別轉換,c++提供了乙個關鍵字explicit來消除這種轉換。
加上explicit之後:
class a
private:
int _a;
};void test()
這樣就有效的避免了隱不合時宜的轉換。
2.reinterpret_cast
reinterpret的含義是重新解釋,可將一種型別轉換成另一種不相關型別,對應c中的強制型別轉換,處理無法進行隱式轉換的情況
void test()
強制型別轉換有時可以很暴力的處理一些問題
如下例:
對於乙個帶引數的函式,如何不傳參也可以呼叫該函式?
void fun(int s)
typedef
void(*func)();
void test()
c中的強制型別轉換也可以處理。
雖然我們通過這種bug的方式轉換函式指標,但是這樣的**是不可移植的,而且有時會產生不確定的結果,所以不建議這樣來用
如此處輸出的s的值就為乙個隨機值,雖然使用者在外部未傳參,但是該函式在呼叫時會建立形參,該形參未初始化,自然是隨機值
3.const_cast
他的功能就是刪除變數的const屬性,方便再次賦值
void test3()
此時這兩個值會分別輸出多少呢
我們先來看下監視視窗:
可是輸出結果卻是這樣的:
事實上,一旦將乙個變數定義成const型別,編譯器會進行優化,將該值放在暫存器中,預設他是不能被改變的,每次在使用時直接從暫存器中取資料,即使我們改變了他在記憶體中的值,編譯器對此是透明的,無法看到
檢視彙編**:
這裡編譯器的處理更為直接,將0ah直接壓棧,所以結果是這樣的
為了防止編譯器對我們的**進行優化,我們可以借助乙個關鍵字valatile,
他可以保證每次從記憶體中進行取資料。
4.dynamic_cast
這種轉換用於將父類物件的指標轉換成子類物件的指標或引用。
向上轉型:子類物件指標->父類指標/引用(不需要轉換,賦值相容規則)
向下轉型:父類物件指標->子類指標/引用(用dynamic_cast轉型是安全的)
class a
int _a;
};class b:public a
int _b;
};void fun(a* p)
void test4()
執行結果如下:
因為a類大小為8位元組,b類為12位元組,將乙個a類指標強制轉成b類,再用該指標去訪問b類中的_b,會訪問越界,讀到的是隨機值,一旦進行寫,程式就會崩潰。
c++提供了一種更加安全的轉換機制,使用dynamic_cast來進行轉換。
注意:1.dynamic_cast只能用於含有虛函式的類2.dynamic_cast在轉換時會先檢查能否轉換成功,能就進行轉換,不能就返回0將fun函式進行改造:
這樣就可以保證我們**的安全性,
mysql型別轉換c 型別轉換 C 型別轉換
一 簡介 型別轉換 把資料從一種型別轉換另一種型別 我們要求等號兩邊參與運算子必須型別一致,如果不一致,滿足下列條件會發生自動型別轉換或者隱式型別轉換。1.兩種型別相容 例如 int和double 相容 都是數字型別 2.目標型別大於源型別 double int 顯示型別轉換 1.兩種型別相相容 i...
C 型別轉換
在程式中,進行型別轉換是常見的事。那麼在 c 中支援以前語言的型別轉換方法,即用型別名進行強行轉換,例如 object objtest new newtype newtype newvalue newtype objtest 但是這樣轉換,有個嚴重的問題,就是在把 objtest 強轉換成 newt...
C 型別轉換
型別轉換是將一種型別的值對映為另一種型別的值。型別轉換實際上包含有自動隱含和強制的兩種。型別的自動隱式轉換 c 語言編譯系統提供的內部資料型別的自動隱式轉換規則如下 1.程式在執行算術運算時,低型別可以轉換為高型別。2.在賦值表示式中,右邊表示式的值自動隱式轉換為左邊變數的型別,並賦值給它。3.當在...