精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

RTTI和類型轉換運算符

冬至子 ? 來源:iDoitnow ? 作者:艱默 ? 2023-07-18 11:23 ? 次閱讀

1. RTTI

RTTI是 運行階段類型識別 (Runtime Type Identification)的簡稱。該特性是為了程序在運行階段確定對象類型提供一種標準方式。

1.1 RTTI的三個元素

由于只有包含虛函數的類層次結構,才能將派生類對象的地址賦給基類指針,因此RTTI只適用包含虛函數的類。

  • dynamic_cast運算符將使用一個指向基類的指針來生成一個指向派生類的指針,否則,該運算符返回0—空指針。
  • typeid運算符返回一個指出對象的類型的值。
  • type_info結構存儲了有關特定類型的信息

1.1.1 dynamic_cast運算符

dynamic_cast運算符是RTTI中最常用的組件,其主要的功能是 確定是否可以安全地將對地址賦給特定類型的指針 ,如果可以則返回該特定類型的指針,如果不可以則返回0(空指針)。可以理解為dynamic_cast可以用來類型轉換,如果可安全轉換,則轉換成相應的類型指針,否則直接返回0(空指針)。其語法如下:

dynamic_cast< type_name > (expression)

例如下面的例子:

class Base{
    private:
    double val;
    public:
    Base(double a = 0):val(a){}
    virtial void show(){std::cout< "Base show!"< < std::endl();}
}

