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

c++ typeid關(guān)鍵字的使用

 更新時(shí)間:2020年11月11日 10:11:50   作者:Mr-xxx  
這篇文章主要介紹了c++ typeid關(guān)鍵字的使用,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下

typeid關(guān)鍵字

注意:typeid是操作符,不是函數(shù)。這點(diǎn)與sizeof類似)

運(yùn)行時(shí)獲知變量類型名稱,可以使用 typeid(變量).name()

需要注意不是所有編譯器都輸出”int”、”float”等之類的名稱,對于這類的編譯器可以這樣使用

 int ia = 3;
 if(typeid(ia) == typeid(int))
 {
   cout <<"int" <<endl;
 }

RTTI(Run-Time Type Identification)-運(yùn)行時(shí)類型識別

在揭開typeid神秘面紗之前,我們先來了解一下RTTI(Run-Time Type Identification,運(yùn)行時(shí)類型識別),它使程序能夠獲取由基指針或引用所指向的對象的實(shí)際派生類型,即允許“用指向基類的指針或引用來操作對象”的程序能夠獲取到“這些指針或引用所指對象”的實(shí)際派生類型。

在C++中,為了支持RTTI提供了兩個(gè)操作符:dynamic_cast和typeid

  • dynamic_cast允許運(yùn)行時(shí)刻進(jìn)行類型轉(zhuǎn)換,從而使程序能夠在一個(gè)類層次結(jié)構(gòu)中安全地轉(zhuǎn)化類型,與之相對應(yīng)的還有一個(gè)非安全的轉(zhuǎn)換操作符static_cast,因?yàn)檫@不是本文的討論重點(diǎn),所以這里不再詳述,感興趣的可以自行查閱資料。
  • typeid是C++的關(guān)鍵字之一,等同于sizeof這類的操作符。typeid操作符的返回結(jié)果是名為type_info的標(biāo)準(zhǔn)庫類型的對象的引用(在頭文件typeinfo中定義,稍后我們看一下vs和gcc庫里面的源碼),它的表達(dá)式有下圖兩種形式。

實(shí)現(xiàn)機(jī)制與使用技巧

type_info類對象類別判別

對象類別判別分析

如果表達(dá)式的類型是類類型且至少包含有一個(gè)虛函數(shù),則typeid操作符返回表達(dá)式的動態(tài)類型,需要在運(yùn)行時(shí)計(jì)算;
否則,typeid操作符返回表達(dá)式的靜態(tài)類型,在編譯時(shí)就可以計(jì)算。

ISO C++標(biāo)準(zhǔn)并沒有確切定義type_info,它的確切定義編譯器相關(guān)的,但是標(biāo)準(zhǔn)卻規(guī)定了其實(shí)現(xiàn)必需提供如下四種操作(在之后的章節(jié)中我會來分析type_info類文件的源碼)

運(yùn)算 描述
t1 == t2 如果兩個(gè)對象t1和t2類型相同,則返回true;否則返回false
t1 != t2 如果兩個(gè)對象t1和t2類型不同,則返回true;否則返回false
t.name() 返回類型的C-style字符串,類型名字用系統(tǒng)相關(guān)的方法產(chǎn)生1
t1.before(t2) 返回指出t1是否出現(xiàn)在t2之前的bool值

type_info類提供了public虛 析構(gòu)函數(shù),以使用戶能夠用其作為基類。它的默認(rèn)構(gòu)造函數(shù)和拷貝構(gòu)造函數(shù)及賦值操作符都定義為private,所以不能定義或復(fù)制type_info類型的對象。程序中創(chuàng)建type_info對象的唯一方法是使用typeid操作符(由此可見,如果把typeid看作函數(shù)的話,其應(yīng)該是type_info的 友元)。type_info的name成員函數(shù)返回C-style的字符串,用來表示相應(yīng)的類型名,但務(wù)必注意這個(gè)返回的類型名與程序中使用的相應(yīng)類型名并不一定一致(往往如此,見后面的程序),這具體由編譯器的實(shí)現(xiàn)所決定的,標(biāo)準(zhǔn)只要求實(shí)現(xiàn)為每個(gè)類型返回唯一的字符串。

type_info類源代碼

