C++強(qiáng)制類型轉(zhuǎn)換詳細(xì)示例代碼
前言
- 在 C 語言中,我們習(xí)慣用
(type)expression的“粗暴”方式做類型轉(zhuǎn)換,但這種方式安全性不足、意圖不明確。C++ 為了更安全、更清晰地控制類型轉(zhuǎn)換,提供了 四種專用的強(qiáng)制類型轉(zhuǎn)換運(yùn)算符:static_cast、reinterpret_cast、const_cast、dynamic_cast。
static_cast:最常用的“非多態(tài)”轉(zhuǎn)換
static_cast 是 最常用 的類型轉(zhuǎn)換運(yùn)算符,主打 “非多態(tài)場(chǎng)景” 的類型轉(zhuǎn)換,編譯期間就會(huì)做合法性檢查,能替代 C 語言中普通的類型轉(zhuǎn)換。
適用場(chǎng)景
- 基本數(shù)據(jù)類型之間的轉(zhuǎn)換(如
int和float互轉(zhuǎn)); - 將任意類型轉(zhuǎn)換為
void類型; - 空指針(或
void*)與具體類型指針的轉(zhuǎn)換; - 類繼承體系中 “向上轉(zhuǎn)換”(派生類 → 基類,天然安全)。
代碼示例
#include <iostream>
using namespace std;
int main() {
// 1. 基本數(shù)據(jù)類型轉(zhuǎn)換
float floatNum = 3.14f;
int intNum = static_cast<int>(floatNum);
cout << "float → int: " << intNum << endl; // 輸出:3(小數(shù)被截?cái)啵?
intNum = 5;
floatNum = static_cast<float>(intNum);
cout << "int → float: " << floatNum << endl; // 輸出:5.0
// 2. 空指針與具體指針轉(zhuǎn)換
void* voidPtr = nullptr;
int* intPtr = static_cast<int*>(voidPtr);
cout << "void* → int*: " << intPtr << endl; // 輸出:0(nullptr)
return 0;
}
注意點(diǎn)
- 類繼承中 “向下轉(zhuǎn)換”(基類 → 派生類)時(shí),
static_cast不做運(yùn)行時(shí)檢查。如果轉(zhuǎn)換邏輯錯(cuò)誤,會(huì)導(dǎo)致“未定義行為”(此時(shí)應(yīng)該用dynamic_cast)。
reinterpret_case:底層“位模式”的重新解釋
reinterpret_cast 主打 “底層位模式的重新解釋”,它不做數(shù)據(jù)轉(zhuǎn)換或類型檢查,完全是“按位硬轉(zhuǎn)”,因此風(fēng)險(xiǎn)很高,僅用于特殊底層場(chǎng)景。
適用場(chǎng)景
- 不同類型指針/引用之間的“位模式”直接轉(zhuǎn)換;
- 整數(shù)與指針之間的底層轉(zhuǎn)換(依賴平臺(tái)實(shí)現(xiàn),少用)。
代碼示例
#include <iostream>
using namespace std;
int main() {
// 1. 字符 → 整數(shù)(直接解釋 ASCII 位模式)
char ch = 'A'; // 'A' 的 ASCII 碼是 65
int ascii = reinterpret_cast<int&>(ch);
cout << "char → int(ASCII 值): " << ascii << endl; // 輸出:65
// 2. 指針類型的底層轉(zhuǎn)換(int* → float*)
int* intPtr = nullptr;
float* floatPtr = reinterpret_cast<float*>(intPtr);
cout << "int* → float*: " << floatPtr << endl; // 輸出:0(與 intPtr 地址一致)
return 0;
}
注意點(diǎn)
reinterpret_cast完全跳過 C++ 類型系統(tǒng),極易引發(fā)“未定義行為”,僅在硬件操作、二進(jìn)制協(xié)議解析等底層場(chǎng)景使用。
const_cast:專門“移除 const 限定”
const_cast 是“專項(xiàng)工具”——專門用于移除指針或引用的 const(或 volatile)屬性,讓原本被 const 限制的指針/引用能修改指向的內(nèi)容。
適用場(chǎng)景
- 移除指針的
const屬性; - 移除引用的
const屬性。
代碼示例
#include <iostream>
using namespace std;
int main() {
int num = 100; // 注意:若原對(duì)象本身是 const,修改會(huì)出問題,這里用非 const 變量演示
const int* constPtr = #
// 移除指針的 const 屬性
int* normalPtr = const_cast<int*>(constPtr);
*normalPtr = 200;
cout << "修改后 num: " << num << endl; // 輸出:200
// 移除引用的 const 屬性
const int& constRef = num;
int& normalRef = const_cast<int&>(constRef);
normalRef = 300;
cout << "再次修改后 num: " << num << endl; // 輸出:300
return 0;
}
注意點(diǎn)
- 如果原始對(duì)象本身聲明為
const(如const int num = 100;),用const_cast移除const后再修改它,會(huì)導(dǎo)致“未定義行為”(程序可能崩潰或結(jié)果異常)。
dynamic_cast:運(yùn)行時(shí)的“多態(tài)安全轉(zhuǎn)換”
dynamic_cast 主打 “多態(tài)類(含虛函數(shù))的運(yùn)行時(shí)類型檢查”,主要用于類繼承體系中“向上轉(zhuǎn)換”(派生 → 基類)或“向下轉(zhuǎn)換”(基類 → 派生),保證轉(zhuǎn)換的安全性。
適用場(chǎng)景
- 類繼承中 “向下轉(zhuǎn)換”(基類 → 派生類),運(yùn)行時(shí)檢查是否合法;
- 類繼承中 “向上轉(zhuǎn)換”(派生 → 基類),效果和
static_cast一致; - 多繼承場(chǎng)景下的“交叉轉(zhuǎn)換”。
代碼示例
#include <iostream>
using namespace std;
// 基類:必須包含虛函數(shù),才能啟用“運(yùn)行時(shí)類型識(shí)別(RTTI)”
class Base {
public:
virtual void show() { cout << "Base class" << endl; }
};
class Derived : public Base {
public:
void show() override { cout << "Derived class" << endl; }
};
int main() {
// 場(chǎng)景1:基類指針指向派生類對(duì)象(向下轉(zhuǎn)換合法)
Base* basePtr1 = new Derived();
Derived* derivedPtr1 = dynamic_cast<Derived*>(basePtr1);
if (derivedPtr1 != nullptr) {
cout << "dynamic_cast(Base*→Derived*)成功: ";
derivedPtr1->show(); // 調(diào)用 Derived 的 show()
}
// 場(chǎng)景2:基類指針指向基類對(duì)象(向下轉(zhuǎn)換非法,返回 nullptr)
Base* basePtr2 = new Base();
Derived* derivedPtr2 = dynamic_cast<Derived*>(basePtr2);
if (derivedPtr2 == nullptr) {
cout << "dynamic_cast(Base*→Derived*)失?。ǚ项A(yù)期)" << endl;
}
// 釋放動(dòng)態(tài)內(nèi)存
delete basePtr1;
delete basePtr2;
return 0;
}
注意點(diǎn)
dynamic_cast依賴 “運(yùn)行時(shí)類型信息(RTTI)”,因此基類必須包含虛函數(shù)(否則編譯報(bào)錯(cuò));- 向下轉(zhuǎn)換時(shí),若基類指針實(shí)際指向派生類對(duì)象,轉(zhuǎn)換成功;否則返回
nullptr(指針場(chǎng)景)或拋出異常(引用場(chǎng)景)。
總結(jié):四種轉(zhuǎn)換的分工
| 轉(zhuǎn)換運(yùn)算符 | 核心作用 | 場(chǎng)景特點(diǎn) |
|---|---|---|
static_cast | 日常非多態(tài)轉(zhuǎn)換,編譯期檢查 | 最常用、安全(非向下轉(zhuǎn)) |
reinterpret_cast | 底層位模式重新解釋 | 風(fēng)險(xiǎn)高,僅底層場(chǎng)景用 |
const_cast | 專門移除 const 限定 | 專項(xiàng)工具,需謹(jǐn)慎修改 |
dynamic_cast | 多態(tài)類的運(yùn)行時(shí)安全轉(zhuǎn)換 | 依賴虛函數(shù),運(yùn)行時(shí)檢查 |
1 使用dynamic_cast<>的情況
類層次結(jié)構(gòu)中父類和子類之間指針和引用的轉(zhuǎn)換(運(yùn)行時(shí),類型檢查,保證了程序的安全性)【可以用于基類指針指向派生類的指針】
其他情況使用static_cast<>。
2 使用static_cast<>的情況
- 基本數(shù)據(jù)類型間的類型轉(zhuǎn)換
- 把空指針轉(zhuǎn)換成目標(biāo)類型的空指針
- 把任何類型的表達(dá)式類型轉(zhuǎn)換成void類型
- 用于類層次結(jié)構(gòu)中父類和子類之間指針和引用的轉(zhuǎn)換。(僅用于指向派生類的指針,訪問指向父類的內(nèi)容)
到此這篇關(guān)于C++強(qiáng)制類型轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)C++強(qiáng)制類型轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++強(qiáng)制類型轉(zhuǎn)換的四種方式
- 解析C++中四種強(qiáng)制類型轉(zhuǎn)換的區(qū)別詳解
- 基于c++強(qiáng)制類型轉(zhuǎn)換的(總結(jié))詳解
- C++中4種強(qiáng)制類型轉(zhuǎn)換的區(qū)別總結(jié)
- C++超詳細(xì)講解強(qiáng)制類型轉(zhuǎn)換
- 深入C++四種強(qiáng)制類型轉(zhuǎn)換的總結(jié)
- C++ 強(qiáng)制類型轉(zhuǎn)換詳解
- 淺談C++的語句語法與強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換
- 關(guān)于C++的強(qiáng)制類型轉(zhuǎn)換淺析
相關(guān)文章
C語言實(shí)現(xiàn)BMP圖像處理(直方圖均衡化)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)BMP圖像直方圖均衡化處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
Qt編寫提示進(jìn)度條的實(shí)現(xiàn)示例
進(jìn)度條在很地方都可以使用到,Qt自帶的進(jìn)度條或者操作系統(tǒng)的進(jìn)度條樣式,不夠炫,本文就介紹一下Qt編寫自定義控件的提示進(jìn)度條的實(shí)現(xiàn)示例,感興趣的可以了解一下2021-12-12
QT quick-Popup彈出窗口自定義的實(shí)現(xiàn)
本文主要介紹了QT quick-Popup彈出窗口自定義的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07
c++內(nèi)聯(lián)函數(shù)(inline)使用詳解
這篇文章主要介紹了c++內(nèi)聯(lián)函數(shù)(inline)使用詳解,需要的朋友可以參考下2014-04-04
Visual Studio 2022 上使用ffmpeg的詳細(xì)步驟
文章介紹了在開發(fā)項(xiàng)目中配置FFmpeg庫的步驟,添加包含目錄、庫目錄、依賴項(xiàng)及動(dòng)態(tài)庫路徑,確保編譯器和鏈接器正確識(shí)別FFmpeg資源,最后通過測(cè)試驗(yàn)證配置有效性,感興趣的朋友一起看看吧2025-07-07