class BaseA:public: Base{
    BaseA(double a = 0):Base(a){}
    virtual void show(){std::cout < "BaseA show!"<

假設有下面的指針:

Base* bs = new Base;
Base* ba = new BaseA;
Base* bb = new BaseB;

對于下面類型的轉換:

BaseB* b1 = dynamic_cast

因此針對該例子,dynamic_cast常用的場景如下:

auto bs = new BaseX;//BaseX為Base、BaseA、BaseB中的任意一種類型,假設其具體類型只有在程序運行過程中才能確定。
BaseA* pa;
if(pa = dynamic_cast

1.1.2 typeid運算符

typeid運算符能夠確定兩個對象是否為同種類型,其可以接受兩種參數

  • 類名;
  • 結果為對象的表達式。

其返回一個type_info對象的引用,其實方法如下:

//需要包含頭文件#include< typeinfo >
A* a = new A;//A為一個類
if(typeid(A) == typeid(*a)){
    std::cout < < "a的類型為A"<

針對上例,若a是一個空指針,則typeid(*a)會引發bad_typeid異常,該異常類型是從exception類派生出來,也是在typeinfo中生聲明的。

1.1.3. type_info類

type_info類主要存儲了有關特定類型的信息,其中包含了一個name()成員,該成員函數主要用于調試,其需要與typeid搭配使用,使用方法如下:

//class A;
A* a = new A;
std::cout< typeid(*a).name()<

2. 類型轉換運算符

2.1 dynamic_cast

前面已經介紹過其用法,該運算符的主要用途是,使得 能夠在類層次結構中進行向上轉換 (即派生類到基類的轉換,由于該轉換是is-a的關系,所以該轉換是安全的),而不允許其他的轉換。

2.2 const_cast

const_cast運算符用于執行只有一種用途的類型轉化,即改變constvolatile,其語法與dynamic_cast相同:

const_cast < type_name > (expression)

如果類型的其他方面也被修改,則上述類型轉換將出錯,也就是說除了constvolatile特征(有或無)可以不同外,type_nameexpression的類型必須相同。假設AB,則有下面的轉換:

A a;
const A* pa = &a;
A* pa1 = const_cast< A* >(pa); //正確
const B* pb = const_cast< const B* >(pa);//錯誤

提供該運算符的原因是,程序有時候可能需要一個這樣的值,它在大多數的時候是常量,而有時候又是可以修改的,在這種情況下,可以將這個值聲明為const,并在需要修改它的時候,使用const_cast

2.3 static_cast

static_cast運算符與其他類型轉換運算符的語法一樣:

static_cast < type_name > (expression)

static_castexpression轉換為type_name類型,主要用于非多態類型之間的轉換,不提供運行時的檢查來確保轉換的安全性。主要在以下幾種場合中使用:

  • 用于類層次結構中 ,基類和子類之間指針和引用的轉換;當進行上行轉換(把派生類的指針或引用轉換成基類表示),這種轉換是安全的;當進行下行轉換(把基類的指針或引用轉換成派生類表示),這種轉換是不安全的,也需要程序員來保證;
  • 用于基本數據類型之間的轉換 ,如把int轉換成char,把int轉換成enum等等,這種轉換的安全性需要程序員來保證;
  • 把void指針轉換成目標類型的指針 ,是極其不安全的,也需要程序員來保證;

2.4 reinterpret_cast

reinterpret_cast運算符與其他類型轉換運算符的語法一樣:

reinterpret_cast < type_name > (expression)

reinterpret_cast運算符用于天生危險的類型轉換,因為其允許將任何指針類型轉換為其它的指針類型。reinterpret_cast運算符并不會改變括號中運算對象的值,而是對該對象從位模式上進行重新解釋 。它主要用于將一種數據類型從一種類型轉換為另一種類型。

例如,它可以將一個指針轉換成一個整數,也可以將一個整數轉換成一個指針,然而,其并不支持所有類型的轉換,例如,可以將指針類型轉換為足以存儲指針表示的整形,但不能將指針轉換為更小的整形或浮點型。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 轉換器
    +關注

    關注

    27

    文章

    8636

    瀏覽量

    146881
  • 存儲器
    +關注

    關注

    38

    文章

    7454

    瀏覽量

    163613
  • 運算符
    +關注

    關注

    0

    文章

    172

    瀏覽量

    11066
收藏 人收藏

    評論

    相關推薦

    C語言運算符的使用方法

    詳細介紹了C語言表達式、算術運算符、賦值運算符、關系運算符、條件結構、邏輯運算符、位運算符的語法和使用方法,并討論了
    發表于 11-02 11:30 ?1509次閱讀
    C語言<b class='flag-5'>運算符</b>的使用方法

    C語言中基本的運算符,表達示及類型轉換

    運算符用于向編譯程序說明對數據操作的性質,即操作碼。C 語言提供的運算符非常豐富,它們與運算量相結合可形成多種多樣、使用靈活的表達式。因而為數據處理帶來了極大
    發表于 11-24 16:10 ?212次下載

    條件運算符是什么_條件運算符有哪些

    運算符優先級高于賦值、逗號運算符,低于其他運算符。關系運算實際上是邏輯比較運算,它是邏輯運算
    發表于 11-16 16:02 ?1.1w次閱讀
    條件<b class='flag-5'>運算符</b>是什么_條件<b class='flag-5'>運算符</b>有哪些

    單目運算符是什么_單目運算符有哪些

    單目運算符是指運算所需變量為一個的運算符,又叫一元運算符,其中有邏輯非運算符:!、按位取反運算符
    的頭像 發表于 02-24 15:42 ?6w次閱讀
    單目<b class='flag-5'>運算符</b>是什么_單目<b class='flag-5'>運算符</b>有哪些

    C++程序設計教程之運算符重載的詳細資料說明

    ,5. 重載雙目運算符,6. 重載單目運算符,7. 重載流插入運算符和流提取運算符,8. 不同類型數據間的
    發表于 03-14 16:04 ?4次下載
    C++程序設計教程之<b class='flag-5'>運算符</b>重載的詳細資料說明

    C運算符的優先級和結合性詳細解決

    運算符是一種告訴編譯器執行特定的數學或邏輯操作的符號。 C語言內置了豐富的運算符,大體可分為10類:算術運算符、關系運算符、邏輯運算符、位
    的頭像 發表于 02-22 17:27 ?3202次閱讀

    淺析MySQL中的各類運算符

    MySQL支持多種運算符,我們在寫SQL腳本時經常會需要用到各種各樣的運算符,這些運算符可以用來連接表達式,進而從數據庫中查詢我們需要的結果集等。這些類型主要包括算術
    的頭像 發表于 05-03 17:41 ?2030次閱讀
    淺析MySQL中的各類<b class='flag-5'>運算符</b>

    python運算符是什么

    python運算符 0. 什么是運算符? 本章節主要說明Python的運算符。舉個簡單的例子 4 +5 = 9 。 例子中,4和5被稱為操作數,“+”號為運算符。 Python語言支持
    的頭像 發表于 02-21 16:44 ?2356次閱讀

    C語言總結_語句、運算符

    當前文章復盤C語言的: 位運算運算符、基本運算符、數據類型、變量、for語句、while語句、goto語句、switch語句、運算符優先級強
    的頭像 發表于 08-14 09:39 ?983次閱讀

    什么是運算符重載

    重載運算符是具有特殊名稱的函數,是通過關鍵字** operator **后跟運算符的符號來定義的
    的頭像 發表于 01-20 15:30 ?2448次閱讀

    條件(三元)運算符

    RTL建模中廣泛使用的運算符是條件運算符,也稱為三元運算符,該運算符用于在兩個表達式之間進行選擇——表5-2列出了用于表示條件運算符的重點。
    的頭像 發表于 02-09 15:42 ?1315次閱讀
    條件(三元)<b class='flag-5'>運算符</b>

    什么是移位運算符

    移位運算符將向量的位向右或向左移位指定的次數。SystemVerilog具有按位和算術移位運算符
    的頭像 發表于 02-09 15:49 ?1787次閱讀
    什么是移位<b class='flag-5'>運算符</b>

    關系運算符與表達式

    關系運算符的作用就是對來倆個數值進行比較,并且將比較結果以布爾類型返回。如果關系運算符成立,則返回值為1,布爾類型為真。相反,若關系運算符
    的頭像 發表于 02-21 15:14 ?1016次閱讀
    關系<b class='flag-5'>運算符</b>與表達式

    Go語言運算符主要包括哪些呢?

    Go語言運算符主要包括:算數運算符、關系運算符、邏輯運算符、位運算符、賦值運算符和其他
    的頭像 發表于 05-26 15:54 ?839次閱讀
    Go語言<b class='flag-5'>運算符</b>主要包括哪些呢?

    邏輯運算符兩側運算對象的數據類型

    邏輯運算符是編程中常用的運算符之一,用于判斷兩個表達式之間的關系,并返回布爾值結果。在邏輯運算中,兩側運算對象的數據類型可以是任意
    的頭像 發表于 11-30 14:15 ?1656次閱讀