日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

C++ 20類型轉(zhuǎn)換指南:使用場景與優(yōu)秀實踐

來源: 責編: 時間:2023-11-20 08:58:11 341觀看
導讀類型轉(zhuǎn)換 (Casts)C++ 提供了五種特定的類型轉(zhuǎn)換:const_cast<>()、static_cast<>()、reinterpret_cast<>()、dynamic_cast<>() 和 C++20 引入的 std::bit_cast<>()。請注意,舊的 C 風格類型轉(zhuǎn)換(如 (int)myFloat)在 C++ 中

類型轉(zhuǎn)換 (Casts)

C++ 提供了五種特定的類型轉(zhuǎn)換:const_cast<>()、static_cast<>()、reinterpret_cast<>()、dynamic_cast<>() 和 C++20 引入的 std::bit_cast<>()。WZ228資訊網(wǎng)——每日最新資訊28at.com

請注意,舊的 C 風格類型轉(zhuǎn)換(如 (int)myFloat)在 C++ 中仍然有效,并在現(xiàn)有代碼庫中廣泛使用。C 風格的類型轉(zhuǎn)換涵蓋了所有四種 C++ 類型轉(zhuǎn)換,因此它們更容易出錯,因為您試圖實現(xiàn)的目的并不總是顯而易見的,可能會得到意外的結(jié)果。我強烈建議您在新代碼中只使用 C++ 風格的類型轉(zhuǎn)換,因為它們更安全,且在代碼中更加突出。WZ228資訊網(wǎng)——每日最新資訊28at.com

WZ228資訊網(wǎng)——每日最新資訊28at.com

虛擬基類

模糊基類出現(xiàn)在多個父類共有一個共同的父類時。推薦的解決方案是確保共享的父類自身不具有任何功能。這樣,其方法永遠不會被調(diào)用,從而避免了歧義問題。C++ 還有另一種機制,稱為虛擬基類,用于解決您希望共享的父類具有自己功能的情況。WZ228資訊網(wǎng)——每日最新資訊28at.com

如果共享的父類是一個虛擬基類,則不會有任何歧義。以下代碼在 Animal 基類中添加了一個 sleep() 方法,并修改了 Dog 和 Bird 類,使它們作為虛擬基類從 Animal 繼承。如果不使用虛擬基類,對 DogBird 對象的 sleep() 調(diào)用將是模糊的,并會生成編譯器錯誤,因為 DogBird 將具有兩個 Animal 子對象,一個來自 Dog,一個來自 Bird。然而,當 Animal 被虛擬繼承時,DogBird 只有一個 Animal 類的子對象,因此調(diào)用 sleep() 不會有歧義。WZ228資訊網(wǎng)——每日最新資訊28at.com

