C++ 笔记11 | 运行时的类型信息

本文介绍了C++的运行时类型信息,包括typeid操作符和dynamic_cast操作符的使用。接着深入探讨了C++异常机制,从软件开发中的错误类型到C语言的错误处理方式,再到C++的异常抛出、检测和捕获,以及标准异常类exception。最后,简单提及了构造函数和析构函数中的异常处理以及I/O流的相关内容。
摘要由CSDN通过智能技术生成

二十三 运行时的类型信息//了解

1 typeid操作符

#include
typeid(类型/对象);//返回typeinfo对象,用于描述类型信息

#include <iostream>
#include <typeinfo>
using namespace std;
class A{
    virtual void func(){
   } };
class B:public A{
    void func(){
   } };
class C:public A{
    void func(){
   } };
//...

void foo(A& ra){
   
    /* typeinfo支持"==,!="操作符重载,可以直接进行类型之间比较,如果
     * 类型直接具有多态的继承关系,typeid还可以利用多态的语法确定实
     * 际的目标对象类型.*/
    if(typeid(ra) == typeid(B)){
   
        cout << "针对B子类的处理" << endl;
    }
    else if(typeid(ra) == typeid(C)){
   
        cout << "针对C子类的处理" << endl;
    }
}
int main(void){
   
    int i = 0;
    //name():获取字符串形式类型信息
    cout << typeid(int).name() << endl;
    cout << typeid(i).name() << endl;
    
    int *a1[10];
    int (*a2)[10];
    cout << typeid(a1).name() << endl;
    cout << typeid(a2).name() << endl;
    B b;
    foo(b);
    C c;
    foo(c);

    return 0;
}

2 dynamic_cast操作符

语法:
目标变量 = dynamic_cast<目标类型>(源类型变量);
适用场景:
主要用于具有多态特性父子类指针或引用之间的显式类型转换.

#include <iostream>
using namespace std;
class A{
    virtual void func(){
   } };
class B:public A{
    void func(){
   } };
class C:public A{
    void func(){
   } };
int main(void){
   
    B b;
    A* pa = &b;
    //B* pb = static_cast<B*>(pa);//合理
    //C* pc = static_cast<C*>(pa);//不合理
   
    /* 动态类型转换过程中,会检查pa指向的目标对象和期望转换的类型
     * 是否一致,如果一致转换成功,否则失败*/
    B* pb = dynamic_cast<B*>(pa);//ok
    C* pc = dynamic_cast<C*>(pa);//失败(返回NULL)

    cout << "pa=" << pa << endl;
    cout << "pb=" << pb << endl;
    cout << "pc=" << pc << endl;

    A& ra = b;
    C& rc = dynamic_cast<C&>(ra);//失败(抛出异常)
    return 0;
}

二十四 C++异常机制(exception)

1 软件开发中的常见错误

1)语法错误
2)逻辑错误
3)功能错误
4)设计缺陷

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值