C++動態與靜態轉換區別詳解

文章目錄

  • 前言
  • 一、 類型檢查的時機
  • 二、安全性
  • 三、適用場景
  • 四、代碼示例對比
  • 總結


前言

在 C++ 中,dynamic_caststatic_cast 是兩種不同的類型轉換操作符,主要區別體現在類型檢查的時機安全性和適用場景上。以下是它們的核心區別:


一、 類型檢查的時機

  • dynamic_cast
    運行時檢查。它會驗證轉換的合法性(比如指針或引用是否指向目標類型的有效對象)。如果轉換非法,對指針返回 nullptr,對引用拋出 std::bad_cast 異常。
    要求類必須有虛函數(即多態類型),否則無法使用。

  • static_cast
    編譯時檢查。它信任開發者對類型安全的保證,不執行運行時檢查。如果轉換非法(比如無關類之間的轉換),可能導致未定義行為(UB)。
    適用于編譯時已知類型關系的場景。

二、安全性

  • dynamic_cast
    更安全,但需要運行時開銷(RTTI)。
    主要用于多態類型的向下轉型(downcast)或交叉轉型(crosscast)。

  • static_cast
    不安全,但性能更高(無運行時開銷)。
    需要開發者自行確保類型兼容性,否則可能導致錯誤。

三、適用場景

dynamic_cast 的典型用途

  • 多態類型(有虛函數的類)的向下轉型:
class Base { virtual void foo() {} };
class Derived : public Base {};Base* ptr = new Derived;
Derived* derived_ptr = dynamic_cast<Derived*>(ptr); // 安全向下轉型
  • 處理繼承層次中的交叉轉換(如多重繼承中的兄弟類轉換)。

static_cast 的典型用途

  • 基本類型的顯式轉換(如 doubleint):
double d = 3.14;
int i = static_cast<int>(d);
  • 非多態類型的指針/引用轉換(需確保類型兼容):
Derived* d = new Derived;
Base* b = static_cast<Base*>(d); // 向上轉型(安全,無需 dynamic_cast)
  • 顯式反向轉換(如 void* → int*):
void* vptr = some_address;
int* iptr = static_cast<int*>(vptr);

四、代碼示例對比

向下轉型(多態類型)

class Base { virtual void foo() {} }; // 必須有多態性(虛函數)
class Derived : public Base {};Base* base_ptr = new Derived;// 使用 dynamic_cast(安全,但需要虛函數)
Derived* derived_ptr1 = dynamic_cast<Derived*>(base_ptr); // 成功// 使用 static_cast(不安全,但強制轉換)
Derived* derived_ptr2 = static_cast<Derived*>(base_ptr); // 可能未定義行為(若實際類型不匹配)
class Base { virtual void foo() {} };
class Derived : public Base {};Base* ptr = new Derived;
Derived* derived_ptr = dynamic_cast<Derived*>(ptr); // 安全向下轉型

非多態類型轉換

class A {};
class B : public A {};A* a_ptr = new B;
B* b_ptr = static_cast<B*>(a_ptr);   // 編譯通過,但無運行時檢查
// B* b_ptr = dynamic_cast<B*>(a_ptr); // 錯誤:A 不是多態類型(無虛函數)

總結

特性dynamic_caststatic_cast
類型檢查時機運行時編譯時
安全性高(失敗返回 nullptr 或拋異常)低(依賴開發者保證)
性能有運行時開銷(RTTI)無開銷
適用類型多態類型(需虛函數)任意類型(包括非多態)
典型用途向下轉型、交叉轉型基本類型轉換、顯式向上/向下轉型

優先選擇 static_cast,除非需要處理多態類型的不確定轉換(此時用 dynamic_cast)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70980.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70980.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70980.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

探秘《矩陣之美》:解鎖矩陣的無限魅力

在這個數據驅動的時代&#xff0c;矩陣作為數學中的瑰寶&#xff0c;不僅在理論研究中占據核心地位&#xff0c;更在工程技術、計算機科學、物理學、經濟學等眾多領域發揮著不可替代的作用。今天&#xff0c;讓我們通過中科院大學耿修瑞老師&#xff08;中科院空天信息研究院研…

