C++ typeid用法 21

作者 : 慕源网 本文共3323个字,预计阅读时间需要9分钟 发布时间: 2022-04-21 共110人阅读

C++ typeid用法,在C++中,TypeID是一个运算符,用于检索对象的运行时或动态类型信息。对象可以是变量类型、对象类型或表达式类型。要在程序中使用typeid操作符,需要包含库头<typeinfo>。它返回类型为const_type_info的左值来表示值的类型。TypeID的表达式是左值表达式(左值具有程序可访问的地址)。例如,变量名、函数、类成员、union等)

下面给出了在C++程序中使用TypeID的基本语法:

typeid(expression)

或者

typeid(type)

Expression:在这里,整个expression 作为参数传递,以检索其类型的运行时信息。首先计算表达式,然后根据最终结果提供其类型。

Type:变量或对象作为参数传递,以检索它的动态类型。与expression 参数不同,它不需要求值。因此,直接获得信息类型作为最终结果。

返回值:它返回对象的运行时或动态类型信息,这是一个类型为const type_info的左值。如果类型是引用类型,则返回引用类型的type_info对象。

C++ typeid用法 21

TypeID如何在C++中工作?

下面给出了描述C++程序中typeid工作的一些要点:

  • 如果在TypeID运算符中作为参数传递的expression 是基类型,但对象是从基类派生的类型,则结果是派生类的TYPE_INFO引用。
  • 如果在typeid操作符中作为参数传递的expression 取消对指针的引用,并且指针值为NULL或指向OnValid对象,则将抛出BAD_TYPEID错误。
  • 如果在类型表达式中传递的表达式既不是取消引用的指针,也不是基类的对象,它将返回type_info引用作为表达式的静态类型。在这种情况下,计算时将忽略引用。
  • 如果我们只需要类信息,则使用 typeid 而不是 dynamic_cast。
  • 当需要查找与计算运行时信息相关的表达式类型时,操作数 typeid 很有用,例如多态类类型的对象的引用或指针的解引用。
  • TypeID不能应用于不完整的类型。因此,如果对象正在构造或销毁,则它返回正在构造或销毁的类的STD:type_info。

C++中的TypeID示例

下面给出了一些示例,说明程序中TypeID的使用:

例#1

获取int、float、char等简单对象的TypeID并比较它们的类型

代码:

#include <iostream>
#include <typeinfo>
using namespace std;
int main()
{
int i, j;
float f;
char c, *d;
double e;
//Getting the type using the typeid operator and passing the variables
const type_info& ti1 = typeid(i);
const type_info& ti2 = typeid(j);
const type_info& ti3 = typeid(f);
const type_info& ti4 = typeid(c);
const type_info& ti5 = typeid(d);
const type_info& ti6 = typeid(e);
const type_info& ti7 = typeid(*d);
// Printing the types of the variables of different data type on the console
cout << ti1.name() << endl;
cout << ti2.name() << endl;
cout << ti3.name() << endl;
cout << ti4.name() << endl;
cout << ti5.name() << endl;
cout << ti6.name() << endl;
cout << ti7.name() << endl;
//making comparisons in the types retrieved above
if (ti1 == ti2)
{
cout<< "Both i and j are of same type " << endl;
}
else
{
cout << "Both i and j are of different types" << endl;
}
if(ti5== ti7)
{
cout << "Both pointer and its address are of same type" << endl;
}
else
{
cout << "Both pointer and its address are of different types" << endl;
}
return 0;
}

输出:

 

C++ typeid用法 21

例#2

使用typeid 获取多态和非多态基类的对象类型

代码:

#include <iostream>
#include <typeinfo>
//using polymorphic base class B1
class B1 {
public:
virtual void fun() {}
};
//using non-polymorphic base class B2
class B2 {};
class D1 : public B1 {};
class D2 : public B2 {};
using namespace std;
//main function
int main() {
D1* d1 = new D1;
B1* b1 = d1;
D2* d2 = new D2;
B2* b2 = d2;
//Printing the type of above class objects on the console
cout << typeid( d1 ).name() << endl;
cout << typeid( b1 ).name() << endl;
cout << typeid( *d1 ).name() << endl;
cout << typeid( *b1 ).name() << endl;
cout << typeid( d2 ).name() << endl;
cout << typeid( b2 ).name() << endl;
cout << typeid( *d2 ).name() << endl;
cout << typeid( *b2 ).name() << endl;
}

输出:

 

C++ typeid用法 21

例#3

通过计算TypeID的参数的表达式来获取类型。

代码:

#include <iostream>
#include <typeinfo>
using namespace std;
int main()
{
int i = 13;
float j = 15.6;
double x = 3.14;
char c = 'y';
// Using the expression as a parameter in typeid
const type_info& t_id1 = typeid(i * x);
const type_info& t_id2 = typeid(i * j);
const type_info& t_id3 = typeid(i * c);
const type_info& t_id4 = typeid(x * c);
//Printing the type of the above calculated expressions on the console
cout << "type of t_id1 expression is "
<< t_id1.name() << endl;
cout << "type of t_id2 expression is "
<< t_id2.name() << endl;
cout << "type of t_id3 expression is "
<< t_id3.name() << endl;
cout << "type of t_id4 expression is "
<< t_id4.name() << endl;
return 0;
}

输出:

 

C++ typeid用法 21

通过将expression 的类型作为参数传递到TypeID中来计算TypeID。在简单数据类型(如int、float、double等)的情况下,TypeId在没有任何计算的情况下产生,而在expression 的情况下,首先计算表达式,然后计算其类型。

结论

上面的描述清楚地解释了什么是C++中的TypeID,以及如何使用它来查找对象的动态类型。TypeID的返回类型取决于要计算其类型的对象。它会抛出许多错误并导致意外的输出。因此,在程序中使用它之前,需要很好地理解这个运算符。

推荐文章

这是C++ typeid用法指南。在这里,我们将讨论TypeID在C++中的工作方式,以及代码和输出的示例。您还可以查看以下文章以了解更多信息–


慕源网 » C++ typeid用法 21

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录