C++ Primer 筆記——運行時類型識別


1.dynamic_cast運算符的使用形式如下:

dynamic_cast<type*>(e)    // e必須是一個有效指針
dynamic_cast<type&>(e) // e必須是一個左值
dynamic_cast<type&&>(e) // e不能是一個左值


2.如果一條dynamic_cast 語句的轉換目標是指針類型並且失敗了,則結果為0,如果轉換目標是引用類型並且失敗了,則dynamic_cast運算符將拋出一個bad_cast異常(因為不存在空引用)。

 

3.我們可以對一個空指針執行dynamic_cast,結果是所需類型的空指針。

 

4.typeid 表達式的形式是typeid(e),其中e可以是任意表達式或類型的名字。結果是一個常量對象的引用,該對象的類型是標准庫類型type_info或者type_info的公有派生類型。當typeid作用於指針時(而非指針所指的對象),返回結果是該指針的靜態編譯時類型。

int *p = new int(1);
int *q = new int(1);

typeid(
*p) == typeid(*q); // true
typeid(*p) == typeid(int); // true
typeid(p) == typeid(int); // false

 

5.typeid運算符可以作用於任意類型的表達式,頂層const被忽略如果表達式是一個引用,則typeid返回該引用所引對象的類型。當typeid作用於數組或函數時,並不會執行向指針的標准類型轉換,也就是說我們對數組類型得到的結果是數組類型而非指針類型。

 

6.typeid是否需要運行時檢查決定了表達式是否會被求值。只有當類型含有虛函數時,編譯器才會對表達式求值,如果類型不含有虛函數,則typeid返回表達式的靜態類型,因為編譯器無須對表達式求值也能知道表達式的靜態類型。如果需要求值得時候指針是空指針,則將拋出一個名為bad_typeid的異常。

 

7.type_info類的精確定義隨着編譯器的不同而略有差異。不過,C++標准規定type_info類必須在typeinfo頭文件中,並且至少提供以下操作:

 

8.type_info類一般是作為一個基類出現,所以它還應該提供一個公有的虛析構函數,當編譯器希望提供額外的類型信息時,通常在type_info的派生類中完成。type_info類沒有默認構造函數,而且拷貝和移動構造函數以及賦值運算符都被定義成刪除的。因此,我們無法定義或拷貝type_info類型的對象,也不能為type_info類型的對象賦值。創建type_info對象的唯一途徑是使用typeid運算符。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: