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); //然后是單隱,也就是說(shuō),只能從一遍到另一邊進(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ù)的位模式提供較底層的重新解釋”-->也就是說(shuō)將數(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可用來(lái)移除非const對(duì)象的引用或指針的常量性。其可以將const變量轉(zhuǎn)換為非const變量。其可以用于去除指針和引用的const,const_cast是對(duì)const的語(yǔ)義補(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 無(wú)法解析的外部符號(hào)的問(wèn)題
- 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)文章
C++命名空間?缺省參數(shù)?const總結(jié)?引用總結(jié)?內(nèi)聯(lián)函數(shù)?auto關(guān)鍵字詳解
這篇文章主要介紹了C++命名空間?缺省參數(shù)?const總結(jié)?引用總結(jié)?內(nèi)聯(lián)函數(shù)?auto關(guān)鍵字詳解的相關(guān)資料,需要的朋友可以參考下2023-01-01
C語(yǔ)言詳細(xì)分析貪心策略中最小生成樹的Prime算法設(shè)計(jì)與實(shí)現(xiàn)
最小生成樹的問(wèn)題還是比較熱門的,最經(jīng)典的莫過(guò)于Prime算法和Kruskal算法了,這篇博文我會(huì)詳細(xì)講解Prime算法的設(shè)計(jì)思想與具體代碼的實(shí)現(xiàn),不要求數(shù)據(jù)結(jié)構(gòu)學(xué)的有多好,只要跟著我的思路來(lái),一步一步的分析,調(diào)試,終能成就自己,那就讓我們開(kāi)始吧2022-05-05
C語(yǔ)言的isatty函數(shù)和ttyname函數(shù)以及sendmsg函數(shù)用法
這篇文章主要介紹了C語(yǔ)言的isatty函數(shù)和ttyname函數(shù)以及sendmsg函數(shù)用法,是C語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09
C語(yǔ)言代碼實(shí)現(xiàn)猜數(shù)字游戲
大家好,本篇文章主要講的是C語(yǔ)言代碼實(shí)現(xiàn)猜數(shù)字游戲,感興趣的同學(xué)趕快來(lái)看一看了吧,對(duì)你有幫助的話記得收藏一下2022-01-01
C++?Socket實(shí)現(xiàn)TCP與UDP網(wǎng)絡(luò)編程
本文主要介紹了C++?Socket實(shí)現(xiàn)TCP與UDP網(wǎng)絡(luò)編程,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
C語(yǔ)言?使用qsort函數(shù)來(lái)進(jìn)行快速排序
排序方法有很多種:選擇排序,冒泡排序,歸并排序,快速排序等。?看名字都知道快速排序是目前公認(rèn)的一種比較好的排序算法。因?yàn)樗俣群芸?,所以系統(tǒng)也在庫(kù)里實(shí)現(xiàn)這個(gè)算法,便于我們的使用。?這就是qsort函數(shù)2022-02-02

