c++中獲得對象類型 typeid 與 type_info(轉)


復雜部分略去,摘錄要素如下:

1.typeid是C++的關鍵字之一,等同於sizeof這類的操作符。

2.typeid操作符的返回結果是名為type_info的標准庫類型的對象的引用(在頭文件typeinfo中定義)

3.C++並沒有規定typeid實現標准,各個編譯器可能會不一樣。

4.編譯器會為每一種typeid操作的類型生成一份保存在數據段的type_info數據。

5.每種類型的type_info數據長度依賴於類型名稱,至少9個字節。

 

 


個人實測總結如下:


1.返回類型


typeid返回的是type_info的引用,這個類不能拷貝,也不能自己構造。
在語法上要使用const type_info & 類型來定義一個對象

type_info.name()的返回類型是一個const char* 靜態字符串


2.可用操作集
-> 創建一個引用對象  const type_info& t0 = typeid(int);

-> 獲得類型名稱 const char* b=t0.name();

cout<<b<<" " <<t0.name()<<endl;

->比較對象是否相等,僅支持2種比較符
t1 == t2 ,t1 != t2 

 


程序實例:

#include<iostream>
#include<typeinfo>
#include<cstring>
using namespace std;

int main(void){
int i = 1;
float f = 1.222;

//定義引用對象
const type_info& t1 = typeid(f);
const type_info& t2 = typeid(int);
//獲得類型名稱
const char* a=t1.name();
const char* b=t1.name();
//比較對象相等
cout<<"ti==t2 ? "<< t1==t2<<endl;

return 0;
}


3.不同編譯器的機能的理解

在devc++5.11中

float f = 1.222;
cout<<typeid(f).name();
輸出
>>f
在vs2013中

float f = 1.222;
cout<<typeid(f).name();
輸出
>>float
可見簡陋的devc++,對於變量的類型處理不科學。

會直接創建一個新的type_info對象,儲存的private:name 是傳入的變量名稱

 

但是在devc++中直接輸入類型名稱是可以的

float f = 1.222;
cout<<typeid(float).name();
輸出
>>float
只要輸入的是類型名稱,后續的其他操作,例如比較typeid(float)==typeid(int),在devc++中都是正常的。

 

主要參考:
http://www.cppblog.com/smagle/archive/2010/05/14/115286.html

https://www.cnblogs.com/findumars/p/5006171.html
————————————————
版權聲明:本文為CSDN博主「w55100」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/w55100/article/details/80330812


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM