C 中的型別轉換

2021-07-29 23:44:08 字數 2130 閱讀 5236

我們知道:變數的型別定義了物件能包含的資料和參與的運算。其中一種運算被大多數型別支援,就是將變數從某一種給定的型別轉化為另外的型別。

在了解型別轉換種類之前,首先牢記:型別轉換只是暫時的,原來的變數型別並不改變。

在c語言中,分為兩種型別轉換

1,隱式型別轉換

2,顯示型別轉換

例如:

double d = 12.34;

int i = d;//發生隱式轉化

int* p = (int*)&double;//發生強制轉換

在c++中,標準c++為了加強型別轉換的可視性,引入了四種命名的強制型別轉換操作符:

1,static_cast

static_cast用於非多型類的轉換(類似於靜態轉換),編譯器隱式執行的任何型別轉換都可用static_cast,但它不能用於兩個不相關的型別進行轉換。

例如:

int i = 0;

double d = static_cast(i);

2,reinterpret_cast

reinterpret_cast用於reinterpret_cast操作符通常為運算元的位模式提供較低層次的重新解釋,用於將一種型別轉換為另一種不同的型別。

例如:

typedef void (*fun_1)();

int fun_2(double d)

fun_1 f = reinterpret_cast(fun_2);//將fun_2的位模式重新解釋為fun_1的位模式,使得編譯通過。

f();//按照fun_1的規範呼叫函式

注:c++不能保證所有的函式指標都被一樣的使用,所以有時會產生不確定的結果。

3,const_cast

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

確切的說,const_cast去掉的是底層const的屬性。即只改變指標或引用的const屬性,不改變物件本身的const屬性。

例如:

void fun1(int a){}//引數型別不同,const的種類不同

void fun2(int& a){}//引數型別不同,const的種類不同

int main()

此時,通過const_cast即可。

fun2(const_cast(a));

4,dynamic_cast

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

向上轉型:子類物件指標->父類指標/引用(不需要轉換)

向下轉型:父類物件指標->子類指標/引用(用dynamic_cast轉型是安全的)

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

2.  dynamic_cast會先檢查是否能轉換成功,能成功則轉換,不能則返回0。

例如:

class base

};class derived:public base

{};int main()

此時,需要使用dynam_cast來強制轉換。

derived* pd = dynamic_cast(new base());

另外:對於類來說,當滿足:1,類中成員變數只有乙個(單參)2,沒有被expli修飾。

如果我們使用拷貝形式的初始化(使用=)時,會發生隱式轉換,編譯器用給定的左值自建立乙個該類的物件,將這個臨時變數傳給需要初始化的類。

例如:

class a

; int i;

}a a = 20;//此時會發生隱式轉換

編譯器會通過20建立乙個類中變數i為20的臨時類,將臨時類傳給a,會呼叫預設或自己寫的拷貝建構函式。這種情況就是使用拷貝形式的初始化。

當我們在建構函式宣告前加上explicit關鍵字時,該建構函式只能用於直接初始化。即

a類中:explicit a(int a):i(a);
a a2(a1);//直接初始化

這樣可以避免一些不合時宜的隱式轉換。

C 中的型別轉換

和goto語句一樣型別轉換的名聲似乎也是不那麼好。不過型別轉換在某些緊要關頭就顯得尤為重要,看看現有的c c 就知道,以至於你不理解轉換的作用,將是無法閱讀的。就像鈾,它能變成原子彈,但它也能用來發電,是災難還是福祉那就要看人類了。顯然型別轉換默默承受著這不公的一切。不管怎麼說c風格的型別轉換還是不...

C 中的型別轉換

1.隱式轉換 1 賦值轉換 將右值轉換為左型別,然後再賦值。2 整型提公升 c 將bool char,unsigned char,singned char,short轉換為int,int計算最快 表示式中的優先順序轉換 long double double float unsigned long 對...

C 中的型別轉換

c 中有四種型別轉換,const cast static cast,reinterpret cast,dynamic cast c風格的型別轉換即強制轉換最簡單粗暴,管你是什麼型別,直接擴號擴起來了事,缺點就是 表達不夠清晰,容易造成隱患 float count 2.0f int totalcoun...