class Animal {public:    virtual void eat() = 0;    virtual void sleep() { cout << "zzzzz...." << endl; }};class Dog : public virtual Animal {public:    virtual void bark() { cout << "Woof!" << endl; }    void eat() override { cout << "The dog ate." << endl; }};class Bird : public virtual Animal {public:    virtual void chirp() { cout << "Chirp!" << endl; }    void eat() override { cout << "The bird ate." << endl; }};class DogBird : public Dog, public Bird {public:    void eat() override { Dog::eat(); }};int main() {    DogBird myConfusedAnimal;    myConfusedAnimal.sleep(); // 因為虛擬基類而不模糊}

注意:虛擬基類是避免類層次結(jié)構(gòu)中歧義的好方法。WZ228資訊網(wǎng)——每日最新資訊28at.com

WZ228資訊網(wǎng)——每日最新資訊28at.com

類型轉(zhuǎn)換 (Casts)

C++ 提供了五種特定的類型轉(zhuǎn)換:const_cast<>()、static_cast<>()、reinterpret_cast<>()、dynamic_cast<>() 和 C++20 引入的 std::bit_cast<>()。第一種在第 1 章中討論過。第 1 章還介紹了用于某些基本類型之間轉(zhuǎn)換的 static_cast<>(),但在繼承的上下文中還有更多內(nèi)容。現(xiàn)在您已經(jīng)熟悉編寫自己的類并理解類繼承,是時候更仔細地看看這些類型轉(zhuǎn)換了。WZ228資訊網(wǎng)——每日最新資訊28at.com

請注意,舊的 C 風格類型轉(zhuǎn)換(如 (int)myFloat)在 C++ 中仍然有效,并在現(xiàn)有代碼庫中廣泛使用。C 風格的類型轉(zhuǎn)換涵蓋了所有四種 C++ 類型轉(zhuǎn)換,因此它們更容易出錯,因為您試圖實現(xiàn)的目的并不總是顯而易見的,可能會得到意外的結(jié)果。我強烈建議您在新代碼中只使用 C++ 風格的類型轉(zhuǎn)換,因為它們更安全,且在代碼中更加突出。WZ228資訊網(wǎng)——每日最新資訊28at.com

static_cast()

(1) 使用場景WZ228資訊網(wǎng)——每日最新資訊28at.com

static_cast()用于執(zhí)行語言直接支持的顯式轉(zhuǎn)換。例如,將int轉(zhuǎn)換為double以避免整數(shù)除法:WZ228資訊網(wǎng)——每日最新資訊28at.com

int i { 3 };int j { 4 };double result { static_cast<double>(i) / j };

static_cast() 也可用于執(zhí)行因用戶定義的構(gòu)造函數(shù)或轉(zhuǎn)換例程而允許的顯式轉(zhuǎn)換。例如,如果類 A 有一個接受 B 對象的構(gòu)造函數(shù),則可以使用 static_cast() 將 B 對象轉(zhuǎn)換為 A 對象。WZ228資訊網(wǎng)——每日最新資訊28at.com

(2) 在繼承中的應用WZ228資訊網(wǎng)——每日最新資訊28at.com

static_cast()可用于繼承層次結(jié)構(gòu)中的向下轉(zhuǎn)型:WZ228資訊網(wǎng)——每日最新資訊28at.com

class Base { /* ... */ };class Derived : public Base { /* ... */ };Base* b { nullptr };Derived* d { new Derived{} };b = d; // 向上轉(zhuǎn)型,不需要轉(zhuǎn)換。d = static_cast<Derived*>(b); // 向下轉(zhuǎn)型,需要轉(zhuǎn)換。

(3) 注意事項WZ228資訊網(wǎng)——每日最新資訊28at.com

  • static_cast() 不執(zhí)行運行時類型檢查。可以將任何 Base 指針轉(zhuǎn)換為 Derived 指針,即使 Base 實際上不是 Derived。
  • static_cast() 不是萬能的,它不能將一種類型的指針轉(zhuǎn)換為另一種完全無關(guān)的類型的指針,也不能在沒有轉(zhuǎn)換構(gòu)造函數(shù)的情況下直接將一種類型的對象轉(zhuǎn)換為另一種類型的對象。

reinterpret_cast()

(1) 使用場景WZ228資訊網(wǎng)——每日最新資訊28at.com

  • reinterpret_cast() 比 static_cast() 更強大但同時也更不安全。它用于執(zhí)行 C++ 類型規(guī)則技術(shù)上不允許的某些轉(zhuǎn)換。
  • 可以用來將一種類型的引用轉(zhuǎn)換為另一種類型的引用,即使類型之間完全無關(guān)。
  • 常用于將指針類型轉(zhuǎn)換為任何其他指針類型,包括將任何類型的指針轉(zhuǎn)換為 void*。

(2) 注意事項WZ228資訊網(wǎng)——每日最新資訊28at.com