【MySQL】(2) 庫的操作

SQL 關鍵字&#xff0c;大小寫不敏感。 一、查詢數據庫 show databases; 注意加分號&#xff0c;才算一句結束。 二、創建數據庫 {} 表示必選項&#xff0c;[] 表示可選項&#xff0c;| 表示任選其一。 示例&#xff1a;建議加上 if not exists 選項。 三、字符集編碼和排序…

Vue3實現文件上傳、下載及預覽全流程詳解(含完整接口調用)

文章目錄 一、環境準備1.1 創建Vue3項目1.2 安裝依賴1.3 配置Element Plus 二、文件上傳實現2.1 基礎上傳組件2.2 自定義上傳邏輯&#xff08;Axios實現&#xff09; 三、文件下載實現3.1 直接下載&#xff08;已知文件URL&#xff09;3.2 后端接口下載&#xff08;二進制流&am…

分布式數據存儲:提升系統彈性與性能的技術之路

分布式數據存儲:提升系統彈性與性能的技術之路 在當今數據爆炸式增長的時代,傳統的單機存儲系統已無法滿足大規模、高并發、低延遲的需求。尤其是在大數據、云計算和物聯網的推動下,數據存儲面臨著前所未有的挑戰。分布式數據存儲應運而生,通過將數據分布在多個物理節點上…

在編譯Linux的內核鏡像和模塊時,必須先編譯內核鏡像,再編譯模塊,順序不可隨意調整的原因

問&#xff1a;在編譯Linux的內核鏡像和模塊時,必須先編譯內核鏡像,再編譯模塊,順序不可隨意調整 答&#xff1a;在編譯 Linux 內核和模塊時&#xff0c;必須先編譯內核鏡像&#xff0c;再編譯模塊&#xff0c;順序不可隨意調整。 原因&#xff1a; 模塊依賴內核的頭文件和符…

免費使用 DeepSeek API 教程及資源匯總

免費使用 DeepSeek API 教程及資源匯總 一、DeepSeek API 資源匯總1.1 火山引擎1.2 百度千帆1.3 阿里百煉1.4 騰訊云 二、其他平臺2.1 華為云2.2 硅基流動 三、總結 DeepSeek-R1 作為 2025 年初發布的推理大模型&#xff0c;憑借其卓越的邏輯推理能力和成本優勢&#xff0c;迅速…

千峰React:案例二

完成對html文檔還有css的引入&#xff0c;引入一下數據&#xff1a; import { func } from prop-types import ./購物車樣式.css import axios from axios import { useImmer } from use-immer import { useEffect } from reactfunction Item() {return (<li classNameacti…

用DeepSeek生成批量刪除處理 PDF第一頁工具

安裝依賴庫 在運行程序之前&#xff0c;請確保安裝所需的庫&#xff1a; pip install pymupdf python-docx Python 程序代碼 import os import fitz # PyMuPDF from docx import Documentdef delete_pdf_first_page(input_path, output_path):"""刪除 PDF…

redis的下載和安裝詳解

一、下載redis安裝包 進入redis官網查看當前穩定版本&#xff1a; https://redis.io/download/發現此時的穩定版本是6.2.4&#xff0c; 此時可以去這個網站下載6.2.4穩定版本的tar包。 暫時不考慮不在windows上使用redis&#xff0c;那樣將無法發揮redis的性能 二、上傳tar…

如何使用 Jenkins 實現 CI/CD 流水線:從零開始搭建自動化部署流程

如何使用 Jenkins 實現 CI/CD 流水線:從零開始搭建自動化部署流程 在軟件開發過程中,持續集成(CI)和持續交付(CD)已經成為現代開發和運維的標準實踐。隨著代碼的迭代越來越頻繁,傳統的手動部署方式不僅低效,而且容易出錯。為了提高開發效率和代碼質量,Jenkins作為一款…

Python基于Django的網絡課程在線學習平臺【附源碼】