使用sudo find / -name typeinfo.h來查找源碼

#ifndef _TYPEINFO
#define _TYPEINFO

#include <exception>

namespace std
{

 class type_info
 {
 public:

  virtual ~type_info();
  { return __name[0] == '*' ? __name + 1 : __name; }


  bool before(const type_info& __arg) const
  { return __name < __arg.__name; }

  bool operator==(const type_info& __arg) const
  { return __name == __arg.__name; }

  bool operator!=(const type_info& __arg) const
  { return !operator==(__arg); }

  virtual bool __is_pointer_p() const;

  virtual bool __is_function_p() const;

 protected:
  const char *__name;

  explicit type_info(const char *__n): __name(__n) { }

 private:
  type_info& operator=(const type_info&);
  type_info(const type_info&);
 };

} // extern "C++"
#endif

示例1-基本數(shù)據(jù)類型

下表列出了使用typeid操作符的表達(dá)式的值

 int a;
 double b;
 char * c;
 long d;

運(yùn)算 描述
typeid(a) == typeid(int) true
typeid(a) == typeid(float) false
typeid(a) == typeid(int *) false
typeid(b) == typeid(double) true
typeid(b) == typeid(float) false
typeid(b) == typeid(long double) false
typeid(c) == typeid(char *) true
typeid(c) == typeid(char) false
typeid(c) == typeid(string) false
typeid(d) == typeid(long) true
typeid(d) == typeid(int) false

操作符typeid返回的是一個(gè)type_info類(用于描述數(shù)據(jù)類型的一個(gè)系統(tǒng)類)對象的引用。這個(gè)操作符可以用于表達(dá)式和類型名(包括自定的數(shù)據(jù)類型,比如類)。

示例2-類對象

class base
{
public :
  void m(){cout<<"base"<<endl;}
};
class derived : public base
{
public:
  void m(){cout<<"derived"<<endl;}
};

假設(shè)我們根據(jù)例2中定義的兩個(gè)類來定義如下指針:

base * p = new derived;

下表將給出使用typeid操作符的結(jié)果。

運(yùn)算 描述
typeid(p) == typeid(base*) true
typeid(p) == typeid(derived*) false
typeid(*p) == typeid(base) true
typeid(*p) == typeid(derived) false

對于表達(dá)式typeid(p),同樣,因?yàn)閜是base*類型的指針,因此typeid(p) == typeid(base*)為真,而typeid(p) == typeid(derived*)為假。而對于表達(dá)式typeid(*p),由于此時(shí)的基類不具有多態(tài)性,因而*p將會采用編譯期類型來計(jì)算,編譯期*p是base對象,因此表達(dá)式typeid(*p) == typeid(derived)為假,typeid(*p) == typeid(base)為真。

示例3-帶虛函數(shù)的基類

class base
{
public :
  virtual void m(){cout<<"base"<<endl;}
};
class derived : public base
{
public:
  void m(){cout<<"derived"<<endl;}
};

假設(shè)我們?nèi)绫纠径x了兩個(gè)類base類和derived類,基于這兩個(gè)類定義,我們定義指針如下:

base * p = new derived;

下表將給出使用typeid操作符的結(jié)果。

運(yùn)算 描述
typeid(p) == typeid(base*) true
typeid(p) == typeid(derived*) false
typeid(*p) == typeid(base) false
typeid(*p) == typeid(derived) true

對于表達(dá)式typeid(p),因?yàn)閜是base*類型的指針,因此typeid(p) == typeid(base*)為真,而typeid(p) == typeid(derived*)為假。而對于表達(dá)式typeid(*p),因?yàn)閎ase類具有多態(tài)性,因而在計(jì)算typeid(*p)時(shí)會根據(jù)運(yùn)行時(shí)p所指向的實(shí)際類型去計(jì)算,而本例中p指向的是派生類對象,因此表達(dá)式typeid(*p) == typeid(derived)為真,typeid(*p) == typeid(base)為假。

異常處理bad_typeid

class bad_typeid : public exception
 {
 public:
  bad_typeid () throw() { }

  // This declaration is not useless:
  // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
  virtual ~bad_typeid() throw();

  // See comment in eh_exception.cc.
  virtual const char* what() const throw();
 };
} // namespace std

