C++ xxx_cast實(shí)現(xiàn)轉(zhuǎn)換代碼實(shí)例解析
1.1 static_cast
static_cast可以在一個(gè)方向上實(shí)現(xiàn)隱式轉(zhuǎn)換,在另一個(gè)方向上實(shí)現(xiàn)靜態(tài)轉(zhuǎn)換。其適用于單隱和雙隱兩種情況。
雙隱
雙隱即兩邊都可以直接進(jìn)行隱式轉(zhuǎn)換,適用于一般類型的數(shù)據(jù)轉(zhuǎn)換(如int, float, double, long等數(shù)據(jù)類型之間的轉(zhuǎn)換)
單隱
單隱即只能在一個(gè)方向上進(jìn)行隱式轉(zhuǎn)換,在另一個(gè)方向上只能實(shí)現(xiàn)靜態(tài)轉(zhuǎn)換。(如void* 和指針之間的轉(zhuǎn)換,任意類型的指針可以轉(zhuǎn)換為void*,但是void*不能轉(zhuǎn)換為任意類型的指針,因此將void*轉(zhuǎn)換為任意類型的指針時(shí)就需要調(diào)用靜態(tài)轉(zhuǎn)換)
//首先要驗(yàn)證的是static_cast,其可以實(shí)現(xiàn)在一個(gè)方向上做隱式轉(zhuǎn)換,另一個(gè)方向上做靜態(tài)轉(zhuǎn)換,可以適用于單隱和雙隱兩種情況 //首先是雙隱,也就是兩邊都能直接進(jìn)行隱式轉(zhuǎn)換,一般適用于基本數(shù)據(jù)類型,如 int a = 4; double b = 3.2; a = b; b = a; cout << a << endl; cout << b << endl; a = static_cast<int> (b); b = static_cast<double> (a); //然后是單隱,也就是說,只能從一遍到另一邊進(jìn)行隱式轉(zhuǎn)換 //任意類型的指針可以轉(zhuǎn)換為void*,但是void*不能轉(zhuǎn)換為任意類型的指針 void* p = &b; int* q = &a; p = q; q = static_cast<int*>(p);
1.2 reinterpret_cast
reinterpret_cast“通常為操作數(shù)的位模式提供較底層的重新解釋”-->也就是說將數(shù)據(jù)以二進(jìn)制的形式重新解釋,在雙方向上都不可以隱式類型轉(zhuǎn)換的,則需要重新類型轉(zhuǎn)換。可以實(shí)現(xiàn)雙不隱的情況,如int轉(zhuǎn)指針,指針轉(zhuǎn)int等。
//雙不隱 int *m=&a; int n=4; m = reinterpret_cast<int*>(n); n = reinterpret_cast<int>(m);
1.3 const_cast
Const_cast可用來移除非const對(duì)象的引用或指針的常量性。其可以將const變量轉(zhuǎn)換為非const變量。其可以用于去除指針和引用的const,const_cast是對(duì)const的語義補(bǔ)充。其目標(biāo)類型只能是引用或指針。
非const對(duì)象 --> const引用或指針 --> 脫const --> 修改非const對(duì)象
//const_cast-->用于去除非const對(duì)象的const,用于指針和引用 /************ 第一種情況,去引用的const化 ************/ int aa; const int& ra = aa; aa = 100; cout << aa << endl; cout << ra << endl; //ra = 200;//這樣是錯(cuò)誤的,因?yàn)閞a是const,要實(shí)現(xiàn)ra的修改,必須去const化 const_cast<int&> (ra) = 300; cout << aa << endl; cout << ra << endl; /************ 第二種情況,去指針的const化 ************/ const int* pp = &a; //*p = 200;//這樣是錯(cuò)誤的,因?yàn)橹羔榩是const類型,要實(shí)現(xiàn)p的修改,必須去const化 *const_cast<int*>(pp) = 500; cout << *pp << endl;
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 關(guān)于c++編譯protobuf時(shí)提示LNK2001 無法解析的外部符號(hào)的問題
- C++求最大公約數(shù)四種方法解析
- C++ opencv ffmpeg圖片序列化實(shí)現(xiàn)代碼解析
- Python調(diào)用C/C++的方法解析
- C++實(shí)現(xiàn)學(xué)生管理系統(tǒng)示例解析
- C++寫時(shí)拷貝實(shí)現(xiàn)原理及實(shí)例解析
- c++中用TINYXML解析XML文件
- C++使用jsoncpp解析json的方法示例
- C++構(gòu)造和解析Json的使用示例
- C++生成和解析XML文件的講解
- c++ 解析yaml文件的步驟
相關(guān)文章
對(duì)C語言編程標(biāo)準(zhǔn)以及聲明的基本理解
這篇文章主要介紹了對(duì)C語言編程標(biāo)準(zhǔn)以及聲明的基本理解,有助于對(duì)C語言編寫時(shí)的結(jié)構(gòu)有更加清晰的認(rèn)識(shí),需要的朋友可以參考下2015-11-11C語言實(shí)現(xiàn)日期和時(shí)間處理的常用函數(shù)總結(jié)
在C語言中,時(shí)間和日期處理是一項(xiàng)非常基礎(chǔ)的技能,也是開發(fā)實(shí)際應(yīng)用程序時(shí)經(jīng)常會(huì)用到的功能,本文為大家總結(jié)了C語言中一些常用的時(shí)間庫(kù)函數(shù),希望對(duì)大家有所幫助2023-06-06c語言獲取當(dāng)前工作路徑的實(shí)現(xiàn)代碼(windows/linux)
這篇文章主要介紹了c語言獲取當(dāng)前工作路徑的實(shí)現(xiàn)代碼(windows/linux),需要的朋友可以參考下2017-09-09C++中靜態(tài)初始化數(shù)組與動(dòng)態(tài)初始化數(shù)組詳解
今天小編就為大家分享一篇C++中靜態(tài)初始化數(shù)組與動(dòng)態(tài)初始化數(shù)組詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07如何在程序中判斷VS的版本(實(shí)現(xiàn)方法詳解)
下面小編就為大家?guī)硪黄绾卧诔绦蛑信袛郪S的版本(實(shí)現(xiàn)方法詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05C++的get()函數(shù)與getline()函數(shù)使用詳解
這篇文章主要介紹了C++的get()函數(shù)與getline()函數(shù)使用詳解,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09