詳解C++中常用的四種類型轉換方式
1.靜態類型轉換:static_cast(exp)
1.1靜態類型轉換主要用於兩種轉換環境
1.1.1 C++內置類型的轉換:與C風格強轉類似。
與c相同的地方:
#include <iostream> using namespace std; int main() { double a=3.14; cout << static_cast<int>(a) << endl; return 0; }
不同的地方就是使用static_cast不能強轉內置類型指針的,這點可以避免C風格中的越界問題。
如圖所示:
1.1.2當有繼承關系存在時的強轉:
如果使用static_cast 由子類向父類轉型,向上轉型,天然安全安全。(應為子類的空間肯定比父類的空間大,子類是在繼承父類的空間上面開辟),代碼如下:
#include <iostream> using namespace std; class A { public: int a=100; void Ashow_info() { cout<<this->a<<endl; } }; class B:public A { public: int a=200; int b=300; int c=400; void Bshow_info() { cout<<this->a<<this->b<<this->c<<endl; } }; int main() { B* a=new B; static_cast<A*>(a)->Ashow_info(); return 0; }
結果圖:
我們可以通過子類安全的訪問到父類中的a值。
如果使用static_cast 由父類向子類轉型,向下轉型,是不安全。
那麼何時不安全?何時安全?
不安全的情況介紹:
#include <iostream> using namespace std; class A { public: int a=100; void Ashow_info() { cout<<this->a<<endl; } }; class B:public A { public: int a=200; int b=300; int c=400; void Bshow_info() { cout<<this->a<<this->b<<this->c<<endl; } }; int main() { A* a=new A; static_cast<B*>(a)->Bshow_info(); return 0; }
結果圖:
如圖所示結果中並沒有出現本應該打出的200,300,400,這就是不知道子類空間是否被開辟而向下訪問造成的結果。
安全的情況:
#include <iostream> using namespace std; class A { public: int a=100; void Ashow_info() { cout<<this->a<<endl; } }; class B:public A { public: int a=200; int b=300; int c=400; void Bshow_info() { cout<<this->a<<this->b<<this->c<<endl; } }; int main() { A* a=new B; static_cast<B*>(a)->Bshow_info(); return 0; }
結果圖:
如圖所示,此時我們可以打出200,300,400,等數值,說明當我們知道子類空間被開辟時候,就可以安全的向下訪問。
2.動態類型轉換:dynamic_cast(exp)
2.1概念
動態類型轉換是依賴於虛函數的與繼承關系,沒有虛函數,就無法使用動態類型轉換。dynamic_cast是一個安全類型轉換,因為他是依賴於函數實現動態轉型。因為虛表中的第一個Slot位置保存瞭類型運行識別信息。
註意使用的條件為:1)要有繼承關系 2)要有虛函數。
這個虛表的結構:
2.2代碼舉例說明
#include <iostream> using namespace std; class A { public: virtual void show_info() { cout<<"我是父親"<<endl; } }; class B:public A { public: void show_info() { cout<<"我是兒子"<<endl; } }; int main() { A* a=new B; dynamic_cast<B*>(a)->show_info(); return 0; }
結果圖:
3.常類型轉換:const_case(exp)
就是用來修改const修飾的常引用和常指針的轉換方式
3.1代碼說明
#include <iostream> using namespace std; int main() { const int& a=100; const_cast<int&>(a)=200; cout<<a<<endl; return 0; }
結果圖:
由圖可知我們修改瞭常引用的數值。
4. 解釋類型轉換: reinterpret_cast(exp)
4.1概念
這要類型轉換方式,是可以慶用於任何類型,他的底層的實現就是對底層二進制數據的一個拷貝。所以也是一個不安全的強轉。
4.2由於這個一般都不用,從我們最有可能的會用到的情況下抽出來一種,代碼如下:
當我們想把一個數的地址,用10進制的表達出來的時候,如下,光一個int 是裝不下地址的十進制,所以系統就會給我們報錯。
這個時候reinterpert_cast就起到瞭作用,我們可以把他轉為long long類型,如下:
#include <iostream> using namespace std; int main() { int a=10; int *p=&a; cout<<reinterpret_cast<long long>(p)<<endl; return 0; }
結果圖:
到此這篇關於詳解C++中常用的四種類型轉換方式的文章就介紹到這瞭,更多相關C++類型轉換內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- C++ 數據類型強制轉化的實現
- 淺析C++中dynamic_cast和static_cast實例語法詳解
- C++ 強制類型轉換詳解
- C++超詳細講解RTTI和cast運算符的使用
- C++實例分析講解臨時對象與右值引用的用法