C++学习日记——typeid()关键字

老廖
2021-04-13 / 30 评论 / 195 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年04月13日,已超过237天没有更新,若内容或图片失效,请留言反馈。

用以返回一个变量或数据类型的“类型”。
typeid()关键字返回对应参数的类型信息,类型信息用type_info类对象存储:
在这里首先先了解一下type_info
type_info类提供了public虚 析构函数,以使用户能够用其作为基类。它的默认构造函数和拷贝构造函数及赋值操作符都定义为private,所以不能定义或复制type_info类型的对象。程序中创建type_info对象的唯一方法是使用typeid操作符(由此可见,如果把typeid看作函数的话,其应该是type_info的 友元)。type_info的name成员函数返回C-style的字符串,用来表示相应的类型名,但务必注意这个返回的类型名与程序中使用的相应类型名并不一定一致(往往如此,见后面的程序),这具体由编译器的实现所决定的,标准只要求实现为每个类型返回唯一的字符串。
SO C++标准并没有确切定义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重载了操作符==, !=, =分别用来比较是否相等、不等、赋值。
函数name()返回类型名称

class type_info {
public:
  virtual ~type_info();
  booloperator== (consttype_info& rhs) const;///运算符重载==//
  booloperator!= (consttype_info& rhs) const;///运算符重载!=///
  boolbefore (consttype_info& rhs) const;
  constchar* name() const;
private:
  type_info (consttype_info& rhs);
  type_info& operator= (consttype_info& rhs);///运算符重载=//
};
typeid是操作符,不是函数。这点与sizeof类似)
用法如下:typeid(xxx).name() 返回的是对应的类型
cout<<typeid(int).name()<<endl;
int a;
cout<<typeid(a).name()<<endl;

————————————————

输出如下:
int
int

如果有类A,且有虚函数,类B,C,D都是从类A派生的,且都重定义了类A中的虚函数,这时有类A的指针p,再把对象类B的对象的地址赋给指针p,则typeid(p).name()将返回的类型将是A, 因为这里的p表示的是一个指针, 该指针是类型为A的指针, 所以返回A, 而typeid(p).name()将返回B,因为指针p是指向类B的对象的,而p就表示的是类B的对象的类型,所以返回B。

比如有类 A,其中定义有虚函数,而类B,C,D都是从类A派生而来的且重定义了该虚函数,这时有个类A的指针p和p1,按照虚函数的原理,基类的指针可以指向任何派生类的对象,在这时就有可能需要比较两个指针是否指向同一个对象,这时就可以这样使用typeid了,typeid(p)= =typeid(p1);这里要注意的是typeid(p)与typeid(p)是指的不同的对象类型,typeid(p)表示的是p的类型,在这里p是一个指针,这个指针指向的是类A的对象,所以p的类型是A, 而typeid(p)则不一样, p表示的是指针p实际所指的对象的类型, 比如这里的指针p指向派生类B,则typeid(p)的类型为B。所以在测试两个指针的类型是否是相等时应使用p,即typeid(p)= =typeid(p1)。如果是typeid(p)= =typeid(p1)的话,则无论指针p和p1指向的什么派生类对象,他们都是相等的,因为都是A *的类型。


类型的比较:
int a;
double b;
char * c;
long 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的错误(warning C4541: 'typeid' used on polymorphic type 'class A' with /GR-; unpredictable behavior may result):

解决方法:在vc6中. Project - settings... - C/C++ ,在Category那里选 C++ Language,再在下边勾上 Enable Run-Time Type Information[RTTI]。这样再运行程序的时候就不会有错误了。

RTTI(运行时类型信息)会带来额外的开销,大部分编译器都支持RTTI,但在默认情况下关闭此功能,需要用上面的方法打开RTTI开关。

 
————————————————
参考
https://blog.csdn.net/goodlixueyong/article/details/6244303

https://www.cnblogs.com/visayafan/archive/2011/11/29/2268135.html

0

评论 (30)

