<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
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.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; }
結果圖:
就是用來修改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.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++類別型轉換內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45