欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++的四種類型轉(zhuǎn)換

 更新時間:2023年04月07日 11:23:23   作者:命由己造~  
這篇文章主要介紹了C++的四種類型轉(zhuǎn)換,有詳細的示例代碼展示,對于學習C++的同學有一定的參考價值,感興趣的同學可以參考本文

一、隱式類型轉(zhuǎn)換和顯示類型轉(zhuǎn)換

當?shù)忍杻蛇叺念愋筒煌臅r候、形參與實參類型不匹配的時候、返回值類型與接收返回值類型不一致時,就需要發(fā)生類型轉(zhuǎn)化
而類型轉(zhuǎn)換又分為隱式類型轉(zhuǎn)換和顯示類型轉(zhuǎn)換。

int main()
{
	// 隱式類型轉(zhuǎn)換
	int Ival = 1;
	double Dval = Ival;

	// 顯示類型轉(zhuǎn)換
	int* p = &Ival;
	int pi = p;// error
	int pi = (int)p;
	return 0;
}

隱式類型轉(zhuǎn)換是編譯器在編譯階段自動進行,能轉(zhuǎn)就轉(zhuǎn),不能轉(zhuǎn)就編譯失敗。
而顯示類型轉(zhuǎn)換就要我們自己處理。

二、C++的四種類型轉(zhuǎn)換

上面的兩種類型轉(zhuǎn)換是C語言風格的,存在一些缺點。
隱式類型轉(zhuǎn)換會造成精度的丟失。
而顯示類型轉(zhuǎn)換則會導致轉(zhuǎn)換不清晰(不知道誰轉(zhuǎn)化過來)。
所以C++提供了規(guī)范的四種類型轉(zhuǎn)換

2.1 static_cast 相似轉(zhuǎn)化

如果想要進行相似類型的轉(zhuǎn)換,編譯器隱式執(zhí)行的任何類型轉(zhuǎn)換都可用。
但是如果是兩個不相關(guān)的類型就不能轉(zhuǎn)換。

int main()
{
	int i = 0;
	double d = static_cast<int>(i);
	int* p = nullptr;
	int pi = static_cast<int>(p);// error
	return 0;
}

2.2 reinterpret_cast 不同類型轉(zhuǎn)化

上面我們用指針類型轉(zhuǎn)化成整型出現(xiàn)錯誤,而這種不同類型的轉(zhuǎn)換要用reinterpret_cast。

int main()
{
	int i = 0;
	double d = static_cast<int>(i);
	int* p = nullptr;
	int pi = static_cast<int>(p);// error

	int pi = reinterpret_cast<int>(p);// correct
	return 0;
}

2.3 const_cast 去除const屬性

使用const_cast的主要目的是為了去除一個const變量的const,方便賦值。

int main()
{
	const int i = 1;
	int* p = const_cast<int*>(&i);
	*p = 3;
	cout << i << endl;
	return 0;
}

這里的結(jié)果需要注意一下:

在這里插入圖片描述

在這里插入圖片描述

這里是因為編譯器把這個變量放到了寄存器中,我們修改的是內(nèi)存中的數(shù)據(jù),不影響寄存器,我們可以加上volatile關(guān)鍵字(每次都去內(nèi)存中?。﹣砜纯矗?/p>

int main()
{
	volatile const int i = 1;
	int* p = const_cast<int*>(&i);
	*p = 3;
	cout << i << endl;
	return 0;
}

在這里插入圖片描述

2.4 dynamic_cast 向下轉(zhuǎn)換

dynamic_cast用于將一個父類對象的指針/引用轉(zhuǎn)換為子類對象的指針或引用(動態(tài)轉(zhuǎn)換)
在前面的文章【C++】繼承中講過,子類對象賦值給父類 對象/指針/引用,這里有個形象的說法叫切片或者切割,寓意把派生類中父類那部分切來賦值過去。

但是如果我們直接把父類類傳遞給子類,會不安全,因為父類轉(zhuǎn)給子類會多開一份空間,可能會越界訪問。

class A
{
public:
	virtual void f() {}
public:
	int _a = 0;
};

class B : public A
{
public:
	int _b = 0;
};

void fun(A* pa)
{
	B* pb = (B*)pa;

	pb->_a++;
	pb->_b++;

}

int main()
{
	A a;
	B b;
	fun(&a);
	fun(&b);
	return 0;
}

在這里插入圖片描述

而加上dynamic_cast后如果轉(zhuǎn)化失敗就會返回空指針,讓我們檢查:

class A
{
public:
	virtual void f() {}
public:
	int _a = 0;
};

class B : public A
{
public:
	int _b = 0;
};

void fun(A* pa)
{
	B* pb = dynamic_cast<B*>(pa);
	cout << pb << endl;
	if (pb)
	{
		pb->_a++;
		pb->_b++;
	}
}

int main()
{
	A a;
	B b;
	fun(&a);
	fun(&b);
	return 0;
}

在這里插入圖片描述

但是這里要注意dynamic_cast只能用于父類含有虛函數(shù)的類

到此這篇關(guān)于C++的四種類型轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)C++類型轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論