我們知道:變數的型別定義了物件能包含的資料和參與的運算。其中一種運算被大多數型別支援,就是將變數從某一種給定的型別轉化為另外的型別。
在了解型別轉換種類之前,首先牢記:型別轉換只是暫時的,原來的變數型別並不改變。
在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操作符通常為運算元的位模式提供較低層次的重新解釋,用於將一種型別轉換為另一種不同的型別。
例如:
注:c++不能保證所有的函式指標都被一樣的使用,所以有時會產生不確定的結果。typedef void (*fun_1)();
int fun_2(double d)
fun_1 f = reinterpret_cast(fun_2);//將fun_2的位模式重新解釋為fun_1的位模式,使得編譯通過。
f();//按照fun_1的規範呼叫函式
3,const_cast
const_cast最常用的用途就是刪除變數的const屬性,方便賦值。
確切的說,const_cast去掉的是底層const的屬性。即只改變指標或引用的const屬性,不改變物件本身的const屬性。
例如:
此時,通過const_cast即可。void fun1(int a){}//引數型別不同,const的種類不同
void fun2(int& a){}//引數型別不同,const的種類不同
int main()
fun2(const_cast(a));
4,dynamic_cast
dynamic_cast用於將乙個父類物件的指標轉換為子類物件的指標或引用(動態轉換)
向上轉型:子類物件指標->父類指標/引用(不需要轉換)
向下轉型:父類物件指標->子類指標/引用(用dynamic_cast轉型是安全的)
1. dynamic_cast只能用於含有虛函式的類。
2. dynamic_cast會先檢查是否能轉換成功,能成功則轉換,不能則返回0。
例如:
此時,需要使用dynam_cast來強制轉換。class base
};class derived:public base
{};int main()
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...