C++中四種強制轉換的實現(xiàn)方法與區(qū)別
static_cast
原型:static_cast<type-id>(expression) type-id表示目標類型,expression表示要轉換的表達式
static_cast用于非多態(tài)類型的轉換(靜態(tài)轉換),編譯器隱式執(zhí)行的任何類型轉換都可用static_cast,但它不能用于兩個不相關的類型進行轉換。
int main() { double d = 12.34; int a = static_cast<int>(d); cout<<a<<endl; return 0; }
static_cast的相關類型通常包括以下幾種情況:
1、隱式類型允許的數(shù)值類型轉換
基礎數(shù)據(jù)類型之間的轉換,比如int→float,double→int等,只要不丟失精度或存在明確的數(shù)值轉換規(guī)則。
枚舉類型與整數(shù)之間的轉換:將枚舉值(enum)轉換為其底層整數(shù)類型(如int)。
空指針(nullptr)到其他指針類型的轉換,例如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、類層次中的上行或下行轉換
上行轉換:將派生類指針/引用轉換為基類指針/引用(安全且無需顯示檢查)
下行轉換:將基類指針/引用轉換為派生類指針/引用(需程序員寶成對象類型正確,否則不安全)
class Base {}; class Derived : public Base {}; Derived d; Base* b_ptr = static_cast<Base*>(&d); // 上行轉換(安全) Base* base = new Derived(); Derived* derived = static_cast<Derived*>(base); // 下行轉換(需確保 base 實際指向 Derived)
3、用戶定義的轉換操作符
如果類定義了自定義的類型轉換運算符operator TargetType(),static_cast可以顯式調用這些轉換。
class MyInt { public: operator int() const { return value; } // 自定義轉換到 int int value = 42; }; MyInt mi; int x = static_cast<int>(mi); // 調用 MyInt::operator int()
4、void*與具體類型指針的轉換
將void*轉換為具體類型指針(需確保原始指針類型匹配)
將具體類型指針轉換為void*(通常隱式允許,但可用static_cast顯示表達)
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必須是一個指針,引用,算術類型,函數(shù)指針,成員指針等。
reinterpret_cast操作符通常為操作數(shù)的位模式提供較低層次的重新解釋,用于將一種類型轉換為另一種不同的類型
int main() { double d = 12.34; int a = static_cast<int>(d); cout << a << endl; // 這里使用static_cast會報錯,應該使用reinterpret_cast //int *p = static_cast<int*>(a); int *p = reinterpret_cast<int*>(a); return 0; }
reinterpret_cast可以把一個整型轉換為指針,也可以把一個指針轉換為整型??偨Y來說,reinterpret_cast可以允許任何指針類型(引用)之間的轉換,整型與指針類型間的轉換以及指針與足夠大的整型之間的轉換。
const_cast
原型const_cast<type-name>(expression) 其中,type-name表示要轉換成的類型,expression是要進行轉換的表達式。
const_cast最常用的用途就是刪除變量的const屬性,方便賦值
void Test () { const int a = 2; int* p = const_cast< int*>(&a ); *p = 3; cout<<a <<endl; }
dynamic_cast
其中,T是目標類型,expression是要轉換的表達式。
dynamic_cast用于將一個父類對象的指針/引用轉換為子類對象的指針或引用(動態(tài)轉換)
向上轉換:子類對象指針/引用→父類指針/引用(不需要轉換,賦值兼容規(guī)則)
向下轉換:父類對象指針/引用→子類指針/引用(用dynamic_cast轉換是安全的)
注意:
1、dynamic_cast只能用于父類含有虛函數(shù)的類
2、dynamic_cast會先檢查是否能轉換成功,能成功則轉換,不能則返回nullptr
class A { public : virtual void f(){} }; class B : public A {}; void fun (A* pa) { // dynamic_cast會先檢查是否能轉換成功,能成功則轉換,不能則返回 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; }
注意
強制類型轉換關閉或掛起了正常的類型檢查,每次使用強制類型轉換前,程序員應該仔細考慮的是否還有其他不同的方法達到同一目的,如果非強制類型轉換不可,則應限制強制轉換值的作用域,以減少發(fā)生錯誤的機會。
強烈建議:避免使用強制類型轉換
到此這篇關于C++中四種強制轉換的實現(xiàn)方法與區(qū)別的文章就介紹到這了,更多相關C++強制轉換內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!