C++面向对象入门(五十一)异常处理中的构造和析构
作者:互联网
C++异常处理的真正能力不仅在于它可以处理各种不同类型的异常, 也在于它可以具有为异常对象抛出前try内构造的所有局部对象
调用析构函数的能力 在程序中, 找到一个匹配的catch异常处理后, 如果catch子句的异常类型声明是一个值参数, 则其初始化方式是复制被抛掷的异常对象,
如果catch子句的异常类型声明是一个引用类型, 其初始化方式是使该引用指向异常对象 catch子句的异常类型声明参数被初始化后, 栈的展开过程便开始了, 这包括将对应try块开始到异常被抛掷处间的构造(且尚未析构)的
所有自动对象进行析构. 析构顺序与构造顺序正好相反, 然后程序从最后一个catch块之后开始恢复执行 代码示例:
调用析构函数的能力 在程序中, 找到一个匹配的catch异常处理后, 如果catch子句的异常类型声明是一个值参数, 则其初始化方式是复制被抛掷的异常对象,
如果catch子句的异常类型声明是一个引用类型, 其初始化方式是使该引用指向异常对象 catch子句的异常类型声明参数被初始化后, 栈的展开过程便开始了, 这包括将对应try块开始到异常被抛掷处间的构造(且尚未析构)的
所有自动对象进行析构. 析构顺序与构造顺序正好相反, 然后程序从最后一个catch块之后开始恢复执行 代码示例:
#include <iostream> #include <fstream> #include <string> using namespace std; /* C++异常处理的真正能力不仅在于它可以处理各种不同类型的异常, 也在于它可以具有为异常对象抛出前try内构造的所有局部对象 调用析构函数的能力 在程序中, 找到一个匹配的catch异常处理后, 如果catch子句的异常类型声明是一个值参数, 则其初始化方式是复制被抛掷的异常对象, 如果catch子句的异常类型声明是一个引用类型, 其初始化方式是使该引用指向异常对象 catch子句的异常类型声明参数被初始化后, 栈的展开过程便开始了, 这包括将对应try块开始到异常被抛掷处间的构造(且尚未析构)的 所有自动对象进行析构. 析构顺序与构造顺序正好相反, 然后程序从最后一个catch块之后开始恢复执行 */ class A71 { public: ~A71() { ofstream log_no71("log_No71.txt", ios::app); log_no71 << "~A71" << endl; log_no71.close(); } }; class B71 { public: ~B71() { ofstream log_no71("log_No71.txt", ios::app); log_no71 << "~B71" << endl; log_no71.close(); } }; class C71 { public: ~C71() { ofstream log_no71("log_No71.txt", ios::app); log_no71 << "~C71" << endl; log_no71.close(); } }; class D71 { public: ~D71() { ofstream log_no71("log_No71.txt", ios::app); log_no71 << "~D71" << endl; log_no71.close(); } }; ofstream log_no71("log_No71.txt", ios::app); int main() { A71 a; try { B71 b1; B71 b2; C71 c1; C71 c2; C71 c3; D71 d1; D71 d2; D71 d3; D71 d4; throw double(1); } catch (...) { log_no71 << "catch and handle a exception." << endl; } log_no71.close(); return 0; }
标签:初始化,对象,C++,五十一,析构,子句,catch,和析构,异常 来源: https://www.cnblogs.com/RGBTH/p/13642114.html