複雜部分略去,摘錄要素以下:ios
1.typeid是C++的關鍵字之一,等同於sizeof這類的操做符。c++
2.typeid操做符的返回結果是名爲type_info的標準庫類型的對象的引用(在頭文件typeinfo中定義)spa
3.C++並無規定typeid實現標準,各個編譯器可能會不同。對象
4.編譯器會爲每一種typeid操做的類型生成一份保存在數據段的type_info數據。字符串
5.每種類型的type_info數據長度依賴於類型名稱,至少9個字節。編譯器
我的實測總結以下:string
1.返回類型io
typeid返回的是type_info的引用,這個類不能拷貝,也不能本身構造。
在語法上要使用const type_info & 類型來定義一個對象編譯
type_info.name()的返回類型是一個const char* 靜態字符串stream
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++中都是正常的。