日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++ 获取类型信息

發(fā)布時(shí)間:2025/3/12 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 获取类型信息 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

typeid 運(yùn)算符用來(lái)獲取一個(gè)表達(dá)式的類型信息。類型信息對(duì)于編程語(yǔ)言非常重要,它描述了數(shù)據(jù)的各種屬性:

對(duì)于基本類型(int、float 等C++內(nèi)置類型)的數(shù)據(jù),類型信息所包含的內(nèi)容比較簡(jiǎn)單,主要是指數(shù)據(jù)的類型。對(duì)于類類型的數(shù)據(jù)(也就是對(duì)象),類型信息是指對(duì)象所屬的類、所包含的成員、所在的繼承關(guān)系等。

類型信息是創(chuàng)建數(shù)據(jù)的模板,數(shù)據(jù)占用多大內(nèi)存、能進(jìn)行什么樣的操作、該如何操作等,這些都由它的類型信息決定。

typeid 的操作對(duì)象既可以是表達(dá)式,也可以是數(shù)據(jù)類型,下面是它的兩種使用方法:

typeid( dataType ) typeid( expression )

dataType 是數(shù)據(jù)類型,expression 是表達(dá)式,這和 sizeof 運(yùn)算符非常類似,只不過(guò) sizeof 有時(shí)候可以省略括號(hào)( ),而 typeid 必須帶上括號(hào)。

typeid 會(huì)把獲取到的類型信息保存到一個(gè) type_info 類型的對(duì)象里面,并返回該對(duì)象的常引用;當(dāng)需要具體的類型信息時(shí),可以通過(guò)成員函數(shù)來(lái)提取。typeid 的使用非常靈活,請(qǐng)看下面的例子:

#include <iostream> #include <typeinfo> using namespace std;class Base{ };struct STU{ };int main(){//獲取一個(gè)普通變量的類型信息int n = 100;const type_info &nInfo = typeid(n);cout<<nInfo.name()<<" | "<<nInfo.raw_name()<<" | "<<nInfo.hash_code()<<endl;//獲取一個(gè)字面量的類型信息const type_info &dInfo = typeid(25.65);cout<<dInfo.name()<<" | "<<dInfo.raw_name()<<" | "<<dInfo.hash_code()<<endl;//獲取一個(gè)對(duì)象的類型信息Base obj;const type_info &objInfo = typeid(obj);cout<<objInfo.name()<<" | "<<objInfo.raw_name()<<" | "<<objInfo.hash_code()<<endl;//獲取一個(gè)類的類型信息const type_info &baseInfo = typeid(Base);cout<<baseInfo.name()<<" | "<<baseInfo.raw_name()<<" | "<<baseInfo.hash_code()<<endl;//獲取一個(gè)結(jié)構(gòu)體的類型信息const type_info &stuInfo = typeid(struct STU);cout<<stuInfo.name()<<" | "<<stuInfo.raw_name()<<" | "<<stuInfo.hash_code()<<endl;//獲取一個(gè)普通類型的類型信息const type_info &charInfo = typeid(char);cout<<charInfo.name()<<" | "<<charInfo.raw_name()<<" | "<<charInfo.hash_code()<<endl;//獲取一個(gè)表達(dá)式的類型信息const type_info &expInfo = typeid(20 * 45 / 4.5);cout<<expInfo.name()<<" | "<<expInfo.raw_name()<<" | "<<expInfo.hash_code()<<endl;return 0; }

運(yùn)行結(jié)果:

int | .H | 529034928 double | .N | 667332678 class Base | .?AVBase@@ | 1035034353 class Base | .?AVBase@@ | 1035034353 struct STU | .?AUSTU@@ | 734635517 char | .D | 4140304029 double | .N | 667332678

從本例可以看出,typeid 的使用非常靈活,它的操作數(shù)可以是普通變量、對(duì)象、內(nèi)置類型(int、float等)、自定義類型(結(jié)構(gòu)體和類),還可以是一個(gè)表達(dá)式

type_info 類的成員函數(shù)的介紹:

