1. 程式人生 > >【C++】四種強制型別轉換

【C++】四種強制型別轉換

強制型別轉換在有些地方起到了很大的作用,在看C++中的強制型別轉換時,我們首先看一下我們熟悉的C語言中的強制型別轉換。

一.C語言的強制型別轉換

C語言中強制型別轉換分為兩種:

  • 隱式型別轉換(相似型別轉換,及相關型別的轉換,這裡和型別提升也優點相似)
  • 顯示型別轉換(不相關型別之間的轉換,比如指標和整型)
int main()
{
	int i = 1;
	double b = i;//隱式型別轉換
	printf("%d,%2fd\n", i, b);

	int* p = &i;
	int num = (int)p;//顯示型別轉換
	printf("%x,%d\n", p, num);

	system("pause");
	return 0;
}

 我們看到C語言中的兩種強制型別轉換,其中的隱式型別轉換存在很大的弊端,比如:陣列中在任意位置插入,需要將元素向後搬移,這就有可能產生錯誤,這裡就不做程式碼演示了。感興趣的同學可以留言,我會貼出來。而且C語言的強制型別轉換我們可以看到不夠規範,這使得程式碼的可讀性降低了很大。

二.C++的強制型別轉換

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

	int i = 10;
	double b = static_cast<double>(i);
	cout << i << " " << b << endl;

 2.reinterpret_cast:將一種型別轉換為另一種不同的型別。

	int i = 10;
	int* b = reinterpret_cast<int*>(i);
	cout << i << " " << b << endl;

 3.const_cast:刪除變數const的屬性,方便賦值

1.)在看這個強制型別轉換之前,我們首先看一下C語言中一個有趣的事情。

int main()
{
	const int i = 3;
	int* p = (int*)&i;
	*p = 4;
	printf("%d\n", i);
	system("pause");
	return 0;
}

 我們首先看一下,該程式會輸出什麼勒????可能很多同學會認為是輸出4,其實不然。其實是3.我們來看以下編譯器迷惑的地方。

我們開啟監視視窗發現,明明是4,為什麼輸出的是3勒,這個看起來就有點扯了。我們在開啟彙編程式碼看一下。

 我們看到函式在呼叫堆疊的時候,push進去的是3,那麼在pop出棧的時候肯定也是3.這就相當於將i這個值放在了暫存器上,並不是記憶體上。

2.)C++中的const_cast

	const int i = 3;
	int* p = const_cast<int*>(&i);
	*p = 3;
	cout << p << " " << i << endl;

4.dynamic_cast:用於將一個父類物件的指標轉換為子類物件的指標或引用。(動態交換)

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

注意:

  • dynam_cast:只能用於是多型的類(必須有共有繼承和虛擬函式)
  • dynam_cast:會先檢查能否轉型成功,能成功則轉型,不能成功則返回0