取消
  1. 头像
    vieviesee
    Windows 10 · Google Chrome

    http://prednisonebuyon.com/ - prednisolone acetate ophthalmic

    回复
  2. 头像
    unfomeons
    Windows 7 · Google Chrome

    gabapentin warnings

    回复
  3. 头像
    Fraurry
    Windows 10 · Google Chrome

    http://buyneurontine.com/ - gabapentin anxiety

    回复
  4. 头像
    prednisone 5mg
    Windows 7 · Google Chrome

    mejor viagra natural

    回复
  5. 头像
    sefiave
    Windows 10 · Google Chrome

    prednisolone drops

    回复
  6. 头像
    Neurontine
    Windows 10 · Google Chrome

    Vente Viagra A Nice

    回复
  7. 头像
    Phigreeli
    Windows 10 · Google Chrome

    https://buypriligyhop.com/ - priligy near me

    回复
  8. 头像
    jimdofreeKab
    Windows 10 · Google Chrome

    We spent a lot of time at her home. Maybe so her mother could keep an eye on us. Mrs. Spencer made sure to be around, offering drinks, snacks, chit chat. I noticed that she was fairly young herself. Granted at my age, anyone over 25 was old, but she was probably mid-30s, divorced. If she was a indiction of how Carley would develop, maybe I should wait. Mrs. Spencer had fuller breasts and a nice butt. She appeared to be in great shape for her "advanced" age. I knew she was keeping an eye on me as much as I was on her and her younger daughter. Her eldest, Sharon was away at college at the time. With Mrs. Spencer around we mostly limited ourselves to holding hands and sneaking in a few light kisses. One day Mrs. Spencer caught us by surprise walking in as I'd slid my hand up from Carley's stomach to rub her right breast through her shirt. She didn't really need a bra yet, so I could feel her nipple, hard, through her shirt. Just this much contact had me hard also.

    https://sites.google.com/view/L9P0g5wPy5rZlkW4 https://sites.google.com/view/cbXY54Jsf8UZDMs6

    回复
  9. 头像
    plaquenil uses
    Windows 10 · Google Chrome

    Cialis Avec Ou Sans Ordonnance

    回复
  10. 头像
    Bruinee
    Windows 10 · Google Chrome

    lasix for dogs side effects

    回复
  11. 头像
    Prahdeeds
    Windows 10 · Google Chrome

    http://buyzithromaxinf.com/ - zithromax 250mg singapore

    回复
  12. 头像
    CeaxVally
    Windows 7 · Google Chrome

    https://buylasixshop.com/ - Lasix

    回复
  13. 头像
    nestionna
    Windows 10 · Google Chrome

    half life of plaquenil

    回复
  14. 头像
    priligy dapoxetina 30mg nos eua
    Windows 8.1 · Google Chrome

    para que sirve el medicamento cialis

    回复
  15. 头像
    Zithromax
    Windows 10 · Google Chrome

    Propecia Increased Libido

    回复
  16. 头像
    AgrItow
    Windows 8.1 · Google Chrome

    Zithromax

    回复
  17. 头像
    Lasix
    Windows 10 · Google Chrome

    Viagra In Pomata

    回复
  18. 头像
    Snopism
    Windows 10 · Google Chrome

    Priligy

    回复
  19. 头像
    unodemn
    Windows 10 · Google Chrome

    http://buystromectolon.com/ - Stromectol

    回复
  20. 头像
    Cialis
    Windows 10 · Google Chrome

    Comprar Viagra Cialis Madrid

    回复
  21. 头像
    FlierlY
    Windows 10 · Google Chrome

    https://buytadalafshop.com/ - Cialis

    回复
  22. 头像
    Zortabs
    Windows 10 · Google Chrome

    https://buypropeciaon.com/ - Propecia

    回复
  23. 头像
    admique
    Windows 10 · Google Chrome

    buying cheap cialis online

    回复
  24. 头像
    Propecia
    Windows 7 · Google Chrome

    cialis original vente

    回复
  25. 头像
    ivermectin pour on
    Windows 10 · Google Chrome

    Cialis 5mg Comprime

    回复
  26. 头像
    Edipuct
    Windows 7 · Google Chrome

    Propecia

    回复
  27. 头像
    AlCorruff
    Windows 7 · Google Chrome

    generic viagra overnight

    回复
  28. 头像
    Chusiabuh
    Windows 10 · Google Chrome

    https://buysildenshop.com/ - Viagra

    回复
  29. 头像
    viagra gold online
    Windows 10 · Google Chrome

    Cheap Online Levitra

    回复
  30. 头像
    Punteetry
    Windows 10 · Google Chrome

    Stromectol

    回复