`
cloudtech
  • 浏览: 4621496 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

C++中异常处理中的构造和析构

 
阅读更多
异常处理中的构造和析构

本人节选自《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++/C#异常处理机制的内存管理策略

    介绍了c++/C#的异常处理机制中,抛掷和捕获对象的构造和析构问题,分析在异常处理中内存资源的管理策略。

    C++ 大学自学教程 C++ 大学教程 第7版 2

    15,构造函数和析构函数 16,转换 17,类对象数组 18,类成员 19,友元 20,类和堆 21,重载运算符 22,类库 23,类的继承 24,多重继承 25,类模板 第三部分 使用类 26,标准C库函数 27,标准C++库 28,格式化...

    c++语言程序设计(第三版)

    7.3 派生类的构造和析构函数 7.4 派生类成员的标识与访问 7.5 赋值兼容规则 7.6程序实例——用高斯消去法解线性方程组 7.7 程序实例——一个小型公司的人员信息管理系统 7.8 小结 习题 第8章 多态性 8.1 多态性概述 ...

    从C转向C++(中文)

    C 是一种简单的语言。它真正提供的只有有宏...重载、缺省参数、构造和析构函数、自定义操作符、内联函数、引用、友元、 模板、异常、名字空间,等等。用C++比用C 具有更宽广的空间,因为设计时 有更多的选择可以考虑。

    c++大学自学教程 c++大学教程 第七版1

    15,构造函数和析构函数 16,转换 17,类对象数组 18,类成员 19,友元 20,类和堆 21,重载运算符 22,类库 23,类的继承 24,多重继承 25,类模板 第三部分 使用类 26,标准C库函数 27,标准C++库 28,格式化...

    c++大学自学教程 c++大学教程 第七版 4

    15,构造函数和析构函数 16,转换 17,类对象数组 18,类成员 19,友元 20,类和堆 21,重载运算符 22,类库 23,类的继承 24,多重继承 25,类模板 第三部分 使用类 26,标准C库函数 27,标准C++库 28,格式化...

    c++ coding standard 英文版

    本书实际上涵盖了 C++ 程序设计的每一个方面,包括:设计和编码风格、函数、操作符、类的设计、继承、构造与析构、赋值、名字空间、模块、模板、泛型、异常、 STL 容器和算法等等。书中对每一条规范都给出了...

    C++编程思想习题

    4.4含有构造函数和析构函数的stash 4.5含有构造函数和析构函数的stack 4.6集合初始化 4.7缺省构造函数 4.8小结 4.9练习 第5章 函数重载与缺省参数 5.1范围分解 5.1.1用返回值重载 5.1.2安全类型连接 5.2重载的例子 ...

    C++ Primer第四版【中文高清扫描版】.pdf

    15.4.5 构造函数和析构函数中的虚函数 497 15.5 继承情况下的类作用域 497 15.5.1 名字查找在编译时发生 498 15.5.2 名字冲突与继承 498 15.5.3 作用域与成员函数 499 15.5.4 虚函数与作用域 500 15.6 纯虚函数 502 ...

    c++大学自学教程 c++大学教程 第七版 3

    15,构造函数和析构函数 16,转换 17,类对象数组 18,类成员 19,友元 20,类和堆 21,重载运算符 22,类库 23,类的继承 24,多重继承 25,类模板 第三部分 使用类 26,标准C库函数 27,标准C++库 28,格式化...

    从c到c++ EFFECTIVE_C++2E

    对每个人来说,习惯 C++需要一些时间,...重载、缺省参数、构造和析构函数、自定义操作符、内联函数、引用、友元、 模板、异常、名字空间,等等。用 C++比用 C 具有更宽广的空间,因为设计时 有更多的选择可以考虑。

    C++编程思想.pdf

    内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚函数、模板和包容器...

    C++/C编程规范

     本书涵盖了C++程序设计的每一个方面,包括设计和编码风格、函数、操作符、类的设计、继承、构造与析构、赋值、名字空间、模块、模板、泛型、异常、STL容器和算法等。书中对每一条规范都给出了言简意赅的概述,并...

    C_C++问题总结

    3.11 在构造函数和析构函数中抛出异常会发生什么?什么是栈展开? 3.12 两种常用的实现隐式类类型转换的方式是什么?如何避免隐式类 型转换?3.13 STL中的vector:增减元素对迭代器的影响 3.14 STL中排序算法的实现 ...

    鸡啄米:C++编程入门系列

    鸡啄米:C++编程入门系列之十四(类与对象:构造函数和析构函数) 鸡啄米:C++编程入门系列之十五(类与对象:类的组合) 鸡啄米:C++编程入门系列之十六(类与对象:类模板) 鸡啄米:C++编程入门系列之十七...

    C++ 语言 详细教程电子版

    内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚函数、模板和包容器...

    C++Primer视频(高级)下载地址

    28.15章 派生类的构造函数和析构函数 29.15章 转换与继承 30.15章 友元与继承 31.15章 静态成员与继承 32.15章 纯虚函数与抽象类 33.16章 模板与泛型编程 34.16章 类模板 - 顺序队列 35.16章 类模板 ...

    c++ coding standard [英语]

    本书实际上涵盖了 C++ 程序设计的每一个方面,包括:设计和编码风格、函数、操作符、类的设计、继承、构造与析构、赋值、名字空间、模块、模板、泛型、异常、 STL 容器和算法等等。书中对每一条规范都给出了言简意赅...

    Effective C++ 中文版

    条款09:绝不在构造和析构过程中调用Virtual函数 条款10:令Operator=返回一个referenceto this 条款11:在Operator=中处理“自我赋值” 条款12:复制对象时勿忘其每一个成分 3.资源管理 条款13:以对象管理...

Global site tag (gtag.js) - Google Analytics