程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++運轉時獲得類型信息的type_info類與bad_typeid異常

C++運轉時獲得類型信息的type_info類與bad_typeid異常

編輯:關於C++

C++運轉時獲得類型信息的type_info類與bad_typeid異常。本站提示廣大學習愛好者:(C++運轉時獲得類型信息的type_info類與bad_typeid異常)文章只能為提供參考,不一定能成為您想要的結果。以下是C++運轉時獲得類型信息的type_info類與bad_typeid異常正文


type_info 類
type_info 類描寫編譯器在法式中生成的類型信息。此類的對象可以有用存儲指向類型的稱號的指針。 type_info 類還可存儲合適比擬兩個類型能否相等或比擬其分列次序的編碼值。類型的編碼規矩和分列次序是未指定的,而且能夠因法式而異。
必需包括 <typeinfo> 標頭文件能力應用 type_info 類。 type_info 類的接口是:

class type_info {
public:
  virtual ~type_info();
  size_t hash_code() const
  _CRTIMP_PURE bool operator==(const type_info& rhs) const;
  _CRTIMP_PURE bool operator!=(const type_info& rhs) const;
  _CRTIMP_PURE int before(const type_info& rhs) const;
  _CRTIMP_PURE const char* name() const;
  _CRTIMP_PURE const char* raw_name() const;
};

您不克不及直接實例化 type_info 類的對象,由於該類只要一個公有復制結構函數。結構(暫時)type_info 對象的獨一方法是應用 typeid 運算符。因為賦值運算符也是公有的,是以不克不及復制或分派類 type_info 的對象。
type_info::hash_code 可界說合適將 typeinfo 類型的值映照到索引值的散布的哈希函數。
運算符 == 和 != 分離用於與其他 type_info 對象比擬能否相等和不相等。
類型的分列次序與繼續關系之間沒有聯系關系。應用 type_info::before 成員函數可肯定類型的排序次序。不克不及包管 type_info::before 在分歧的法式中(乃至是屢次運轉統一法式時)會發生雷同的成果。如許,type_info::before 相似於 address-of (&) 運算符。
type_info::name 成員函數可將 const char* 前往到以 null 開頭的字符串,該字符串表現類型的用戶可讀稱號。將緩存所指向的內存,應當從不直接釋放它。
type_info::raw_name 成員函數可將 const char* 前往到以 null 開頭的字符串,該字符串表現對象類型的潤飾稱號。該稱號現實上以其潤飾的情勢存儲以節儉空間。是以,此函數比 type_info::name 更快,由於它不須要撤消潤飾稱號。 type_info::raw_name 函數前往的字符串在比擬運算符中很有效,但它弗成讀。假如您須要用戶可讀的字符串,請改用 type_info::name 函數。

bad_typeid 異常
當 typeid 的操作數是 Null 指針時,typeid 運算符將激發 bad_typeid 異常。
語法

  catch (bad_typeid)
statement

備注
bad_typeid 的接口為:

class bad_typeid : public exception
{
public:
  bad_typeid(const char * _Message = "bad typeid");
  bad_typeid(const bad_typeid &);
  virtual ~bad_typeid();
};

以下示例演示激發 bad_typeid 異常的 typeid 運算符。

// expre_bad_typeid.cpp
// compile with: /EHsc /GR
#include <typeinfo.h>
#include <iostream>

class A{
public:
  // object for class needs vtable
  // for RTTI
  virtual ~A();
};

using namespace std;
int main() {
A* a = NULL;

try {
  cout << typeid(*a).name() << endl; // Error condition
  }
catch (bad_typeid){
  cout << "Object is NULL" << endl;
  }
}

輸入

Object is NULL

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved