最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

  • 在 C 語言中,我們習(xí)慣用 (type)expression 的“粗暴”方式做類型轉(zhuǎn)換,但這種方式安全性不足、意圖不明確。C++ 為了更安全、更清晰地控制類型轉(zhuǎn)換,提供了 四種專用的強制類型轉(zhuǎn)換運算符static_castreinterpret_cast、const_castdynamic_cast。

static_cast:最常用的“非多態(tài)”轉(zhuǎn)換

static_cast最常用 的類型轉(zhuǎn)換運算符,主打 “非多態(tài)場景” 的類型轉(zhuǎn)換,編譯期間就會做合法性檢查,能替代 C 語言中普通的類型轉(zhuǎn)換。

適用場景

  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ù)被截斷)

    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;
}

注意點

  • 類繼承中 “向下轉(zhuǎn)換”(基類 → 派生類)時,static_cast 不做運行時檢查。如果轉(zhuǎn)換邏輯錯誤,會導(dǎo)致“未定義行為”(此時應(yīng)該用 dynamic_cast)。

reinterpret_case:底層“位模式”的重新解釋

reinterpret_cast 主打 “底層位模式的重新解釋”,它不做數(shù)據(jù)轉(zhuǎn)換或類型檢查,完全是“按位硬轉(zhuǎn)”,因此風(fēng)險很高,僅用于特殊底層場景。

適用場景

  • 不同類型指針/引用之間的“位模式”直接轉(zhuǎn)換;
  • 整數(shù)與指針之間的底層轉(zhuǎn)換(依賴平臺實現(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;
}

注意點

  • reinterpret_cast 完全跳過 C++ 類型系統(tǒng),極易引發(fā)“未定義行為”,僅在硬件操作、二進制協(xié)議解析等底層場景使用。

const_cast:專門“移除 const 限定”

const_cast 是“專項工具”——專門用于移除指針或引用的 const(或 volatile)屬性,讓原本被 const 限制的指針/引用能修改指向的內(nèi)容。

適用場景

  • 移除指針的 const 屬性;
  • 移除引用的 const 屬性。

代碼示例

#include <iostream>
using namespace std;

int main() {
    int num = 100; // 注意:若原對象本身是 const,修改會出問題,這里用非 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;
}

注意點

  • 如果原始對象本身聲明為 const(如 const int num = 100;),用 const_cast 移除 const 后再修改它,會導(dǎo)致“未定義行為”(程序可能崩潰或結(jié)果異常)。

dynamic_cast:運行時的“多態(tài)安全轉(zhuǎn)換”

dynamic_cast 主打 “多態(tài)類(含虛函數(shù))的運行時類型檢查”,主要用于類繼承體系中“向上轉(zhuǎn)換”(派生 → 基類)或“向下轉(zhuǎn)換”(基類 → 派生),保證轉(zhuǎn)換的安全性。

適用場景

  • 類繼承中 “向下轉(zhuǎn)換”(基類 → 派生類),運行時檢查是否合法;
  • 類繼承中 “向上轉(zhuǎn)換”(派生 → 基類),效果和 static_cast 一致;
  • 多繼承場景下的“交叉轉(zhuǎn)換”。

代碼示例

#include <iostream>
using namespace std;

// 基類:必須包含虛函數(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() {
    // 場景1:基類指針指向派生類對象(向下轉(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()
    }

    // 場景2:基類指針指向基類對象(向下轉(zhuǎn)換非法,返回 nullptr)
    Base* basePtr2 = new Base();
    Derived* derivedPtr2 = dynamic_cast<Derived*>(basePtr2);
    if (derivedPtr2 == nullptr) {
        cout << "dynamic_cast(Base*→Derived*)失?。ǚ项A(yù)期)" << endl;
    }

    // 釋放動態(tài)內(nèi)存
    delete basePtr1;
    delete basePtr2;

    return 0;
}

注意點

  • dynamic_cast 依賴 “運行時類型信息(RTTI)”,因此基類必須包含虛函數(shù)(否則編譯報錯);
  • 向下轉(zhuǎn)換時,若基類指針實際指向派生類對象,轉(zhuǎn)換成功;否則返回 nullptr(指針場景)或拋出異常(引用場景)。

總結(jié):四種轉(zhuǎn)換的分工