name() 用來(lái)返回類型的名稱。raw_name() 用來(lái)返回名字編碼(Name Mangling)算法產(chǎn)生的新名稱。hash_code() 用來(lái)返回當(dāng)前類型對(duì)應(yīng)的 hash 值。hash 值是一個(gè)可以用來(lái)標(biāo)志當(dāng)前類型的整數(shù),有點(diǎn)類似學(xué)生的學(xué)號(hào)、公民的身份證號(hào)、銀行卡號(hào)等。不過(guò) hash 值有賴于編譯器的實(shí)現(xiàn),在不同的編譯器下可能會(huì)有不同的整數(shù),但它們都能唯一地標(biāo)識(shí)某個(gè)類型。

C++ 標(biāo)準(zhǔn)規(guī)定,type_info 類至少要有如下所示的 4 個(gè) public 屬性的成員函數(shù),其他的擴(kuò)展函數(shù)編譯器開發(fā)者可以自由發(fā)揮,不做限制。

1 原型:const char name() const;*
返回一個(gè)能表示類型名稱的字符串。但是C++標(biāo)準(zhǔn)并沒(méi)有規(guī)定這個(gè)字符串是什么形式的。

2 原型:bool before (const type_info& rhs) const;
判斷一個(gè)類型是否位于另一個(gè)類型的前面,rhs 參數(shù)是一個(gè) type_info 對(duì)象的引用。但是C++標(biāo)準(zhǔn)并沒(méi)有規(guī)定類型的排列順序,不同的編譯器有不同的排列規(guī)則,程序員也可以自定義。要特別注意的是,這個(gè)排列順序和繼承順序沒(méi)有關(guān)系,基類并不一定位于派生類的前面。

3 原型:bool operator== (const type_info& rhs) const;
重載運(yùn)算符“==”,判斷兩個(gè)類型是否相同,rhs 參數(shù)是一個(gè) type_info 對(duì)象的引用。

4 原型:bool operator!= (const type_info& rhs) const;
重載運(yùn)算符“!=”,判斷兩個(gè)類型是否不同,rhs 參數(shù)是一個(gè) type_info 對(duì)象的引用。

判斷類型是否相等

typeid 運(yùn)算符經(jīng)常被用來(lái)判斷兩個(gè)類型是否相等。

1 內(nèi)置類型的比較
例如有下面的定義:

char *str; int a = 2; int b = 10; float f;

類型判斷結(jié)果為:

typeid 返回 type_info 對(duì)象的引用,而表達(dá)式typeid(a) == typeid(b)的結(jié)果為 true,可以說(shuō)明,一個(gè)類型不管使用了多少次,編譯器都只為它創(chuàng)建一個(gè)對(duì)象,所有 typeid 都返回這個(gè)對(duì)象的引用。

需要提醒的是,為了減小編譯后文件的體積,編譯器不會(huì)為所有的類型創(chuàng)建 type_info 對(duì)象,只會(huì)為使用了 typeid 運(yùn)算符的類型創(chuàng)建。不過(guò)有一種特殊情況,就是帶虛函數(shù)的類(包括繼承來(lái)的),不管有沒(méi)有使用 typeid 運(yùn)算符,編譯器都會(huì)為帶虛函數(shù)的類創(chuàng)建 type_info 對(duì)象。

2 類的比較
例如有下面的定義:

class Base{}; class Derived: public Base{};Base obj1; Base *p1; Derived obj2; Derived *p2 = new Derived; p1 = p2;

類型判斷結(jié)果為:

表達(dá)式typeid(p1) == typeid(Base)和typeid(p1) == typeid(Base)的結(jié)果為 true 可以說(shuō)明:即使將派生類指針 p2 賦值給基類指針 p1,p1 的類型仍然為 Base*。

type_info 類的聲明

type_info 類位于typeinfo頭文件,聲明形式類似于:

class type_info { public:virtual ~type_info();int operator==(const type_info& rhs) const;int operator!=(const type_info& rhs) const;int before(const type_info& rhs) const;const char* name() const;const char* raw_name() const; private:void *_m_data;char _m_d_name[1];type_info(const type_info& rhs);type_info& operator=(const type_info& rhs); };

它的構(gòu)造函數(shù)是 private 屬性的,所以不能在代碼中直接實(shí)例化,只能由編譯器在內(nèi)部實(shí)例化。而且還重載了“=”運(yùn)算符,也是 private 屬性的,所以也不能賦值。

總結(jié)

以上是生活随笔為你收集整理的C++ 获取类型信息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。