C 常用型別轉換

2021-07-13 11:19:46 字數 2293 閱讀 1820

c++大體上有兩種風格的型別轉換,顯式型別轉換和隱式型別轉換,而顯式型別轉換又分為兩種,一種c風格的強制型別轉換,另外一種使用型別轉換運算子進行型別轉換。

隱式型別轉換通常出現在以下幾種情況:

1.在不同型別的運算操作中

int intnum = 1;

double dounum = 1.1;

double addsum = intnum + dounum; //intnum型別被隱式提公升為double型別

2.c++中內建的資料型別之間存在預設的隱式轉換,例如char、int、short等;

3.在物件之間存在隱式的型別轉換,此時可以通過explicit(只對建構函式起作用)關鍵字進行宣告,以阻止不應該允許的建構函式的隱式型別轉換。

1.示例    (t)expression   t(expression) 

int intnum = (int)dounum;

注:這可能造成資料丟失,同時c風格的的型別轉換在程式中查詢起來十分的困難

1.reinterpret_cast    低階轉型,不可移植

該運算子的用法比較多。主要作用為重新解釋型別,並不進行二進位制的轉換:

應用場景:

1)轉換的型別必須是乙個指標、引用、算術型別、函式指標或者成員指標,可用於任何指標向任何指標的轉換,也可以用於將指標型別和整型型別相互轉換,把乙個指標轉換成乙個整數,把乙個整數轉換成乙個指標

2)它不進行型別檢查。reinterpret_cast轉換是在類c轉換的基礎上,在編譯期間約束了整型、浮點型和列舉型別的相互轉換。

2.const_cast    常量性轉除

該運算子只是負責給變數增加或者刪除一些屬性,以保證編譯器可以編過。

應用場景:

1)常量指標被轉化成非常量指標,並且仍然指向原來的物件;

2)常量引用被轉換成非常量引用,並且仍然指向原來的物件;

3)常量物件被轉換成非常量物件。

3.static_cast    強迫隱式轉換

該運算子約束了指標和整型、無關係型別的指標以及具有繼承關係的類之間的相互轉換關係。

應用場景:

1)它用於在存在繼承關係的類指標之間轉換,用於類層次結構中基類和子類之間指標或引用的轉換。

進行上行轉換(把子類的指標或引用轉換成基類表示)是安全的;

進行下行轉換(把基類指標或引用轉換成子類表示)時,由於沒有動態型別檢查,所以是不安全的;

2)可以用於基本資料型別之間的轉換,如把int轉換成char,把int轉換成enum;

3)把空指標轉換成目標型別的空指標;

4)它可以將void*型向任意指標型別轉換,也可以把任何型別的表示式轉換成void型別。

4.dynamic_cast

該運算子在底層並不像上面那幾種轉換運算子是使用簡單的記憶體拷貝,而是使用了rtti(執行時型別檢查)技術,所以它要求操作的指標是多型的,否則每個轉換操作都是失敗的,返回null。

應用場景:(必須要有虛函式)

1)只可以用於指標之間的轉換,它還可以將任何型別指標轉為無型別指標,甚至可以在兩個無關係的類指標之間轉換;

2)主要用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換。

3)在進行下行轉換時,dynamic_cast具有型別檢查的功能,比static_cast更安全。有條件轉換,動態型別轉換,執行時型別安全檢查(轉換失敗返回null)。

dynamic_cast 最不安全,並且效率很慢,通常應用的場景是通過基類轉換成派生類,來執行派生類特有的功能,替代方法

1)使用容器並在其中儲存直接指向派生類物件的指標;

2)在基類內提供 virtual 函式做你想對各種派生類做的事。

應避免連串的dynamic_cast**,見書《effection c++ 中文版, 第三版》 中 122頁. 

5.qobject_cast (qt 特有的)

t qobject_cast ( qobject * object )qobject_cast 函式原型。

本方法返回object向下的轉型t,如果轉型不成功則返回0,如果傳入的object本身就是0則返回0。

應用場景:

1)qobject 及其派生類,且定義時使用了q_object;

2)q_declare_inte***ce 宣告的介面類。

1)reinterpret_cast主要用於不同型別的指標進行轉換;

2)const_cast主要用於去const屬性;

3)static_cast主要用於基礎資料型別的轉換,子類轉基類;

4)dynamic_cast主要用於多型類之間的相互轉換,基類轉子類;

5)qobject_cast主要用於在槽中進行控制項型別的轉換。

C 常用型別轉換

1.int to string 1.int sprintf char buffer,const char format argument 例如 int ss char temp 64 string str ss 1000 sprintf temp,d ss string s temp 呼叫strin...

C 常用型別轉換

qstring qstr test string s qstr.tostdstring string s test qstring qstr qstring fromstdstring s qstring qstr test char filename qstr.toutf8 data 方法2 qs...

mysql型別轉換c 型別轉換 C 型別轉換

一 簡介 型別轉換 把資料從一種型別轉換另一種型別 我們要求等號兩邊參與運算子必須型別一致,如果不一致,滿足下列條件會發生自動型別轉換或者隱式型別轉換。1.兩種型別相容 例如 int和double 相容 都是數字型別 2.目標型別大於源型別 double int 顯示型別轉換 1.兩種型別相相容 i...