以上就是c++ typeid關(guān)鍵字的使用的詳細(xì)內(nèi)容,更多關(guān)于c++ typeid關(guān)鍵字的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 編寫C++程序使DirectShow進(jìn)行視頻捕捉

    編寫C++程序使DirectShow進(jìn)行視頻捕捉

    這篇文章主要介紹了如何編寫C++程序來使DirectShow進(jìn)行視頻捕捉的方法,DirectShow是微軟公司在ActiveMovie和Video for Windows的基礎(chǔ)上推出的新一代基于COM(Component Object Model)的流媒體處理的開發(fā)包,要的朋友可以參考下
    2016-03-03
  • C語言算術(shù)運(yùn)算符整理

    C語言算術(shù)運(yùn)算符整理

    算術(shù)運(yùn)算符用于各類數(shù)值運(yùn)算,包括加(+)、減(-)、乘(*)、除(/)、求余(或稱模運(yùn)算,%)、自增(++)、自減(--)共七種
    2023-03-03
  • 深入探討Linux靜態(tài)庫與動態(tài)庫的詳解(一看就懂)

    深入探討Linux靜態(tài)庫與動態(tài)庫的詳解(一看就懂)

    本篇文章是對Linux靜態(tài)庫與動態(tài)庫進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • EasyX實(shí)現(xiàn)自由落體小球

    EasyX實(shí)現(xiàn)自由落體小球

    這篇文章主要為大家詳細(xì)介紹了EasyX實(shí)現(xiàn)自由落體小球,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 詳解C/C++中const關(guān)鍵字的用法及其與宏常量的比較

    詳解C/C++中const關(guān)鍵字的用法及其與宏常量的比較

    簡單的說const關(guān)鍵字修飾的變量具有常屬性,也就是說它所修飾的變量不能被修改,下文給大家介紹C/C++中const關(guān)鍵字的用法及其與宏常量的比較,需要的朋友可以參考下
    2017-07-07
  • C++?typedef常見用法詳解

    C++?typedef常見用法詳解

    這篇文章主要介紹了C++?typedef用法詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 詳解C++ 引用

    詳解C++ 引用

    這篇文章主要介紹了C++ 引用的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • DEVC++實(shí)現(xiàn)推箱子小游戲

    DEVC++實(shí)現(xiàn)推箱子小游戲

    這篇文章主要為大家詳細(xì)介紹了DEVC++實(shí)現(xiàn)推箱子小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • C++學(xué)習(xí)進(jìn)階之Makefile基礎(chǔ)用法詳解

    C++學(xué)習(xí)進(jìn)階之Makefile基礎(chǔ)用法詳解

    Makefile 通常指的是一個(gè)含有一系列命令(directive)的,通過 Make自動化編譯工具,幫助 C/C++ 程序?qū)崿F(xiàn)自動編譯目標(biāo)文件的文件,這篇文章主要給大家介紹了關(guān)于C++學(xué)習(xí)進(jìn)階之Makefile基礎(chǔ)用法的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • C語言數(shù)據(jù)結(jié)構(gòu)深入探索順序表

    C語言數(shù)據(jù)結(jié)構(gòu)深入探索順序表

    大家好,今天給大家?guī)淼氖琼樞虮恚矣X得順序表還是有比較難理解的地方的,于是我就把這一塊的內(nèi)容全部整理到了一起,希望能夠給剛剛進(jìn)行學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的人帶來一些幫助,或者是已經(jīng)學(xué)過這塊的朋友們帶來更深的理解,我們現(xiàn)在就開始吧
    2022-05-05

最新評論

乌拉特中旗| 赤峰市| 定边县| 张家界市| 达尔| 太仓市| 塔河县| 中超| 夏河县| 锡林浩特市| 文昌市| 梅州市| 南华县| 宁乡县| 苏尼特左旗| 桐庐县| 鄄城县| 什邡市| 吉安市| 曲周县| 镇远县| 大安市| 叶城县| 修文县| 松原市| 佛冈县| 平遥县| 海丰县| 德令哈市| 山阳县| 湘乡市| 乾安县| 东安县| 乳山市| 常熟市| 邻水| 嘉义市| 土默特左旗| 万宁市| 洛隆县| 景宁|