Chinaunix首页 | 论坛 | 博客
  • 博客访问: 363829
  • 博文数量: 102
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 1116
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-29 16:21
文章分类

全部博文(102)

文章存档

2014年(10)

2011年(1)

2008年(2)

2007年(89)

我的朋友

分类: C/C++

2007-09-16 23:27:15

异常处理

  语法:

       Try{}

         Catch()

         {}

 在函数声明时需要声明该函数可能抛出什么异常,如

   void hello() throw(a,b,c)表明可以抛出abc类异常;

   void f()表明可以抛出任意异常;

   void f() throw()意味着不会抛出异常。

如果实际抛出的异常与我们声明的规格不一致时,需要调用特殊函数unexpected()。使用EXCEPT.H中的set_unexpeted()函数来声明我们自定义处理值,这个函数返回先前的值,我们可以用它来恢复原来的设置。Unexpected指针非空,缺省指向terminated函数。它类似于内存分配错误时的处理函数set_new_handle

  catch列表中用省略号可以捕获所有异常。重新抛出异常使用不带参数的throw。若任一异常未被捕获,调用terminate终止函数,缺省指向abort。例:析构函数中含有异常抛出或引起异常抛出均为错误。不能在析构函数中抛出异常,否则会导致一些对象无法释放。

 

运行时类型识别RTTI

1   typeid()返回一个typeinfo对象,也可以用于内部类型,当用于非多类时,没有虚函数,用typeid返回的将是基类地址;

2   动态映射dynamic_cast<类型>(变量)

可以映射到中间级,将派生类映射到任何一个基类,然后在基类之间可以相互映射。

3   不能对void指针进行映射;

4   Typeid(*p)返回派生类类型;typeid(P)返回基类指针类型;p是指针

Typeid(r)返回派生类类型;typeid(&r)返回基类类型。r是引用;

5)         典型的RTTI是通过在VTABLE中放一个额外的指针实现的。每个新类只产生一个typeinfo实例,额外指针指向typeinfotypeid返回对它的一个引用;

6)         动态映射dynamic_cast<目标*><源指针>

先恢复源指针的RTTI信息,再取目标的RTTI信息,比较两者是否相同,或者是目标类型的基类;由于它需要检查一长串基类列表,故动态映射的开销比typeid大;

7)四种映射语法:

     Static_cast 用于所有良定义转换;

     Const_cast 用于映射常量和变量;

     Dynamic_cast为了安全类型的向下映射;

     Reinterpret_cast 不太安全的机制,它假定对象是一个比特模式,可以被当作完全不同的对象对待;

 

自动类型转换

   对自定义类的转换如:

Class A;

Class B{

  Public:

    Operate  A{}

};

 

 

 

阅读(1298) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~