亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中四種類型轉換的方法是什么

發布時間:2023-04-07 16:58:58 來源:億速云 閱讀:90 作者:iii 欄目:開發技術

這篇文章主要介紹了C++中四種類型轉換的方法是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C++中四種類型轉換的方法是什么文章都會有所收獲,下面我們一起來看看吧。

一、隱式類型轉換和顯示類型轉換

當等號兩邊的類型不同的時候、形參與實參類型不匹配的時候、返回值類型與接收返回值類型不一致時,就需要發生類型轉化
而類型轉換又分為隱式類型轉換和顯示類型轉換

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

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

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

二、C++的四種類型轉換

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

2.1 static_cast 相似轉化

如果想要進行相似類型的轉換,編譯器隱式執行的任何類型轉換都可用。
但是如果是兩個不相關的類型就不能轉換

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 不同類型轉化

上面我們用指針類型轉化成整型出現錯誤,而這種不同類型的轉換要用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;
}

這里的結果需要注意一下:

C++中四種類型轉換的方法是什么

C++中四種類型轉換的方法是什么

這里是因為編譯器把這個變量放到了寄存器中,我們修改的是內存中的數據,不影響寄存器,我們可以加上volatile關鍵字(每次都去內存中取)來看看:

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

C++中四種類型轉換的方法是什么

2.4 dynamic_cast 向下轉換

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

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

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;
}

C++中四種類型轉換的方法是什么

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

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;
}

C++中四種類型轉換的方法是什么

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

關于“C++中四種類型轉換的方法是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C++中四種類型轉換的方法是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

云安县| 海丰县| 博野县| 临沭县| 宁南县| 黔西县| 高淳县| 泗洪县| 南部县| 临西县| 乌兰察布市| 庆元县| 榆林市| 武山县| 阳朔县| 闻喜县| 新龙县| 潜江市| 长沙县| 佛山市| 贵港市| 冕宁县| 长葛市| 水城县| 延长县| 九龙坡区| 安西县| 隆林| 兴仁县| 洪泽县| 长兴县| 黄大仙区| 文化| 津市市| 稷山县| 华阴市| 奉化市| 大方县| 奈曼旗| 安乡县| 浪卡子县|