异常处理中的构造和析构
本人节选自《21天学通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++中异常处理中的构造和析构相关推荐

  1. java中异常处理中的异常匹配

    先贴上代码: class Annoyance extends Exception{} class Sneeze extends Annoyance{} public  class test { pub ...

  2. 内核中的对象操作的方法模块 和 C++ 构造和析构的对比

    1.内核中有很多的模块儿,就是module,但是后来我发现和C++的class中的 构造和析构完全一样,首先都需要init,然后都exit 退出之后都做些什么事情 2. 在不做内核编程的情况下,在应用 ...

  3. C++对象模型8——构造函数和析构函数中对虚函数的调用、全局对象构造和析构、局部static数组的内存分配

    一.构造函数和析构函数中对虚函数的调用 仍然以https://blog.csdn.net/Master_Cui/article/details/109957302中的代码为例 base3构造函数和析构 ...

  4. 条款9:不要在构造和析构过程中调用virtual函数

    如下是一个股票交易的例子: 1 class Transaction // 交易的基类 2 { 3 public: 4 Transaction(); 5 virtual void logTransact ...

  5. C++绝不在构造和析构过程中调用virtual函数

    绝不在构造和析构过程中调用virtual函数 如果希望在继承体系中根据类型在构建对象时表现出不同行为,可以会想到在基类的构造函数中调用一个虚函数: class Transaction { //所有交易 ...

  6. C++继承中构造和析构顺序

    C++继承中构造和析构顺序 继承中构造和析构顺序 问题:父类和子类的构造和析构顺序是谁先谁后? 示例 继承中构造和析构顺序 子类继承父类后,当创建子类对象,也会调用父类的构造函数 问题:父类和子类的构 ...

  7. c++继承中的构造和析构

    c++继承中的构造和析构 类型兼容性原则 类型兼容规则中所指的替代包括以下情况: 继承中的对象模型 继承中构造和析构 继承中的构造析构调用原则 继承与组合混搭情况下,构造和析构调用原则 继承中的同名成 ...

  8. 关于构造与析构过程中调用虚函数的问题

    今天面试碰到一个构造函数与析构函数中调用需虚函数的问题,当时不太确定,回来敲了一下,发现确实表现的不一样,在网上一查发现另有玄机. 代码: # gcc version 4.8.2 (Ubuntu 4. ...

  9. (转)剖析Delphi中的构造和析构

    剖析Delphi中的构造和析构 1 Delphi中的对象模型: 2 1.1 对象名表示什么? 2 1.2 对象存储在哪里? 2 1.3 对象中存储了什么?它们是如何存储的? 3 2 构造函数与创建对象 ...

  10. 【C++深度剖析教程25】继承中的构造与析构

    今天来学习C++中继承的构造与析构,有兴趣一起学习的加qq:1126137994 1.问题 如何初始化父类成员?父类构造函数与子类构造函数有什么关系? 子类对象是如何构造的? 子类中可以定义构造函数 ...

最新文章

  1. 【智能驾驶】自动驾驶深度感知技术对车和行人的检测
  2. Boost:序列化之text_iarchive和text_oarchive
  3. 高度有用的Java ChronoUnit枚举
  4. HTML5标签用法及描述
  5. 160 - 44 defiler.1.exe
  6. [ES6] 细化ES6之 -- 迭代器与生成器
  7. 用一道面试题考察对闭包的理解
  8. iOS开发中的火星坐标系及各种坐标系转换算法
  9. 手把手教你用jmeter做压力测试(详图)
  10. 张晨北京科技大学计算机,北京大学2010拟初取推荐免试研究生公示名单.doc
  11. 计算机粘贴功能不能用了,电脑不能粘贴怎么回事_电脑不能粘贴了怎么解决
  12. BZOJ3162: 独钓寒江雪
  13. 瑞萨e2studio(1)----瑞萨芯片之搭建FSP环境
  14. ALGO-986 藏匿的刺客 C++
  15. 硬件产品经理 硬件职业理解 第二弹
  16. 2022-12-03:部门工资最高的员工。以下数据Max 和 Jim 在 IT 部门的工资都是最高的,Henry 在销售部的工资最高。sql语句如何写? 输出结果如下: department emp
  17. 独家 | 离开百度后,王劲创办的景驰将于2020年6月量产自动驾驶汽车
  18. win8(四)实例讲解win8(XAML+C#)开发--------课程表:Snapped模式和动态磁贴,徽章(badge)
  19. 推荐一些常用的中外学术文献数据库网站
  20. 开启西门子1500PLC的OPCUA服务

热门文章

  1. c++ builder 改变状态栏字体颜色等样式
  2. ppt使用记录之添加带圈的20以内的数字编号
  3. net 进阶学习 WebApi (2)
  4. OC 类的load方法
  5. ubuntu 16.04 和win10双系统ubuntu无法更新问题解决
  6. Java Spring boot 企业微信点餐系统
  7. java grpc简单例子
  8. Ubantu16.04LTS麒麟版:取消登录界面的客人回话
  9. day_log 12月份的
  10. win 10 系统怎么显示隐藏文件