網(wǎng)站首頁 編程語言 正文
1.靜態(tài)類型轉(zhuǎn)換:static_cast(exp)
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)系存在時的強(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)型,是不安全。
那么何時不安全?何時安全?
不安全的情況介紹:
#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é)果圖:
如圖所示,此時我們可以打出200,300,400,等數(shù)值,說明當(dāng)我們知道子類空間被開辟時候,就可以安全的向下訪問。
2.動態(tài)類型轉(zhuǎn)換:dynamic_cast(exp)
2.1概念
動態(tài)類型轉(zhuǎn)換是依賴于虛函數(shù)的與繼承關(guān)系,沒有虛函數(shù),就無法使用動態(tài)類型轉(zhuǎn)換。dynamic_cast是一個安全類型轉(zhuǎn)換,因?yàn)樗且蕾囉诤瘮?shù)實(shí)現(xiàn)動態(tài)轉(zhuǎn)型。因?yàn)樘摫碇械牡谝粋€Slot位置保存了類型運(yùn)行識別信息。
注意使用的條件為:1)要有繼承關(guān)系 2)要有虛函數(shù)。
這個虛表的結(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é)果圖:
3.常類型轉(zhuǎn)換:const_case(exp)
就是用來修改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. 解釋類型轉(zhuǎn)換: reinterpret_cast(exp)
4.1概念
這要類型轉(zhuǎn)換方式,是可以慶用于任何類型,他的底層的實(shí)現(xiàn)就是對底層二進(jìn)制數(shù)據(jù)的一個拷貝。所以也是一個不安全的強(qiáng)轉(zhuǎn)。
4.2由于這個一般都不用,從我們最有可能的會用到的情況下抽出來一種,代碼如下:
當(dāng)我們想把一個數(shù)的地址,用10進(jìn)制的表達(dá)出來的時候,如下,光一個int 是裝不下地址的十進(jìn)制,所以系統(tǒng)就會給我們報錯。
?這個時候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é)果圖:
原文鏈接:https://blog.csdn.net/a2998658795/article/details/126041434
相關(guān)推薦
- 2023-03-23 python中decimal模塊的具體使用_python
- 2022-07-12 strcpy、strncpy與memcpy的區(qū)別你了解嗎?
- 2022-09-16 Pandas數(shù)值排序?sort_values()的使用_python
- 2023-07-27 react中使用echarts
- 2022-06-25 C#將DataGridView中的數(shù)據(jù)保存到CSV和Excel中_C#教程
- 2022-12-30 React錯誤邊界Error?Boundaries詳解_React
- 2022-08-10 C#對文件名智能排序的算法_C#教程
- 2022-08-03 Django框架中模型的用法_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支