1. typeid 的使用
回顾:sizeof 关键字,用来计算数据类型在内存中的占用的空间的大小
int i= 10;
表达式的结果是整数;
typeid 关键字,用来获取数据类型的名字 //添加头文件#include<typeinfo>
typeid(int) = typeid(i) 结果是一样的
返回值是typeinfo类型的对象,在该对象上调用成员函数name()获取类型的名字,返回值类型是C风格的字符串类型
typeinfo 类型的对象支持判断运算符(==)
注意:
只有在具有多态关系的父子类之间,才能通过typeid正确的判断一个指针实际指向的对象类型
2. dynamic_cast 的使用
格式:目标类型 变量名 = dynamic_cast<目标类型>(源类型);
功能:
一般用于在具有多态继承关系的父子类之间,主要用于父类到子类的转换
static_cast 在源类型和目标类型之间只要有一个方向可以发生隐式类型转换,那么在两个方向上都可以做静态类型转换,
反之,如果在两个方向上都不能做隐式类型转换,那么在两个方向上都不能做静态类型转换
const_cast 用于去除指针/引用 上面的常属性
reinterpret_cast 用于任意指针类型之间的转换,以及指针和整型之间的转换
3. 异常
3.1 异常的语法格式
(1)异常的捕获try
{
可能引发异常的语句;(比如函数的调用)
}
catch(异常类型 变量名)
{
异常处理语句;
}
catch(异常类型2 变量名2)
{
异常处理语句;
}.........
catch(...)
{
异常处理语句;
}
(2)异常抛出
throw 异常类型;
3.2 异常的基本用法
(1)抛出简单类型变量,使用异常变量的值来区分不同的异常(比如 int类型)(2)抛出类类型对象,那么通过异常类型来区分不同的异常(如自定义不同的异常类)
(3)从标准异常类继承
exception 是标准异常类的基类
/usr/include/c++/4.6/exception 文件中
virtual/*虚函数 */ const char*/*返回值类型*/what() const/*常函数*/throw()/*异常说明,表示不抛出任何异常*/;
(4)继续抛出异常
a.发生异常之后可以不处理,继续向上抛
b.只能处理一部分,处理完毕之后继续throw
如:
try
{
//
}
catch(exception& ex)
{
//throw ex;
//....
throw ex;
}
(5)异常说明
返回值类型 函数名(形参表) throw(异常类型1,异常类型2,....){}
告诉编译器可能会抛出的异常