异常处理中的构造和析构
本人节选自《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#的异常处理机制中,抛掷和捕获对象的构造和析构问题,分析在异常处理中内存资源的管理策略。
15,构造函数和析构函数 16,转换 17,类对象数组 18,类成员 19,友元 20,类和堆 21,重载运算符 22,类库 23,类的继承 24,多重继承 25,类模板 第三部分 使用类 26,标准C库函数 27,标准C++库 28,格式化...
7.3 派生类的构造和析构函数 7.4 派生类成员的标识与访问 7.5 赋值兼容规则 7.6程序实例——用高斯消去法解线性方程组 7.7 程序实例——一个小型公司的人员信息管理系统 7.8 小结 习题 第8章 多态性 8.1 多态性概述 ...
C 是一种简单的语言。它真正提供的只有有宏...重载、缺省参数、构造和析构函数、自定义操作符、内联函数、引用、友元、 模板、异常、名字空间,等等。用C++比用C 具有更宽广的空间,因为设计时 有更多的选择可以考虑。
15,构造函数和析构函数 16,转换 17,类对象数组 18,类成员 19,友元 20,类和堆 21,重载运算符 22,类库 23,类的继承 24,多重继承 25,类模板 第三部分 使用类 26,标准C库函数 27,标准C++库 28,格式化...
15,构造函数和析构函数 16,转换 17,类对象数组 18,类成员 19,友元 20,类和堆 21,重载运算符 22,类库 23,类的继承 24,多重继承 25,类模板 第三部分 使用类 26,标准C库函数 27,标准C++库 28,格式化...
本书实际上涵盖了 C++ 程序设计的每一个方面,包括:设计和编码风格、函数、操作符、类的设计、继承、构造与析构、赋值、名字空间、模块、模板、泛型、异常、 STL 容器和算法等等。书中对每一条规范都给出了...
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重载的例子 ...
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 ...
15,构造函数和析构函数 16,转换 17,类对象数组 18,类成员 19,友元 20,类和堆 21,重载运算符 22,类库 23,类的继承 24,多重继承 25,类模板 第三部分 使用类 26,标准C库函数 27,标准C++库 28,格式化...
对每个人来说,习惯 C++需要一些时间,...重载、缺省参数、构造和析构函数、自定义操作符、内联函数、引用、友元、 模板、异常、名字空间,等等。用 C++比用 C 具有更宽广的空间,因为设计时 有更多的选择可以考虑。
内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚函数、模板和包容器...
本书涵盖了C++程序设计的每一个方面,包括设计和编码风格、函数、操作符、类的设计、继承、构造与析构、赋值、名字空间、模块、模板、泛型、异常、STL容器和算法等。书中对每一条规范都给出了言简意赅的概述,并...
3.11 在构造函数和析构函数中抛出异常会发生什么?什么是栈展开? 3.12 两种常用的实现隐式类类型转换的方式是什么?如何避免隐式类 型转换?3.13 STL中的vector:增减元素对迭代器的影响 3.14 STL中排序算法的实现 ...
鸡啄米:C++编程入门系列之十四(类与对象:构造函数和析构函数) 鸡啄米:C++编程入门系列之十五(类与对象:类的组合) 鸡啄米:C++编程入门系列之十六(类与对象:类模板) 鸡啄米:C++编程入门系列之十七...
内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚函数、模板和包容器...
28.15章 派生类的构造函数和析构函数 29.15章 转换与继承 30.15章 友元与继承 31.15章 静态成员与继承 32.15章 纯虚函数与抽象类 33.16章 模板与泛型编程 34.16章 类模板 - 顺序队列 35.16章 类模板 ...
本书实际上涵盖了 C++ 程序设计的每一个方面,包括:设计和编码风格、函数、操作符、类的设计、继承、构造与析构、赋值、名字空间、模块、模板、泛型、异常、 STL 容器和算法等等。书中对每一条规范都给出了言简意赅...
条款09:绝不在构造和析构过程中调用Virtual函数 条款10:令Operator=返回一个referenceto this 条款11:在Operator=中处理“自我赋值” 条款12:复制对象时勿忘其每一个成分 3.资源管理 条款13:以对象管理...