C++中四種強(qiáng)制轉(zhuǎn)換的實(shí)現(xiàn)方法與區(qū)別
static_cast
原型:static_cast<type-id>(expression) type-id表示目標(biāo)類型,expression表示要轉(zhuǎn)換的表達(dá)式
static_cast用于非多態(tài)類型的轉(zhuǎn)換(靜態(tài)轉(zhuǎn)換),編譯器隱式執(zhí)行的任何類型轉(zhuǎn)換都可用static_cast,但它不能用于兩個(gè)不相關(guān)的類型進(jìn)行轉(zhuǎn)換。
int main() { double d = 12.34; int a = static_cast<int>(d); cout<<a<<endl; return 0; }
static_cast的相關(guān)類型通常包括以下幾種情況:
1、隱式類型允許的數(shù)值類型轉(zhuǎn)換
基礎(chǔ)數(shù)據(jù)類型之間的轉(zhuǎn)換,比如int→float,double→int等,只要不丟失精度或存在明確的數(shù)值轉(zhuǎn)換規(guī)則。
枚舉類型與整數(shù)之間的轉(zhuǎn)換:將枚舉值(enum)轉(zhuǎn)換為其底層整數(shù)類型(如int)。
空指針(nullptr)到其他指針類型的轉(zhuǎn)換,例如nullptr→int*
int a = 10; float b = static_cast<float>(a); // int → float enum Color { Red, Green }; int c = static_cast<int>(Color::Red); // 枚舉 → int
2、類層次中的上行或下行轉(zhuǎn)換
上行轉(zhuǎn)換:將派生類指針/引用轉(zhuǎn)換為基類指針/引用(安全且無需顯示檢查)
下行轉(zhuǎn)換:將基類指針/引用轉(zhuǎn)換為派生類指針/引用(需程序員寶成對(duì)象類型正確,否則不安全)
class Base {}; class Derived : public Base {}; Derived d; Base* b_ptr = static_cast<Base*>(&d); // 上行轉(zhuǎn)換(安全) Base* base = new Derived(); Derived* derived = static_cast<Derived*>(base); // 下行轉(zhuǎn)換(需確保 base 實(shí)際指向 Derived)
3、用戶定義的轉(zhuǎn)換操作符
如果類定義了自定義的類型轉(zhuǎn)換運(yùn)算符operator TargetType(),static_cast可以顯式調(diào)用這些轉(zhuǎn)換。
class MyInt { public: operator int() const { return value; } // 自定義轉(zhuǎn)換到 int int value = 42; }; MyInt mi; int x = static_cast<int>(mi); // 調(diào)用 MyInt::operator int()
4、void*與具體類型指針的轉(zhuǎn)換
將void*轉(zhuǎn)換為具體類型指針(需確保原始指針類型匹配)
將具體類型指針轉(zhuǎn)換為void*(通常隱式允許,但可用static_cast顯示表達(dá))
int* p = new int(42); void* vp = static_cast<void*>(p); // int* → void* int* p2 = static_cast<int*>(vp); // void* → int*(需確保 vp 原本是 int*)
reinterpret_cast
reinterpret_cast的原型為:reinterpret_cast<typeid> (expression).type_id必須是一個(gè)指針,引用,算術(shù)類型,函數(shù)指針,成員指針等。
reinterpret_cast操作符通常為操作數(shù)的位模式提供較低層次的重新解釋,用于將一種類型轉(zhuǎn)換為另一種不同的類型
int main() { double d = 12.34; int a = static_cast<int>(d); cout << a << endl; // 這里使用static_cast會(huì)報(bào)錯(cuò),應(yīng)該使用reinterpret_cast //int *p = static_cast<int*>(a); int *p = reinterpret_cast<int*>(a); return 0; }
reinterpret_cast可以把一個(gè)整型轉(zhuǎn)換為指針,也可以把一個(gè)指針轉(zhuǎn)換為整型??偨Y(jié)來說,reinterpret_cast可以允許任何指針類型(引用)之間的轉(zhuǎn)換,整型與指針類型間的轉(zhuǎn)換以及指針與足夠大的整型之間的轉(zhuǎn)換。
const_cast
原型const_cast<type-name>(expression) 其中,type-name表示要轉(zhuǎn)換成的類型,expression是要進(jìn)行轉(zhuǎn)換的表達(dá)式。
const_cast最常用的用途就是刪除變量的const屬性,方便賦值
void Test () { const int a = 2; int* p = const_cast< int*>(&a ); *p = 3; cout<<a <<endl; }
dynamic_cast
其中,T是目標(biāo)類型,expression是要轉(zhuǎn)換的表達(dá)式。
dynamic_cast用于將一個(gè)父類對(duì)象的指針/引用轉(zhuǎn)換為子類對(duì)象的指針或引用(動(dòng)態(tài)轉(zhuǎn)換)
向上轉(zhuǎn)換:子類對(duì)象指針/引用→父類指針/引用(不需要轉(zhuǎn)換,賦值兼容規(guī)則)
向下轉(zhuǎn)換:父類對(duì)象指針/引用→子類指針/引用(用dynamic_cast轉(zhuǎn)換是安全的)
注意:
1、dynamic_cast只能用于父類含有虛函數(shù)的類
2、dynamic_cast會(huì)先檢查是否能轉(zhuǎn)換成功,能成功則轉(zhuǎn)換,不能則返回nullptr
class A { public : virtual void f(){} }; class B : public A {}; void fun (A* pa) { // dynamic_cast會(huì)先檢查是否能轉(zhuǎn)換成功,能成功則轉(zhuǎn)換,不能則返回 B* pb1 = static_cast<B*>(pa); B* pb2 = dynamic_cast<B*>(pa); cout<<"pb1:" <<pb1<< endl; cout<<"pb2:" <<pb2<< endl; } int main () { A a; B b; fun(&a); fun(&b); return 0; }
注意
強(qiáng)制類型轉(zhuǎn)換關(guān)閉或掛起了正常的類型檢查,每次使用強(qiáng)制類型轉(zhuǎn)換前,程序員應(yīng)該仔細(xì)考慮的是否還有其他不同的方法達(dá)到同一目的,如果非強(qiáng)制類型轉(zhuǎn)換不可,則應(yīng)限制強(qiáng)制轉(zhuǎn)換值的作用域,以減少發(fā)生錯(cuò)誤的機(jī)會(huì)。
強(qiáng)烈建議:避免使用強(qiáng)制類型轉(zhuǎn)換
到此這篇關(guān)于C++中四種強(qiáng)制轉(zhuǎn)換的實(shí)現(xiàn)方法與區(qū)別的文章就介紹到這了,更多相關(guān)C++強(qiáng)制轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++中四種強(qiáng)制轉(zhuǎn)換方式的區(qū)別
- C++超詳細(xì)講解強(qiáng)制類型轉(zhuǎn)換
- C++強(qiáng)制類型轉(zhuǎn)換的四種方式
- C++ 強(qiáng)制類型轉(zhuǎn)換詳解
- C++強(qiáng)制類型轉(zhuǎn)換(static_cast、dynamic_cast、const_cast、reinterpret_cast)
- C++中4種強(qiáng)制類型轉(zhuǎn)換的區(qū)別詳析
- 關(guān)于C++的強(qiáng)制類型轉(zhuǎn)換淺析
- C++中4種強(qiáng)制類型轉(zhuǎn)換的區(qū)別總結(jié)
相關(guān)文章
淺談C語言函數(shù)調(diào)用參數(shù)壓棧的相關(guān)問題
下面小編就為大家?guī)硪黄獪\談C語言函數(shù)調(diào)用參數(shù)壓棧的相關(guān)問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09C++實(shí)現(xiàn)二叉樹的堂兄弟節(jié)點(diǎn)查詢
C++實(shí)現(xiàn)二叉樹的堂兄弟節(jié)點(diǎn)查詢,是指在二叉樹中,找到兩個(gè)節(jié)點(diǎn)深度相同但父節(jié)點(diǎn)不同的節(jié)點(diǎn),即為堂兄弟節(jié)點(diǎn)。實(shí)現(xiàn)這一功能可以通過遍歷二叉樹并記錄節(jié)點(diǎn)深度和父節(jié)點(diǎn)來實(shí)現(xiàn)2023-04-04c++ 入門——淺析構(gòu)造函數(shù)和析構(gòu)函數(shù)
這篇文章主要介紹了c++ 淺析構(gòu)造函數(shù)和析構(gòu)函數(shù)的相關(guān)資料,幫助大家入門c++ 編程,感興趣的朋友可以了解下2020-08-08C語言中的狀態(tài)機(jī)設(shè)計(jì)深入講解
這篇文章主要給大家介紹了關(guān)于C語言狀態(tài)機(jī)設(shè)計(jì)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11