博主介紹&#xff1a;?Java老徐、7年大廠程序員經歷。全網粉絲12w、csdn博客專家、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&…

Pytorch為什么 nn.CrossEntropyLoss = LogSoftmax + nn.NLLLoss?

為什么 nn.CrossEntropyLoss LogSoftmax nn.NLLLoss&#xff1f; 在使用 PyTorch 時&#xff0c;我們經常聽說 nn.CrossEntropyLoss 是 LogSoftmax 和 nn.NLLLoss 的組合。這句話聽起來簡單&#xff0c;但背后到底是怎么回事&#xff1f;為什么這兩個分開的功能加起來就等于…

rabbitmq 延時隊列

要使用 RabbitMQ Delayed Message Plugin 實現延時隊列&#xff0c;首先需要確保插件已安裝并啟用。以下是實現延時隊列的步驟和代碼示例。 1. 安裝 RabbitMQ Delayed Message Plugin 首先&#xff0c;確保你的 RabbitMQ 安裝了 rabbitmq-delayed-message-exchange 插件。你可…

在 Vue 單文件組件(SFC)中,標簽的顯式關閉與隱式關閉有著重要的區別

一、顯式關閉標簽 1、定義&#xff1a; 所有的 HTML 標簽都必須有一個對應的結束標簽。 自閉合標簽也必須使用 / 來關閉。 <template> <div> <p>這是一個段落</p> <img src"image.png"…

第四屆大數據、區塊鏈與經濟管理國際學術會議

重要信息 官網&#xff1a;www.icbbem.com 時間&#xff1a;2025年3月14-16日 地點&#xff1a;中國-武漢 &#xff08;線上召開&#xff09; 簡介 第四屆大數據、區塊鏈與經濟管理國際學術會議(ICBBEM 2025)&#xff0c;將于2025年3月14-16日在中國湖北省武漢市召開。…

每日十個計算機專有名詞 (7)

Metasploit 詞源&#xff1a;Meta&#xff08;超越&#xff0c;超出&#xff09; exploit&#xff08;漏洞利用&#xff09; Metasploit 是一個安全測試框架&#xff0c;用來幫助安全專家&#xff08;也叫滲透測試人員&#xff09;發現和利用計算機系統中的漏洞。你可以把它想…

使用Docker Compose部署 MySQL8

MySQL 8 是一個功能強大的關系型數據庫管理系統,而 Docker 則是一個流行的容器化平臺。結合使用它們可以極大地簡化 MySQL 8 的部署過程,并且確保開發環境和生產環境的一致性。 安裝 Docker 和 Docker Compose 首先,確保你的機器上已經安裝了 Docker 和 Docker Compose。 …

mamba_ssm和causal-conv1d詳細安裝教程

1.前言 Mamba是近年來在深度學習領域出現的一種新型結構&#xff0c;特別是在處理長序列數據方面表現優異。在本文中&#xff0c;我將介紹如何在 Linux 系統上安裝并配置 mamba_ssm 虛擬環境。由于官方指定mamba_ssm適用于 PyTorch 版本高于 1.12 且 CUDA 版本大于 11.6 的環境…

c++中初始化列表的使用

在 C 中&#xff0c;初始化列表是在構造函數的定義中&#xff0c;用于對類的成員變量進行初始化的一種方式。它緊跟在構造函數的參數列表之后&#xff0c;使用冒號 : 分隔&#xff0c;各成員變量的初始化用逗號 , 分隔。下面詳細介紹初始化列表及其參數的含義。 基本語法 clas…

《Linux系統編程篇》System V信號量實現生產者與消費者問題(Linux 進程間通信(IPC))——基礎篇(拓展思維)

文章目錄 &#x1f4da; **生產者-消費者問題**&#x1f511; **問題分析**&#x1f6e0;? **詳細實現&#xff1a;生產者-消費者****步驟 1&#xff1a;定義信號量和緩沖區****步驟 2&#xff1a;創建信號量****步驟 3&#xff1a;生產者進程****步驟 4&#xff1a;消費者進程…