C typeid關鍵字詳解

2022-06-07 21:09:08 字數 4634 閱讀 3779

注意:typeid是操作符,不是函式。這點與sizeof類似)

執行時獲知變數型別名稱,可以使用 typeid(變數).name()

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

1

int ia = 3;2

if(typeid(ia) == typeid(int))3

在揭開typeid神秘面紗之前,我們先來了解一下rtti(run-time type identification,執行時型別識別),它使程式能夠獲取由基指標或引用所指向的物件的實際派生型別,即允許「用指向基類的指標或引用來操作物件」的程式能夠獲取到「這些指標或引用所指物件」的實際派生型別。

在c++中,為了支援rtti提供了兩個操作符:dynamic_casttypeid

如果表示式的型別是類型別且至少包含有乙個虛函式,則typeid操作符返回表示式的動態型別,需要在執行時計算;

否則,typeid操作符返回表示式的靜態型別,在編譯時就可以計算。

iso c++標準並沒有確切定義type_info,它的確切定義編譯器相關的,但是標準卻規定了其實現必需提供如下四種操作(在之後的章節中我會來分析type_info類檔案的原始碼)

運算描述

t1 == t2

如果兩個物件t1和t2型別相同,則返回true;否則返回false

t1 != t2

如果兩個物件t1和t2型別不同,則返回true;否則返回false

t.name()

返回型別的c-style字串,型別名字用系統相關的方法產生1

t1.before(t2)

返回指出t1是否出現在t2之前的bool值

type_info類提供了public虛 析構函式,以使使用者能夠用其作為基類。它的預設建構函式和拷貝建構函式及賦值操作符都定義為private,所以不能定義或複製type_info型別的物件。程式中建立type_info物件的唯一方法是使用typeid操作符(由此可見,如果把typeid看作函式的話,其應該是type_info的 友元)。type_info的name成員函式返回c-style的字串,用來表示相應的型別名,但務必注意這個返回的型別名與程式中使用的相應型別名並不一定一致(往往如此,見後面的程式),這具體由編譯器的實現所決定的,標準只要求實現為每個型別返回唯一的字串。

使用sudo find / -name typeinfo.h來查詢原始碼

下表列出了使用typeid操作符的表示式的值

1

inta;

2doubleb;3

char *c;

4long d;

運算描述

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返回的是乙個type_info類(用於描述資料型別的乙個系統類)物件的引用。這個操作符可以用於表示式和型別名(包括自定的資料型別,比如類)。

1

class

base25

};6class derived : public

base

710 };

假設我們根據例2中定義的兩個類來定義如下指標:

1

base * p = new derived;

下表將給出使用typeid操作符的結果。

運算描述

typeid(p) == typeid(base*)

true

typeid(p) == typeid(derived*)

false

typeid(*p) == typeid(base)

true

typeid(*p) == typeid(derived)

false

對於表示式typeid(p),同樣,因為p是base*型別的指標,因此typeid(p) == typeid(base*)為真,而typeid(p) == typeid(derived*)為假。而對於表示式typeid(*p),由於此時的基類不具有多型性,因而*p將會採用編譯期型別來計算,編譯期*p是base物件,因此表示式typeid(*p) == typeid(derived)為假,typeid(*p) == typeid(base)為真。

1

class

base25

};6class derived : public

base

710 };

假設我們如本例所示定義了兩個類base類和derived類,基於這兩個類定義,我們定義指標如下:

1

base * p = new derived;

下表將給出使用typeid操作符的結果。

運算描述

typeid(p) == typeid(base*)

true

typeid(p) == typeid(derived*)

false

typeid(*p) == typeid(base)

false

typeid(*p) == typeid(derived)

true

對於表示式typeid(p),因為p是base*型別的指標,因此typeid(p) == typeid(base*)為真,而typeid(p) == typeid(derived*)為假。而對於表示式typeid(*p),因為base類具有多型性,因而在計算typeid(*p)時會根據執行時p所指向的實際型別去計算,而本例中p指向的是派生類物件,因此表示式typeid(*p) == typeid(derived)為真,typeid(*p) == typeid(base)為假。

C typeid關鍵字詳解

注意 typeid是操作符,不是函式。這點與sizeof類似 執行時獲知變數型別名稱,可以使用 typeid 變數 name 需要注意不是所有編譯器都輸出 int float 等之類的名稱,對於這類的編譯器可以這樣使用 int ia 3 if typeid ia typeid int bool be...

C typeid關鍵字詳解

注意 typeid是操作符,不是函式。這點與sizeof類似 執行時獲知變數型別名稱,可以使用 typeid 變數 name 需要注意不是所有編譯器都輸出 int float 等之類的名稱,對於這類的編譯器可以這樣使用 int ia 3 if typeid ia typeid int bool be...

關鍵字const詳解

關鍵字const 1 用關鍵字const定義變數指所定義的常量。即恆定的變數,即不可改變的變數。例 const int i 10 此時 i 就是乙個整型的常量,其值不能改變。在c 中如果用const定義乙個物件,那麼物件中的成員變數就是常數,不能改變 只能為初始化的值 如果用const定義類中的成員...