您好,登錄后才能下訂單哦!
這篇文章主要介紹“C++中類型轉換的方法有哪些”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“C++中類型轉換的方法有哪些”文章能幫助大家解決問題。
在C語言中,如果賦值運算符左右兩側類型不同,或者形參與實參類型不匹配,或者返回值類型與接收返回值類型不一致時,就需要發生類型轉化,C語言中總共有兩種形式的類型轉換:隱式類型轉換和顯式類型轉換。
1. 隱式類型轉化:編譯器在編譯階段自動進行,能轉就轉,不能轉就編譯失敗
2. 顯式類型轉化:需要用戶自己處理
void Test() { int i = 1; // 隱式類型轉換 double d = i; printf("%d, %.2f\n", i, d); int* p = &i; // 顯示的強制類型轉換 int address = (int)p; printf("%x, %d\n", p, address); }
缺陷:
轉換的可視性比較差,所有的轉換形式都是以一種相同形式書寫,難以跟蹤錯誤的轉換
C風格的轉換格式很簡單,但是有不少缺點的:
1. 隱式類型轉化有些情況下可能會出問題:比如數據精度丟失
2. 顯式類型轉換將所有情況混合在一起,代碼不夠清晰
因此C++提出了自己的類型轉化風格,注意因為C++要兼容C語言,所以C++中還可以使用C語言的轉化風格。
標準C++為了加強類型轉換的可視性,引入了四種命名的強制類型轉換操作符:
static_cast、reinterpret_cast、const_cast、dynamic_cast
static_cast用于非多態類型的轉換(靜態轉換),編譯器隱式執行的任何類型轉換都可用static_cast,但它不能用于兩個不相關的類型進行轉換
int main() { double d = 12.34; int a = static_cast<int>(d); cout << a << endl; return 0; }
reinterpret_cast操作符通常為操作數的位模式提供較低層次的重新解釋,用于將一種類型轉換為另一種不同的類型
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; }
const_cast最常用的用途就是刪除變量的const屬性,方便賦值
void Test() { //volatile const int a = 2; //保持內存的可見性 const int a = 2; int* p = const_cast<int*>(&a); *p = 3; //因為a是const類型的變量,所以編譯器進行優化直接將a值的內容放到寄存器中 //用的時候不會從內存中取,所以a的值是2 //防止編譯的優化,可以使用volatile關鍵字,保持內存的可見性 cout << a << endl; cout << *p << endl; }
dynamic_cast用于將一個父類對象的指針/引用轉換為子類對象的指針或引用(動態轉換)
向上轉型:子類對象指針/引用->父類指針/引用(不需要轉換,賦值兼容規則)
向下轉型:父類對象指針/引用->子類指針/引用(用dynamic_cast轉型是安全的)
注意:
1. dynamic_cast只能用于父類含有虛函數的類
2. dynamic_cast會先檢查是否能轉換成功,能成功則轉換,不能則返回0
class A { public: virtual void f() {} int _a = 0; }; class B : public A { public: int _b = 0; }; void fun(A* pa) { //直接轉換是不安全的可能會存在越界訪問的情況: //父類對象的指針或引用會給給子類的指針或引用訪問子類的屬性就會存在越界訪問 B* bptr = (B*)pa; bptr->_a++; bptr->_b++; cout << bptr->_a << endl; cout << bptr->_b << endl; } int main() { A a; B b; fun(&a); fun(&b); return 0; }
運行截圖:
解決方案:在類型轉換的時候使用用dynamic_cast,如果是父類對象的指針或引用給給子類對象的指針或引用時則轉換不成功。
class A { public: virtual void f() {} int _a = 0; }; class B : public A { public: int _b = 0; }; void fun(A* pa) { //dynamic_cast轉換時,當父類對象的指針或引用給給子類的指針或引用是返回0 B* bptr = dynamic_cast<B*>(pa); if (bptr) { bptr->_a++; bptr->_b++; cout << bptr->_a << endl; cout << bptr->_b << endl; } } int main() { A a; B b; fun(&a); fun(&b); return 0; }
運行截圖:
注意
強制類型轉換關閉或掛起了正常的類型檢查,每次使用強制類型轉換前,程序員應該仔細考慮是否還有其他不同的方法達到同一目的,如果非強制類型轉換不可,則應限制強制轉換值的作用域,以減少發生錯誤的機會。強烈建議:避免使用強制類型轉換。
關于“C++中類型轉換的方法有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。