C++中异常处理中的构造和析构
当在程序中找到一个匹配的catch异常处理后,如果catch()语句的异常类型声明是一个值参数,则其初始化方式是复制被抛弃的异常对象;如果catch()语句的异常类型声明是一个引用,则其初始化方式是使该引用指向异常对象。
【范例20-4】使用带析构的类的异常处理。该范例包含类及其构造函数与析构函数,其进行异常处理时析构函数的调用会有所不同,代码如代码清单20-4所示。
代码清单20-4
1 #include<iostream.h>
2 class expt //定义类expt
3 {
4 public: //定义公有成员
5 expt() //定义构造函数
6 {
7 cout<<"structor of expt"<<endl;
8 }
9 ~ expt() //定义析构函数
10 {
11 cout<<"destructor of expt"<<endl;
12 }
13 };
14 class demo //定义类demo
15 {
16 public:
17 demo() //定义构造函数
18 {
19 cout<<"structor of demo"<<endl;
20 }
21 ~demo() //定义析构函数
22 {
23 cout<<"destructor of demo"<<endl;
24 }
25 };
26 void fuc1() //定义函数
27 {
28 int s=0;
29 demo d; //声明demo类的对象
30 throw s; //抛出异常
31 }
32 void fuc2()
33 {
34 expt e; //声明expt类的对象
35 fuc1(); //调用函数fuc1
36 }
37 void main()
38 {
39 try //定义异常
40 {
41 fuc2(); //调用函数
42 }
43 catch(int) //定义异常处理
44 {
45 cout<<"catch int exception"<<endl;
46 }
47 cout<<"continue main()"<<endl;
48 }
【运行结果】在Visual C++中新建一个【C++ Source File】文件,输入上述的代码,编译无误后运行。
【范例解析】上述代码中定义了两个类expt和demo,在函数fuc2()中创建了expt的对象e,在函数fuc1()中创建了demo的对象d,并抛出异常。在主函数main()中,使用try/catch语句捕获并处理异常。从运行结果可以看出,在抛弃异常前,创建了两个对象e和d,在抛弃异常后,这两个对象被按与创建的相反顺序调用析构函数销毁。
注意:当catch()语句的异常类型参数被初始化后,便开始了栈的展开过程,包括从对应的try语句块开始到异常被抛弃之间对构造的所有自动对象进行析构。析构的顺序与构造的顺序相反。然后程序从最后一个catch处理之后开始恢复。
C++中异常处理中的构造和析构相关推荐
- java中异常处理中的异常匹配
先贴上代码: class Annoyance extends Exception{} class Sneeze extends Annoyance{} public class test { pub ...
- 内核中的对象操作的方法模块 和 C++ 构造和析构的对比
1.内核中有很多的模块儿,就是module,但是后来我发现和C++的class中的 构造和析构完全一样,首先都需要init,然后都exit 退出之后都做些什么事情 2. 在不做内核编程的情况下,在应用 ...
- C++对象模型8——构造函数和析构函数中对虚函数的调用、全局对象构造和析构、局部static数组的内存分配
一.构造函数和析构函数中对虚函数的调用 仍然以https://blog.csdn.net/Master_Cui/article/details/109957302中的代码为例 base3构造函数和析构 ...
- 条款9:不要在构造和析构过程中调用virtual函数
如下是一个股票交易的例子: 1 class Transaction // 交易的基类 2 { 3 public: 4 Transaction(); 5 virtual void logTransact ...
- C++绝不在构造和析构过程中调用virtual函数
绝不在构造和析构过程中调用virtual函数 如果希望在继承体系中根据类型在构建对象时表现出不同行为,可以会想到在基类的构造函数中调用一个虚函数: class Transaction { //所有交易 ...
- C++继承中构造和析构顺序
C++继承中构造和析构顺序 继承中构造和析构顺序 问题:父类和子类的构造和析构顺序是谁先谁后? 示例 继承中构造和析构顺序 子类继承父类后,当创建子类对象,也会调用父类的构造函数 问题:父类和子类的构 ...
- c++继承中的构造和析构
c++继承中的构造和析构 类型兼容性原则 类型兼容规则中所指的替代包括以下情况: 继承中的对象模型 继承中构造和析构 继承中的构造析构调用原则 继承与组合混搭情况下,构造和析构调用原则 继承中的同名成 ...
- 关于构造与析构过程中调用虚函数的问题
今天面试碰到一个构造函数与析构函数中调用需虚函数的问题,当时不太确定,回来敲了一下,发现确实表现的不一样,在网上一查发现另有玄机. 代码: # gcc version 4.8.2 (Ubuntu 4. ...
- (转)剖析Delphi中的构造和析构
剖析Delphi中的构造和析构 1 Delphi中的对象模型: 2 1.1 对象名表示什么? 2 1.2 对象存储在哪里? 2 1.3 对象中存储了什么?它们是如何存储的? 3 2 构造函数与创建对象 ...
- 【C++深度剖析教程25】继承中的构造与析构
今天来学习C++中继承的构造与析构,有兴趣一起学习的加qq:1126137994 1.问题 如何初始化父类成员?父类构造函数与子类构造函数有什么关系? 子类对象是如何构造的? 子类中可以定义构造函数 ...
最新文章
- 【智能驾驶】自动驾驶深度感知技术对车和行人的检测
- Boost:序列化之text_iarchive和text_oarchive
- 高度有用的Java ChronoUnit枚举
- HTML5标签用法及描述
- 160 - 44 defiler.1.exe
- [ES6] 细化ES6之 -- 迭代器与生成器
- 用一道面试题考察对闭包的理解
- iOS开发中的火星坐标系及各种坐标系转换算法
- 手把手教你用jmeter做压力测试(详图)
- 张晨北京科技大学计算机,北京大学2010拟初取推荐免试研究生公示名单.doc
- 计算机粘贴功能不能用了,电脑不能粘贴怎么回事_电脑不能粘贴了怎么解决
- BZOJ3162: 独钓寒江雪
- 瑞萨e2studio(1)----瑞萨芯片之搭建FSP环境
- ALGO-986 藏匿的刺客 C++
- 硬件产品经理 硬件职业理解 第二弹
- 2022-12-03:部门工资最高的员工。以下数据Max 和 Jim 在 IT 部门的工资都是最高的,Henry 在销售部的工资最高。sql语句如何写? 输出结果如下: department emp
- 独家 | 离开百度后,王劲创办的景驰将于2020年6月量产自动驾驶汽车
- win8(四)实例讲解win8(XAML+C#)开发--------课程表:Snapped模式和动态磁贴,徽章(badge)
- 推荐一些常用的中外学术文献数据库网站
- 开启西门子1500PLC的OPCUA服务