一篇文章帶你了解C++中的顯示轉(zhuǎn)換
命名的強(qiáng)制類型轉(zhuǎn)換:
形式:
cast-name<type>(expression);
type是強(qiáng)制轉(zhuǎn)換的類型,expression是強(qiáng)制轉(zhuǎn)換的值。如果type是引用類型,則結(jié)果是左值。case-name是C++四種轉(zhuǎn)換類型static_cast、dynamic_cast、const_cast和reinterpret_cast的一種。
static_cast
可以被用于強(qiáng)制隱形轉(zhuǎn)換(例如,non-const對象轉(zhuǎn)換為const對象,int轉(zhuǎn)型為double,等等)作用于對象,它還可以用于很多這樣的轉(zhuǎn)換的反向轉(zhuǎn)換 (例如,void*指針轉(zhuǎn)型為有類型指針,基類指針轉(zhuǎn)型為派生類指針),但是它不能將一個(gè)const對象轉(zhuǎn)型為non-const對象(只有 const_cast能做到),它最接近于C-style的轉(zhuǎn)換。應(yīng)用到類的指針上,意思是說它允許子類類型的指針轉(zhuǎn)換為父類類型的指針(這是一個(gè)有效的隱式轉(zhuǎn)換),同時(shí),也能夠執(zhí)行相反動作:轉(zhuǎn)換父類為它的子類。
int i; float j = 10.2; i = const_cast<int>(j); // 將j轉(zhuǎn)換int型賦值給i,損失了一定的精度
const_cast
一般用于強(qiáng)制消除對象的常量性。它是唯一能做到這一點(diǎn)的C++風(fēng)格的強(qiáng)制轉(zhuǎn)型。這個(gè)轉(zhuǎn)換能剝離一個(gè)對象的const屬性,也就是說允許你對常量進(jìn)行修改。不能使用const_cast改變表達(dá)式的類型, const_cast的類型只能是指針,引用或指向?qū)ο箢惓蓡T的指針
const int constant = 21; int* modifier = const_cast<int*>(&constant); // 舊版的寫法 int* modifier = (int*)(&constant) *modifier = 7; std::cout << modifier << std::endl; // 測試輸出的地址為0x61feec std::cout << &constant << std::endl; // 測試輸出的地址為0x61feec std::cout << *modifier << std::endl; // 輸出的值為 7 std::cout << constant << std::endl; // 輸出的值為 21 // 上面可以看出,兩個(gè)指針指向同一塊地址,但是解引用的結(jié)果確不相同。 // const的值,是不能真的被改變。但是可以對可以對modifier進(jìn)行重新賦值
const_cast常用的情況:
/* 我們可能調(diào)用了一個(gè)參數(shù)不是const的函數(shù),而我們要傳進(jìn)去的實(shí)際參數(shù)確實(shí)const的,但是我們知道這個(gè)函數(shù)是不會對參數(shù)做修改的。于是我們就需要使用const_cast去除const限定,以便函數(shù)能夠接受這個(gè)實(shí)際參數(shù) */ #include <iostream> using namespace std; void Printer (int* val,string seperator = "\n") { cout << val << seperator; } int main(void) { const int consatant = 20; //Printer(consatant); //Error: invalid conversion from 'int' to 'int*' Printer(const_cast<int *>(&consatant)); return 0; }
reinterpret_cast
**作用于底層二進(jìn)制。**是特意用于底層的強(qiáng)制轉(zhuǎn)型,導(dǎo)致實(shí)現(xiàn)依賴(就是說,不可移植)的結(jié)果,例如,將一個(gè)指針轉(zhuǎn)型為一個(gè)整數(shù)。這樣的強(qiáng)制類型在底層代碼以外應(yīng)該極為罕見。操作結(jié)果只是簡單的從一個(gè)指針到別的指針的值得二進(jìn)制拷貝。在類型之間指向的內(nèi)容不做任何類型的檢查和轉(zhuǎn)換。將一個(gè)指針轉(zhuǎn)換成其他類型的指針。reinterpret_cast被作為二進(jìn)制轉(zhuǎn)換重新解釋(沒有數(shù)位損失)。
int j; int *p = new(int); // j = p; // error: invalid conversion from 'int*' to 'int' [-fpermissive] j = reinterpret_cast<int>(p); //將指針類型,轉(zhuǎn)換成int型 std::cout << j << std::endl; // 輸出int型的結(jié)果
dynamic_cast
主要用于執(zhí)行“安全的向下轉(zhuǎn)型(safe downcasting)”,也就是說,要確定一個(gè)對象是否是一個(gè)繼承體系中的一個(gè)特定類型。支持父類指針到子類指針的轉(zhuǎn)換,這種轉(zhuǎn)換時(shí)最安全的轉(zhuǎn)換。它 是唯一不能用舊風(fēng)格語法執(zhí)行的強(qiáng)制類型轉(zhuǎn)換,也是唯一可能有重大運(yùn)行時(shí)代價(jià)的強(qiáng)制轉(zhuǎn)換。
【擴(kuò)展】 舊版的強(qiáng)制類型轉(zhuǎn)換
在早期的C++語言中,顯示地進(jìn)行強(qiáng)制類型轉(zhuǎn)換包含兩種形式:
type (expr); // 函數(shù)形式的強(qiáng)制類型轉(zhuǎn)換 (type) expr; // 變量類型的強(qiáng)制類型轉(zhuǎn)換
根據(jù)涉及的類型不同,舊式的強(qiáng)制類型轉(zhuǎn)換分別與static_cast、const_cast或reinterpret_cast有相似的行為。當(dāng)我們在某處執(zhí)行舊式的強(qiáng)制類型轉(zhuǎn)換時(shí),如果能換成static_cast、const_cast也合法,則其行為與對應(yīng)的命名轉(zhuǎn)換一致。如果替換不合法,則舊式指針強(qiáng)制轉(zhuǎn)換類型與reinterpret_cast類似的功能。
如:
char *pc = (char*)ip; // ip是指向整數(shù)的指針 char *pc = reinterpret_cast<char*>(ip) // 等價(jià)與上面的式子
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C語言實(shí)現(xiàn)一個(gè)多線程委托模型的示例詳解
這篇文章主要介紹了C語言實(shí)現(xiàn)一個(gè)多線程委托模型,這就是一個(gè)使用C語言實(shí)現(xiàn)多線程委托模型的例子,其中包含boss線程和worker線程,可以處理工作線程的異常情況,需要的朋友可以參考下2023-06-06C語言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)程序設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)程序設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07C語言實(shí)現(xiàn)宿舍管理系統(tǒng)設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)宿舍管理系統(tǒng)設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03使用C# 判斷給定大數(shù)是否為質(zhì)數(shù)的詳解
本篇文章是對使用C#判斷給定大數(shù)是否為質(zhì)數(shù)的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++?QT實(shí)現(xiàn)獲取本機(jī)網(wǎng)卡信息
這篇文章主要為大家詳細(xì)介紹了如何利用qt自帶的QNetworkInterface接口以及c++Iphlpapi庫,獲取當(dāng)前windows電腦下的網(wǎng)卡信息,需要的可以參考下2024-01-01C語言實(shí)現(xiàn)ATM系統(tǒng)程序的完整代碼
這篇文章主要介紹了C語言實(shí)現(xiàn)ATM系統(tǒng)程序的完整代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05C++實(shí)現(xiàn)惡搞電腦關(guān)機(jī)小程序的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)一個(gè)簡單的惡搞電腦關(guān)機(jī)小程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下2022-11-11