C++ primer 17章读书总结

C++异常处理:

thow抛出异常,抛出对象的类型决定应该激活哪个处理代码。被选中的处理代码是调用链中与该对象匹配并且离抛出异常位置最近的那个。

 

try{

}catch(runtime_error &e)

{

  cerr<<e.what<<””

}

注意点:异常以类似于将实参传递给函数的方式抛出与捕获  异常对象通过复制被抛出表达式的结果创建,该结果必须是可以复制的。意味着异常对象必须是可以复制的

 

throw后面的语句不会执行

局部存储不会再存在;(RAII 实现堆内存的释放)

 

因为;在处理异常对象的时候回释放局部存储,所以被抛出的对象不能再局部存储,而是用throw表达式初始化一个异常对象的特殊对象,异常对象由编译器管理,而且可以被可能激活的catch语句访问。这个对象又throw创建,并且被初始化为被抛出的表达式的副本。

 

无论对象的实际类型是什么,异常对象的类型都与指针的静态类型相匹配。如果该指针是一个指向派生类的基类类型指针,则那个对象将被分割

 

析构函数应该从不抛出异常:在为某个异常进行栈展开的时候,析构函数如果又抛出自己的未经处理的另一个异常的话,将会导致调用标准库的terminate函数。强制从整个程序非正常退出。

析构函数通常用于释放资源

 

catch的说明的类型决定了处理代码能够捕获的异常的种类。类型必须是完整的类型,不能是前向声明

 

在查找匹配的catch期间,找到catch不必是与异常最匹配的那个catch,相反,将选中第一个能够处理该异常的catch,所以最特殊的catch必须最先出现。

 

异常与catch异常说明符的匹配的规则比匹配实参和形参更加的严格,大多数转换都不允许的除下面的几种特殊情况:

1,允许从非const 到const的转变;

2,允许从派生类到基类的转变

3,数组 转换为指向数组类型的指针,函数转换为函数指针;

 

其余的异常与catch说明符的类型必须完全匹配;

 

 

重新抛出:

 

单个catch不能够完全处理一个异常,

throw 只能够出现在catch 或catch调用的函数中,若果在处理代码不活动的时候碰到空throw会直接terminate;

 

函数测试块与构造函数:

template<class T>  Handle<T>::Handle(T*p)

try:ptr(p),use(new size_t(1))

{

}catch(const std::bad-alloc &e)

{

handle_out_of_memory(e);

}

 

 

异常类层次:

class exception

{

virtual const char*what();

}

 

namespace:

 

using directive:  using namespace

 

 

重载与命名空间,argument lookup

 

 

argument lookup:

getline(std::cin,s);

 

 

隐式友元声明与命名空间

 

嵌套namespace

 

匿名namespace

 

namespace别名:

namespace primer = cplusplus_primer

 

多重继承:二义问题;

virtual 继承: 虚基类的初始化又最底层的类复制,虚基类第一个开始初始化;






你可能感兴趣的:(C++ primer 17章读书总结)