91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

密山市| 南乐县| 卢湾区| 河源市| 屏东县| 青浦区| 隆化县| 麻阳| 宁武县| 美姑县| 崇明县| 汾西县| 深州市| 黎川县| 建水县| 聂拉木县| 绥化市| 武夷山市| 新泰市| 三江| 黎城县| 济源市| 荣成市| 阿坝县| 昭平县| 锡林浩特市| 石屏县| 措美县| 嘉兴市| 都江堰市| 福清市| 祁门县| 七台河市| 濮阳县| 古浪县| 浏阳市| 论坛| 宝鸡市| 周至县| 福鼎市| 三原县|