轉(zhuǎn)換運算符核心作用場景特點
static_cast日常非多態(tài)轉(zhuǎn)換,編譯期檢查最常用、安全(非向下轉(zhuǎn))
reinterpret_cast底層位模式重新解釋風(fēng)險高,僅底層場景用
const_cast專門移除 const 限定專項工具,需謹(jǐn)慎修改
dynamic_cast多態(tài)類的運行時安全轉(zhuǎn)換依賴虛函數(shù),運行時檢查

1 使用dynamic_cast<>的情況

類層次結(jié)構(gòu)中父類和子類之間指針和引用的轉(zhuǎn)換(運行時,類型檢查,保證了程序的安全性)【可以用于基類指針指向派生類的指針】
其他情況使用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++強制類型轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)C++強制類型轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++容器適配器的概念與示例

    C++容器適配器的概念與示例

    C++?STL(標(biāo)準(zhǔn)模板庫)是一套功能強大的?C++?模板類,提供了通用的模板類和函數(shù),這些模板類和函數(shù)可以實現(xiàn)多種流行和常用的算法和數(shù)據(jù)結(jié)構(gòu),如向量、鏈表、隊列、棧,今天我們來探究一下stl容器適配器的使用吧
    2023-01-01
  • C++ Boost System超詳細(xì)講解

    C++ Boost System超詳細(xì)講解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • 詳解C++編程的多態(tài)性概念

    詳解C++編程的多態(tài)性概念

    這篇文章主要介紹了C++編程的多態(tài)性概念,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • 如何在C語言中提取Shellcode并執(zhí)行

    如何在C語言中提取Shellcode并執(zhí)行

    Shellcode是一種獨立于應(yīng)用程序的機器代碼,通常用于實現(xiàn)特定任務(wù),如執(zhí)行遠(yuǎn)程命令、注入惡意軟件或利用系統(tǒng)漏洞,本文將深入探討如何在C語言中提取Shellcode,并通過XOR加密技術(shù)增加其混淆程度,文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • C++判斷一個點是否在圓內(nèi)的方法

    C++判斷一個點是否在圓內(nèi)的方法

    這篇文章主要為大家詳細(xì)介紹了C++判斷一個點是否在圓內(nèi)的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • C語言實現(xiàn)查看進程是否存在的方法示例

    C語言實現(xiàn)查看進程是否存在的方法示例

    這篇文章主要介紹了C語言實現(xiàn)查看進程是否存在的方法,涉及C語言針對進程操作的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2017-07-07
  • C++學(xué)習(xí)小結(jié)之?dāng)?shù)據(jù)類型及轉(zhuǎn)換方式

    C++學(xué)習(xí)小結(jié)之?dāng)?shù)據(jù)類型及轉(zhuǎn)換方式

    本文給大家分享的是本人在學(xué)習(xí)C++過程中的一個小心得,關(guān)于數(shù)據(jù)類型和轉(zhuǎn)換方式的,這里記錄下來,推薦給菜鳥們,高手大神請直接飄過。
    2015-07-07
  • 在Visual Studio Code中使用CSSComb格式化CSS文件的教程

    在Visual Studio Code中使用CSSComb格式化CSS文件的教程

    這篇文章主要介紹了在Visual Studio Code中使用CSSComb格式化CSS文件,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • C++中實現(xiàn)線程安全和延遲執(zhí)行詳解

    C++中實現(xiàn)線程安全和延遲執(zhí)行詳解

    這篇文章主要為大家詳細(xì)介紹了C++中實現(xiàn)線程安全和延遲執(zhí)行的相關(guān)知識,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,需要的小伙伴可以了解下
    2024-01-01
  • C語言指針如何實現(xiàn)字符串逆序反轉(zhuǎn)

    C語言指針如何實現(xiàn)字符串逆序反轉(zhuǎn)

    這篇文章主要介紹了C語言指針如何實現(xiàn)字符串逆序反轉(zhuǎn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評論

防城港市| 自贡市| 自贡市| 梅河口市| 慈溪市| 普兰店市| 旬阳县| 石狮市| 和平县| 昭觉县| 久治县| 福海县| 托克托县| 潜山县| 盐城市| 岢岚县| 凌海市| 西城区| 白银市| 崇左市| 会昌县| 吉林省| 襄樊市| 建宁县| 门源| 嘉义县| 格尔木市| 荔浦县| 云和县| 察雅县| 仁怀市| 扎赉特旗| 合作市| 邛崃市| 如东县| 铜梁县| 高阳县| 清镇市| 都匀市| 珲春市| 清涧县|