您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“C++中常用的四種類型轉(zhuǎn)換方式是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
1.1靜態(tài)類型轉(zhuǎn)換主要用于兩種轉(zhuǎn)換環(huán)境
1.1.1 C++內(nèi)置類型的轉(zhuǎn)換:與C風(fēng)格強(qiáng)轉(zhuǎn)類似。
與c相同的地方:
#include <iostream> using namespace std; int main() { double a=3.14; cout << static_cast<int>(a) << endl; return 0; }
不同的地方就是使用static_cast不能強(qiáng)轉(zhuǎn)內(nèi)置類型指針的,這點(diǎn)可以避免C風(fēng)格中的越界問題。
如圖所示:
1.1.2當(dāng)有繼承關(guān)系存在時(shí)的強(qiáng)轉(zhuǎn):
如果使用static_cast 由子類向父類轉(zhuǎn)型,向上轉(zhuǎn)型,天然安全安全。(應(yīng)為子類的空間肯定比父類的空間大,子類是在繼承父類的空間上面開辟),代碼如下:
#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; }
結(jié)果圖:
我們可以通過子類安全的訪問到父類中的a值。
如果使用static_cast 由父類向子類轉(zhuǎn)型,向下轉(zhuǎn)型,是不安全。
那么何時(shí)不安全?何時(shí)安全?
不安全的情況介紹:
#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; }
結(jié)果圖:
如圖所示結(jié)果中并沒有出現(xiàn)本應(yīng)該打出的200,300,400,這就是不知道子類空間是否被開辟而向下訪問造成的結(jié)果。
安全的情況:
#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; }
結(jié)果圖:
如圖所示,此時(shí)我們可以打出200,300,400,等數(shù)值,說明當(dāng)我們知道子類空間被開辟時(shí)候,就可以安全的向下訪問。
2.1概念
動(dòng)態(tài)類型轉(zhuǎn)換是依賴于虛函數(shù)的與繼承關(guān)系,沒有虛函數(shù),就無法使用動(dòng)態(tài)類型轉(zhuǎn)換。dynamic_cast是一個(gè)安全類型轉(zhuǎn)換,因?yàn)樗且蕾囉诤瘮?shù)實(shí)現(xiàn)動(dòng)態(tài)轉(zhuǎn)型。因?yàn)樘摫碇械牡谝粋€(gè)Slot位置保存了類型運(yùn)行識(shí)別信息。
注意使用的條件為:1)要有繼承關(guān)系 2)要有虛函數(shù)。
這個(gè)虛表的結(jié)構(gòu):
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; }
結(jié)果圖:
就是用來修改const修飾的常引用和常指針的轉(zhuǎn)換方式
3.1代碼說明
#include <iostream> using namespace std; int main() { const int& a=100; const_cast<int&>(a)=200; cout<<a<<endl; return 0; }
結(jié)果圖:
由圖可知我們修改了常引用的數(shù)值。
4.1概念
這要類型轉(zhuǎn)換方式,是可以慶用于任何類型,他的底層的實(shí)現(xiàn)就是對(duì)底層二進(jìn)制數(shù)據(jù)的一個(gè)拷貝。所以也是一個(gè)不安全的強(qiáng)轉(zhuǎn)。
4.2由于這個(gè)一般都不用,從我們最有可能的會(huì)用到的情況下抽出來一種,代碼如下:
當(dāng)我們想把一個(gè)數(shù)的地址,用10進(jìn)制的表達(dá)出來的時(shí)候,如下,光一個(gè)int 是裝不下地址的十進(jìn)制,所以系統(tǒng)就會(huì)給我們報(bào)錯(cuò)。
這個(gè)時(shí)候reinterpert_cast就起到了作用,我們可以把他轉(zhuǎn)為long long類型,如下:
#include <iostream> using namespace std; int main() { int a=10; int *p=&a; cout<<reinterpret_cast<long long>(p)<<endl; return 0; }
結(jié)果圖:
“C++中常用的四種類型轉(zhuǎn)換方式是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。