zixie1991 / cplusplus-exercise

C++编程练习。。。
8 stars 1 forks source link

C++基本概念 #8

Open zixie1991 opened 7 years ago

zixie1991 commented 7 years ago

C++基本概念

面向对象

闭包

C++ 闭包(closure)

RTTI(运行时类型识别)

C++对象模型之RTTI的实现原理

异常

函数的异常规格

异常规格(exception specification)列出函数可能会抛出的所有异常的类型。异常规格写在函数的形参表之后的关键字throw之后跟着一对圆括号括住的异常类型列表。如:

void foo(int) throw(bad_alloc, invalid_argument)
{
/*函数体*/
}

异常列表还可以为空:

void foo(int) throw();

表示该函数不抛出任何异常。

如果函数内抛出的异常的类型不在该函数的异常规格中,则系统函数unexpected()被调用。如果在unexpected()中抛出的异常出现在该函数的异常规格中,则在该函数被调用处恢复对异常的catch处理。如果在unexpected()中抛出的异常不在该函数的异常规格中,则调用系统函数terminate()以终止程序。

标准异常类中的构造函数、析构函数和what()虚函数都承诺不抛出异常。如what的完整声明为:virtual const char* what() const throw();

派生类中的虚函数不能抛出基类虚函数中没有声明的新异常。

使用函数的异常规格的好处:

抛出一个对象而不是用函数返回值判断是否出错; 函数调用序列中间的函数可以不考虑异常处理,由某一层函数调用扑捉异常; unwinding自动发生。 Microsoft Visual C++接受但暂不支持C++标准中的函数的异常规格。即使使用了编译器选项/D1ESrt,函数抛出不在其异常规格中的其他类型异常时,不会自动调用unexpected(),而是在该函数调用点处的try...catch...处理。在Visual C++的函数名字修饰(name mangling)中,函数的形参的类型都编码入被修饰后的函数名字中;但是函数的异常说明中的类型都没有编码入被修饰后的函数名字中。