欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++強(qiáng)制類型轉(zhuǎn)換詳細(xì)示例代碼

 更新時(shí)間:2025年09月09日 08:28:20   作者:EnigmaCoder  
在C++中,強(qiáng)制類型轉(zhuǎn)換(Type Casting)是將一種數(shù)據(jù)類型轉(zhuǎn)換為另一種數(shù)據(jù)類型的操作,這篇文章主要介紹了C++強(qiáng)制類型轉(zhuǎn)換的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

  • 在 C 語言中,我們習(xí)慣用 (type)expression 的“粗暴”方式做類型轉(zhuǎn)換,但這種方式安全性不足、意圖不明確。C++ 為了更安全、更清晰地控制類型轉(zhuǎn)換,提供了 四種專用的強(qiáng)制類型轉(zhuǎn)換運(yùn)算符static_cast、reinterpret_castconst_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)景

  1. 基本數(shù)據(jù)類型之間的轉(zhuǎn)換(如 intfloat 互轉(zhuǎn));
  2. 將任意類型轉(zhuǎn)換為 void 類型;
  3. 空指針(或 void*)與具體類型指針的轉(zhuǎn)換;
  4. 類繼承體系中 “向上轉(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 = &num;

    // 移除指針的 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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實(shí)現(xiàn)BMP圖像處理(直方圖均衡化)

    C語言實(shí)現(xiàn)BMP圖像處理(直方圖均衡化)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)BMP圖像直方圖均衡化處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 深入探討C++父類子類中虛函數(shù)的應(yīng)用

    深入探討C++父類子類中虛函數(shù)的應(yīng)用

    本篇文章是對(duì)C++父類子類中虛函數(shù)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Qt編寫提示進(jìn)度條的實(shí)現(xiàn)示例

    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)

    本文主要介紹了QT quick-Popup彈出窗口自定義的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • 你真的懂C++中的namespace用法

    你真的懂C++中的namespace用法

    命名空間(namespace)為防止名字沖突提供了更加可控的機(jī)制,命名空間分割了全局命名空間,其中每個(gè)命名空間是一個(gè)作用域,今天通過本文給大家分享C++中namespace用法,感興趣的朋友一起看看吧
    2021-06-06
  • C++?Boost?Xpressive示例分析使用

    C++?Boost?Xpressive示例分析使用

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個(gè)可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-11-11
  • c++內(nèi)聯(lián)函數(shù)(inline)使用詳解

    c++內(nèi)聯(lián)函數(shù)(inline)使用詳解

    這篇文章主要介紹了c++內(nèi)聯(lián)函數(shù)(inline)使用詳解,需要的朋友可以參考下
    2014-04-04
  • Visual Studio 2022 上使用ffmpeg的詳細(xì)步驟

    Visual Studio 2022 上使用ffmpeg的詳細(xì)步驟

    文章介紹了在開發(fā)項(xiàng)目中配置FFmpeg庫的步驟,添加包含目錄、庫目錄、依賴項(xiàng)及動(dòng)態(tài)庫路徑,確保編譯器和鏈接器正確識(shí)別FFmpeg資源,最后通過測(cè)試驗(yàn)證配置有效性,感興趣的朋友一起看看吧
    2025-07-07
  • C語言?指針數(shù)組進(jìn)階詳解

    C語言?指針數(shù)組進(jìn)階詳解

    在C語言和C++等語言中,數(shù)組元素全為指針變量的數(shù)組稱為指針數(shù)組,指針數(shù)組中的元素都必須具有相同的存儲(chǔ)類型、指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組比較適合用來指向若干個(gè)字符串,使字符串處理更加方便、靈活
    2022-02-02
  • C語言程序的編譯與預(yù)處理詳解

    C語言程序的編譯與預(yù)處理詳解

    這篇文章主要介紹了C語言程序的編譯與預(yù)處理,包括介紹了C和C++混合編程的情況,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-10-10

最新評(píng)論