  • 使用 reinterpret_cast() 要格外小心,因為它允許你在不執(zhí)行任何類型檢查的情況下進行轉(zhuǎn)換。
  • 可以用 reinterpret_cast() 將指針轉(zhuǎn)換為足夠大以容納它的整型類型,反之亦然。但是,嘗試將 64 位指針轉(zhuǎn)換為 32 位整數(shù)會導致編譯錯誤。

std::bit_cast()

(1) 特點WZ228資訊網(wǎng)——每日最新資訊28at.com

  • std::bit_cast() 是 C++20 中引入的,定義在 <bit> 頭文件中。
  • 它是標準庫中唯一的類型轉(zhuǎn)換,其他類型轉(zhuǎn)換是 C++ 語言本身的一部分。
  • bit_cast() 類似于 reinterpret_cast(),但它創(chuàng)建一個給定目標類型的新對象,并將源對象的位復制到這個新對象中。它有效地將源對象的位解釋為目標對象的位。
  • bit_cast() 要求源對象和目標對象的大小相同且都是平凡可復制的。

(2) 示例WZ228資訊網(wǎng)——每日最新資訊28at.com

float asFloat { 1.23f };auto asUint { bit_cast<unsigned int>(asFloat) };if (bit_cast<float>(asUint) == asFloat) {    cout << "Roundtrip success." << endl;}

(3) 應用場景WZ228資訊網(wǎng)——每日最新資訊28at.com

bit_cast() 的一個用例是用于平凡可復制類型的二進制 I/O。例如,可以將這些類型的單個字節(jié)寫入文件,讀取文件時,可以使用 bit_cast() 正確解釋從文件讀取的字節(jié)。WZ228資訊網(wǎng)——每日最新資訊28at.com

平凡可復制類型通常具有以下特征:WZ228資訊網(wǎng)——每日最新資訊28at.com

WZ228資訊網(wǎng)——每日最新資訊28at.com

WZ228資訊網(wǎng)——每日最新資訊28at.com

  • 無自定義析構(gòu)函數(shù):類型沒有自定義的析構(gòu)函數(shù)。
  • 無自定義或虛擬構(gòu)造函數(shù):類型沒有自定義的構(gòu)造函數(shù),也沒有虛擬構(gòu)造函數(shù)。
  • 無虛函數(shù)和虛基類:類型不包含虛函數(shù),并且不從虛基類繼承。
  • 可簡單拷貝其狀態(tài):類型的所有成員可以通過簡單的內(nèi)存拷貝來復制,沒有需要特殊處理的成員(如指針或動態(tài)分配的資源)。

dynamic_cast()

(1) 特點WZ228資訊網(wǎng)——每日最新資訊28at.com

  • dynamic_cast() 在繼承層次結(jié)構(gòu)中提供了運行時類型檢查。
  • 它可以用于轉(zhuǎn)換指針或引用。
  • 如果轉(zhuǎn)換沒有意義,dynamic_cast() 將返回空指針(對于指針版本)或拋出 std::bad_cast 異常(對于引用版本)。

(2) 示例WZ228資訊網(wǎng)——每日最新資訊28at.com

Base* b;Derived* d { new Derived{} };b = d;d = dynamic_cast<Derived*>(b);Base base;Derived derived;Base& br { base };try {    Derived& dr { dynamic_cast<Derived&>(br) };} catch (const bad_cast&) {    cout << "Bad cast!" << endl;}

(3) 與其他類型轉(zhuǎn)換的區(qū)別WZ228資訊網(wǎng)——每日最新資訊28at.com

