typeid( dataType )
typeid( expression )
( ),而 typeid 必須帶上括號。
#include <iostream>
#include <typeinfo>
using namespace std;
class Base{ };
struct STU{ };
int main(){
//獲取一個普通變量的類型信息
int n = 100;
const type_info &nInfo = typeid(n);
cout<<nInfo.name()<<" | "<<nInfo.raw_name()<<" | "<<nInfo.hash_code()<<endl;
//獲取一個字面量的類型信息
const type_info &dInfo = typeid(25.65);
cout<<dInfo.name()<<" | "<<dInfo.raw_name()<<" | "<<dInfo.hash_code()<<endl;
//獲取一個對象的類型信息
Base obj;
const type_info &objInfo = typeid(obj);
cout<<objInfo.name()<<" | "<<objInfo.raw_name()<<" | "<<objInfo.hash_code()<<endl;
//獲取一個類的類型信息
const type_info &baseInfo = typeid(Base);
cout<<baseInfo.name()<<" | "<<baseInfo.raw_name()<<" | "<<baseInfo.hash_code()<<endl;
//獲取一個結構體的類型信息
const type_info &stuInfo = typeid(struct STU);
cout<<stuInfo.name()<<" | "<<stuInfo.raw_name()<<" | "<<stuInfo.hash_code()<<endl;
//獲取一個普通類型的類型信息
const type_info &charInfo = typeid(char);
cout<<charInfo.name()<<" | "<<charInfo.raw_name()<<" | "<<charInfo.hash_code()<<endl;
//獲取一個表達式的類型信息
const type_info &expInfo = typeid(20 * 45 / 4.5);
cout<<expInfo.name()<<" | "<<expInfo.raw_name()<<" | "<<expInfo.hash_code()<<endl;
return 0;
}
運行結果:nInfo.name()、objInfo.name()在 VC/VS 下的輸出結果分別是int和class Base,而在 GCC 下的輸出結果分別是i和4Base。objInfo.name()語句,VC/VS 下返回“class Base”,但 GCC 下返回“4Base”。
關於運算符重載,我們將在《C++運算符重載》一章中詳細講解。raw_name() 是 VC/VS 獨有的一個成員函數,hash_code() 在 VC/VS 和較新的 GCC 下有效。
char *str; int a = 2; int b = 10; float f;類型判斷結果為:
typeid(a) == typeid(b)的結果為 true,可以說明,一個類型不管使用了多少次,編譯器都只為它創建一個對象,所有 typeid 都返回這個對象的引用。
class Base{};
class Derived: public Base{};
Base obj1;
Base *p1;
Derived obj2;
Derived *p2 = new Derived;
p1 = p2;
類型判斷結果為:typeid(*p1) == typeid(Base)和typeid(p1) == typeid(Base*)的結果為 true 可以說明:即使將派生類指針 p2 賦值給基類指針 p1,p1 的類型仍然為 Base*。
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);
};
它的構造函數是 private 屬性的,所以不能在代碼中直接實例化,只能由編譯器在內部實例化(借助友元)。而且還重載了“=”運算符,也是 private 屬性的,所以也不能賦值。