C++超詳細(xì)講解強(qiáng)制類(lèi)型轉(zhuǎn)換
1 C 強(qiáng)制類(lèi)型轉(zhuǎn)換
C 方式的強(qiáng)制類(lèi)型轉(zhuǎn)換的用法如下代碼所示:
(Type)(Expression)
- Type:需要轉(zhuǎn)換成的類(lèi)型
- Expression:對(duì)其進(jìn)行轉(zhuǎn)換
e.g.
int v = 0x12345; // 將 int 類(lèi)型的變量轉(zhuǎn)換成 char 類(lèi)型 char c = char(v);
C 方式的強(qiáng)制類(lèi)型轉(zhuǎn)換存在如下問(wèn)題:
過(guò)于粗暴:任意類(lèi)型之間都可以進(jìn)行轉(zhuǎn)換,編譯器很難判斷其正確性
typedef void(PF)(int); int v = 0x12345; // 將 0x12345 轉(zhuǎn)換成一個(gè)函數(shù)指針的入口地址 PF* pf = (PF*)v;
上述代碼編譯器是可以編譯通過(guò)的,但實(shí)際上是不可行的,因此編譯器無(wú)法判斷其正確性
- 潛在的問(wèn)題不易被發(fā)現(xiàn)
- 難于定位:無(wú)法快速定位出現(xiàn)錯(cuò)誤的強(qiáng)制類(lèi)型轉(zhuǎn)換語(yǔ)句
2 C++ 強(qiáng)制類(lèi)型轉(zhuǎn)轉(zhuǎn)
C++ 方式的強(qiáng)制類(lèi)型轉(zhuǎn)換以 C++ 關(guān)鍵字的方式進(jìn)行轉(zhuǎn)換,同時(shí)將所有轉(zhuǎn)換類(lèi)型分為4中類(lèi)型,如下表所示:
類(lèi)型 | 特點(diǎn) |
---|---|
static_cast | 用于基本類(lèi)型之間的轉(zhuǎn)換 不能同于基本類(lèi)型指針間的轉(zhuǎn)換 可以用于有繼承關(guān)系的類(lèi)對(duì)象之間的轉(zhuǎn)換和類(lèi)指針之間的轉(zhuǎn)換 |
const_cast | 用于去除變量的只讀屬性 強(qiáng)制類(lèi)型轉(zhuǎn)換的目標(biāo)類(lèi)型必須是指針或引用 |
dynamic_cast | 用于有繼承關(guān)系的類(lèi)指針間的轉(zhuǎn)換 用于有交叉關(guān)系的類(lèi)指針間的轉(zhuǎn)換 具有類(lèi)型檢查的功能 需要有虛函數(shù)的支持 |
reinterpret_cast | 用于指針類(lèi)型之間的轉(zhuǎn)換 用于整數(shù)和指針類(lèi)型之間的轉(zhuǎn)換 |
C++ 方式的強(qiáng)制類(lèi)型轉(zhuǎn)換具有如下特點(diǎn):
- 編譯器能夠幫助檢查潛在的問(wèn)題
- 可以快速的在代碼中進(jìn)行定位
- 支持動(dòng)態(tài)類(lèi)型識(shí)別
e.g. static_cast
void static_cast_Demo() { int i = 0x12345; char c = 'c'; int* pi = &i; char* pc = &c; c = static_cast<char>(i); // ok,可以用于基本類(lèi)型之間的轉(zhuǎn)換 pc = static_cast<char*>(pi); // error,不能同于基本類(lèi)型指針間的轉(zhuǎn)換 }
e.g. const_cast
void const_cast_Demo() { const int& i = 1; int& j = const_cast<int&>(i); // ok const int x = 2; int& y = const_cast<int&>(x); // ok int z = const_cast<int>(x); // error,強(qiáng)制類(lèi)型轉(zhuǎn)換的目標(biāo)類(lèi)型必須是指針或引用 j = 5; printf("j = %d\n", j); printf("i = %d\n", i); y = 8; printf("x = %d\n", x); printf("y = %d\n", y); }
到此這篇關(guān)于C++超詳細(xì)講解強(qiáng)制類(lèi)型轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)C++強(qiáng)制類(lèi)型轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++中四種強(qiáng)制轉(zhuǎn)換方式的區(qū)別
- C++強(qiáng)制類(lèi)型轉(zhuǎn)換的四種方式
- C++ 強(qiáng)制類(lèi)型轉(zhuǎn)換詳解
- C++強(qiáng)制類(lèi)型轉(zhuǎn)換(static_cast、dynamic_cast、const_cast、reinterpret_cast)
- C++中4種強(qiáng)制類(lèi)型轉(zhuǎn)換的區(qū)別詳析
- 關(guān)于C++的強(qiáng)制類(lèi)型轉(zhuǎn)換淺析
- C++中4種強(qiáng)制類(lèi)型轉(zhuǎn)換的區(qū)別總結(jié)
- C++中四種強(qiáng)制轉(zhuǎn)換的實(shí)現(xiàn)方法與區(qū)別
相關(guān)文章
基于c中使用ftruncate()前需要fflush(),使用后需要rewind()的深入探討
本篇文章是對(duì)在c中使用ftruncate()前需要fflush(),使用后需要rewind()進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05深入探討linux下進(jìn)程的最大線程數(shù)、進(jìn)程最大數(shù)、進(jìn)程打開(kāi)的文件數(shù)
本篇文章是對(duì)linux下進(jìn)程的最大線程數(shù)、進(jìn)程最大數(shù)、進(jìn)程打開(kāi)的文件數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C語(yǔ)言 strftime 格式化顯示日期時(shí)間的實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇C語(yǔ)言 strftime 格式化顯示日期時(shí)間的實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12C字符串操作函數(shù)的實(shí)現(xiàn)詳細(xì)解析
以下是對(duì)C語(yǔ)言中字符串操作函數(shù)的實(shí)現(xiàn)進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-08-08C語(yǔ)言 深入探究動(dòng)態(tài)規(guī)劃之區(qū)間DP
這幾天在做有關(guān)dp的題,看到一個(gè)石子合并的問(wèn)題,本來(lái)以為是個(gè)貪心,后來(lái)仔細(xì)一想壓根不是貪心。貪心算法的思路是每次都取最大的,然而石子合并問(wèn)題有個(gè)限制條件就是每次只能取相鄰的,這就決定了它不是個(gè)貪心2022-04-04圖解C++的STL之stack和queue,輕松理解數(shù)據(jù)結(jié)構(gòu)
聚焦?C++?的?STL?中的?stack?和?queue,讓數(shù)據(jù)結(jié)構(gòu)變得簡(jiǎn)單有趣!?通過(guò)圖解的方式,我們將輕松理解這兩個(gè)重要的數(shù)據(jù)結(jié)構(gòu),準(zhǔn)備好開(kāi)啟?STL?學(xué)習(xí)之旅了嗎?讓我們一起探索?stack?和?queue?的奧秘吧!2024-03-03C++中類(lèi)的成員函數(shù)及內(nèi)聯(lián)函數(shù)使用及說(shuō)明
這篇文章主要介紹了C++中類(lèi)的成員函數(shù)及內(nèi)聯(lián)函數(shù)使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11