问题:
1,定义异常类的过程中,什么时候使用异常类的析构函数,什么时候使用异常类的构造函数?
2,在try catch 中,为什么有时候用到的是catch(exception &e),而有时候用到的时catch(exception e),这两个有什么区别?什么时候用到?
为此专门写了以下一段代码,帮助理解:
测试结果:
解释说明:
首先,在第一个try catch 中throw显示的创建一个异常对象并抛出,程序执行顺序为:异常类的默认构造函数->捕获异常,处理->析构函数。
然而,在第二个try catch 中,函数的调用顺序就比较复杂了。调用顺序如下:
1,首先在函数g()中声明了异常类,调用默认构造函数。
2,抛出异常类,此时会创建一个异常类的副本,调用拷贝构造函数。
3,抛出异常时,函数g()会退出,此时调用析构函数,析构掉之前创建的局部对象。
4,catch(Excp e)捕获异常时,使用的是对象声明,再次拷贝一个副本,调用构造函数。
5,catch(Excp e)中,处理异常。
6,副本和原始对象被析构,调用两次析构函数。
总而言之,整个调用过程还是比较复杂的。