  • 與 static_cast() 或 reinterpret_cast() 不同,dynamic_cast() 執(zhí)行運行時(動態(tài))類型檢查,而后者即使轉(zhuǎn)換錯誤也會執(zhí)行轉(zhuǎn)換。
  • 為了使用 dynamic_cast(),你的類必須至少有一個虛擬方法。如果類沒有虛擬表(vtable),嘗試使用 dynamic_cast() 將導致編譯錯誤。

C++ 類型轉(zhuǎn)換總結(jié)

情境
WZ228資訊網(wǎng)——每日最新資訊28at.com

推薦的轉(zhuǎn)換方法
WZ228資訊網(wǎng)——每日最新資訊28at.com

說明
WZ228資訊網(wǎng)——每日最新資訊28at.com

移除 const 屬性WZ228資訊網(wǎng)——每日最新資訊28at.com

const_cast()WZ228資訊網(wǎng)——每日最新資訊28at.com

用于移除對象的 const 屬性WZ228資訊網(wǎng)——每日最新資訊28at.com

語言直接支持的顯式轉(zhuǎn)換
WZ228資訊網(wǎng)——每日最新資訊28at.com

static_cast()WZ228資訊網(wǎng)——每日最新資訊28at.com

例如,從 int 轉(zhuǎn)換到 double 或 boolWZ228資訊網(wǎng)——每日最新資訊28at.com

用戶定義的構(gòu)造函數(shù)或轉(zhuǎn)換支持的顯式轉(zhuǎn)換
WZ228資訊網(wǎng)——每日最新資訊28at.com

static_cast()WZ228資訊網(wǎng)——每日最新資訊28at.com

用于用戶定義的轉(zhuǎn)換
WZ228資訊網(wǎng)——每日最新資訊28at.com

一個類的對象轉(zhuǎn)換為另一個(無關(guān))類的對象
WZ228資訊網(wǎng)——每日最新資訊28at.com

bit_cast()WZ228資訊網(wǎng)——每日最新資訊28at.com

用于無關(guān)類之間的對象轉(zhuǎn)換
WZ228資訊網(wǎng)——每日最新資訊28at.com

同一繼承層次中的類的指針對象轉(zhuǎn)換
WZ228資訊網(wǎng)——每日最新資訊28at.com

dynamic_cast() (推薦) 或 static_cast()WZ228資訊網(wǎng)——每日最新資訊28at.com

用于繼承層次中的指針對象轉(zhuǎn)換
WZ228資訊網(wǎng)——每日最新資訊28at.com

同一繼承層次中的類的引用對象轉(zhuǎn)換
WZ228資訊網(wǎng)——每日最新資訊28at.com

dynamic_cast() (推薦) 或 static_cast()WZ228資訊網(wǎng)——每日最新資訊28at.com

用于繼承層次中的引用對象轉(zhuǎn)換
WZ228資訊網(wǎng)——每日最新資訊28at.com

不相關(guān)類型的指針轉(zhuǎn)換
WZ228資訊網(wǎng)——每日最新資訊28at.com

reinterpret_cast()WZ228資訊網(wǎng)——每日最新資訊28at.com

用于完全不相關(guān)的指針類型之間的轉(zhuǎn)換
WZ228資訊網(wǎng)——每日最新資訊28at.com

不相關(guān)類型的引用轉(zhuǎn)換
WZ228資訊網(wǎng)——每日最新資訊28at.com

reinterpret_cast()WZ228資訊網(wǎng)——每日最新資訊28at.com

用于完全不相關(guān)的引用類型之間的轉(zhuǎn)換
WZ228資訊網(wǎng)——每日最新資訊28at.com

函數(shù)指針之間的轉(zhuǎn)換
WZ228資訊網(wǎng)——每日最新資訊28at.com

reinterpret_cast()WZ228資訊網(wǎng)——每日最新資訊28at.com

用于函數(shù)指針之間的轉(zhuǎn)換
WZ228資訊網(wǎng)——每日最新資訊28at.com

注意事項

