C++学习——C++中的四种类型转换
生活随笔
收集整理的這篇文章主要介紹了
C++学习——C++中的四种类型转换
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1.dynamic_cast
- 2.const_cast
- 3.3 static_cast
- 3.4 reinterpret_cast
1.dynamic_cast
用于動態類型轉換。只能用于含有虛函數的類,用于類層次間的向上和向下轉化。只能轉指針或引用。向下轉化時,如果是非法的對于指針返回NULL,對于引用拋異常。要深入了解內部轉換的原理。
向上轉換:指的是子類向基類的轉換
向下轉換:指的是基類向子類的轉換
它通過判斷在執行到該語句的時候變量的運行時類型和要轉換的類型是否相同來判斷是否能夠進行向下轉換。
#include<iostream> #include<stack> #include<string> #include<vector> #include<set> using namespace std;class A { public:virtual void print() {cout << "A base" << endl;} }; class B :public A { public:virtual void print() {cout << "B derived" << endl;} }; int main() {/*1.dynamic_cast的向上轉換子類向父類指針的轉化,即ptr_b ——> ptr_a,這也是實現虛函數的基礎虛函數的子類父類之間的向上轉換總是安全的*/B* ptr_b1=new B;A* ptr_a1= dynamic_cast<A*>(ptr_b1);/*B* ptr_b=new B;A* ptr_a=ptr_b;*//*A* ptr_a=new B;*/ptr_a1->print();/*2.dynamic_cast的向下轉換父類指針向子類指針的轉換向下轉換可能不安全*/A* ptr_a2 = new A;B* ptr_b2 = dynamic_cast<B*>(ptr_a2);if (ptr_b2) {cout << "ptr_a2向ptr_b2轉換成功" << endl;ptr_b2->print();}else {cout << "ptr_b2為null,ptr_a2向ptr_b2轉換失敗" << endl;}A* ptr_a3 = new B;//這是向下轉換成功的關鍵B* ptr_b3 = dynamic_cast<B*>(ptr_a3);if (ptr_b3) {cout << "ptr_a3向ptr_b3轉換成功" << endl;ptr_b3->print();}else {cout << "ptr_b3為null,ptr_a3向ptr_b3轉換失敗" << endl;}return 0; } B derived ptr_b2為null,ptr_a2向ptr_b2轉換失敗 ptr_a3向ptr_b3轉換成功 B derived2.const_cast
用于將const變量轉為非const
但需要特別注意的是const_cast不是用于去除變量的常量性,而是去除指向常數對象的指針或引用的常量性,其去除常量性的對象必須為指針或引用。
3.3 static_cast
用于各種隱式轉換,比如非const轉const,void*轉指針等, static_cast能用于多態向上轉化,如果向下轉能成功但是不安全,結果未知;
3.4 reinterpret_cast
幾乎什么都可以轉,比如將int轉指針,可能會出問題,盡量少用;
為什么不使用C的強制轉換?
C的強制轉換表面上看起來功能強大什么都能轉,但是轉化不夠明確,不能進行錯誤檢查,容易出錯。
總結
以上是生活随笔為你收集整理的C++学习——C++中的四种类型转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试题——面经题目(1)
- 下一篇: 解决spring和struts配合问题