  • 使用 const_cast() 應謹慎,因為它改變了對象的 const 性質(zhì)。
  • static_cast() 是最常用的轉(zhuǎn)換類型,適用于許多標準和用戶定義的轉(zhuǎn)換。
  • bit_cast() 用于位級別的類型轉(zhuǎn)換,要求源和目標類型大小相同且都是平凡可復制的。
  • dynamic_cast() 在繼承層次中提供運行時類型檢查,但要求類至少有一個虛擬方法。
  • reinterpret_cast() 提供更廣泛的轉(zhuǎn)換能力,但也帶來更高的風險,因為它不執(zhí)行類型檢查。

WZ228資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-31013-0.htmlC++ 20類型轉(zhuǎn)換指南:使用場景與優(yōu)秀實踐

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Go vs Rust:文件上傳性能比較

下一篇: C++14中的成員初始值設定項與聚合功能詳解

標簽:
  • 熱門焦點
  • SpringBoot中使用Cache提升接口性能詳解

    環(huán)境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架從 3.1 開始,對 Spring 應用程序提供了透明式添加緩存的支持。和事務支持一樣,抽象緩存允許一致地使用各
  • 只需五步,使用start.spring.io快速入門Spring編程

    步驟1打開https://start.spring.io/,按照屏幕截圖中的內(nèi)容創(chuàng)建項目,添加 Spring Web 依賴項,并單擊“生成”按鈕下載 .zip 文件,為下一步做準備。請在進入步驟2之前進行解壓。圖
  • 19個 JavaScript 單行代碼技巧,讓你看起來像個專業(yè)人士

    今天這篇文章跟大家分享18個JS單行代碼,你只需花幾分鐘時間,即可幫助您了解一些您可能不知道的 JS 知識,如果您已經(jīng)知道了,就當作復習一下,古人云,溫故而知新嘛。現(xiàn)在,我們就開始今
  • 騰訊VS網(wǎng)易,最卷游戲暑期檔,誰能笑到最后?

    作者:無銹缽來源:財經(jīng)無忌7月16日晚,上海1862時尚藝術(shù)中心。伴隨著幻象的精準命中,碩大的熒幕之上,比分被定格在了14:12,被寄予厚望的EDG戰(zhàn)隊以絕對的優(yōu)勢戰(zhàn)勝了BLG戰(zhàn)隊,拿下了總決
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預警不絕,但處于厄爾尼諾大&ldquo;烤&rdquo;之下的除了眾生,還有各大企業(yè)發(fā)布的ESG報告。ESG是&ldquo;環(huán)境保
  • 當家的盒馬,加速謀生

    來源 | 價值星球Planet作者 | 歸去來自己&ldquo;當家&rdquo;的盒馬,開始加速謀生了。據(jù)盒馬官微消息,盒馬計劃今年開放生鮮供應鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經(jīng)與
  • 小米MIX Fold 3下月亮相:今年唯一無短板的全能折疊屏

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都有新的進展,其中榮耀、三星都已陸續(xù)發(fā)布了最新的折疊屏旗艦,尤其號榮耀Magi
  • 朋友圈可以修改可見范圍了 蘋果用戶可率先體驗

    近日,iOS用戶迎來微信8.0.27正式版更新,除了可更換二維碼背景外,還新增了多項實用功能。在新版微信中,朋友圈終于可以修改可見范圍,簡單來說就是已發(fā)布的朋友圈
  • 華為舉行春季智慧辦公新品發(fā)布會 首次推出電子墨水屏平板

    北京時間2月27日晚,華為在巴塞羅那舉行春季智慧辦公新品發(fā)布會,在海外市場推出之前已經(jīng)在中國市場上市的筆記本、平板、激光打印機等辦公產(chǎn)品,并首次推出搭載
Top 主站蜘蛛池模板: 吉安县| 浮梁县| 旅游| 临城县| 江山市| 浪卡子县| 历史| 会同县| 禹城市| 盖州市| 礼泉县| 新龙县| 盐山县| 武强县| 常山县| 廊坊市| 三台县| 东光县| 固安县| 怀仁县| 衡山县| 泸水县| 淳化县| 从江县| 读书| 天气| 买车| 子洲县| 万盛区| 巨野县| 平定县| 孟连| 青川县| 郑州市| 乌恰县| 郯城县| 武邑县| 福安市| 阿拉善左旗| 喀喇沁旗| 南投县|