catch 子句捕获异常时既可以按值传递,也可以按照引用传递,甚至按照指针传递,但推荐使用引用捕获异常。考察如下程序:

#include <iostream>
using namespace std;class Base {public:Base() {cout << "Base's constructor" << endl;}Base(const Base& rb) {cout << "Base's copy constructor" << endl;}virtual void print() {cout << "Base" << endl;}
};class Derived :public Base {public:Derived() {cout << "Derived's constructor" << endl;}Derived(const Derived& rd):Base(rd) {cout << "Derived's copy constructor" << endl;}virtual void print() {cout << "Derived" << endl;}
};void throwFunc() {Derived d;throw d;
}int main() {try {throwFunc();}catch (Base b) {cout << "Base catched" << endl;b.print();}catch (Derived d) {cout << "Derived catched" << endl;d.print();}cout << "---------------" << endl;try {throwFunc();}catch (Base& b) {cout << "Base catched" << endl;b.print();}catch (Derived& d) {cout << "Derived catched" << endl;d.print();}
}

程序运行结果:

Base's constructor
Derived's constructor
Base's copy constructor
Derived's copy constructor
Base's copy constructor
Base catched
Base
---------------
Base's constructor
Derived's constructor
Base's copy constructor
Derived's copy constructor
Base catched
Derived

阅读以上程序,注意以下几点:
(1)程序中在函数throwFunc()中构造对象d,先后分别调用基类Base和派生类Derived的构造函数完成对象d的初始化,分别输出Base’s constructor与Derived’s constructor;
(2)C++标准要求被作为异常抛出的对象必须被拷贝复制,导致异常对象d在离开作用域时,触发一次临时对象的拷贝构造,程序输出从结果来看,先后调用了基类Base的拷贝构造函数和派生类Derived的拷贝构造函数,分别输出Base’s copy constructor与Derived’s copy constructor;
(3)按引用捕获异常比按值捕获异常更加高效。分隔线以上按值捕获异常,导致对象d在传递时再次被拷贝一次,输出Base’s copy constructor,降低了系统效率,使用引用捕获异常可以避免额外的拷贝操作;
(4)使用引用捕获异常,可以通过基类对象实现虚函数的虚调用,在运行时提现多态性。

基于效率和多态性的考虑,建议使用引用来捕获异常。


参考文献

[1] 陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008.10.5用传引用的方式捕获异常

C++ 使用引用捕获异常相关推荐

  1. VC代码的编写和调试---编写易于调试的VC代码

    转自:http://www.vcgood.com/forum_posts.asp?TID=1692&PN=1 一 程序的设计 要避免错误,首先要从好的设计开始.对于程序的设计,需考虑到程序的两 ...

  2. 好久没有用c++,转一个c++注意点

    一   编程设计      1.将程序划分为多个子系统,包括子系统间的接口和依赖关系.子系统间的数据流.在各子系统间的来回输入输出.以及总的线程模型. 2.各个子系统的具体细节,包括进一步细分的类.类 ...

  3. C++异常以及错误处理

    计算机应用程序中离不开错误处理,尤其是生产型大型软件系统.应用软件系统运行属于循环处理事务,出错后需要保证不能让软件程序直接退出.这就需要使用一定的程序容错处理来应对.一般情况下,大型软件开发中的软件 ...

  4. C++高级编程篇-如何编写高效的C++篇

    为了编写高效的程序,需要在设计层次上做考虑,并在实现层次上考虑细节.(一定要在程序的生命周期已开始就考虑性能). "编写高效的C++程序"指要编写能高效运行的程序,而不是高效地编写 ...

  5. More Effective C++ 笔记

    基础议题 1 当你知道你必须指向一个对象并且不想改变其指向时,或者在   重载操作符并为防止不必要的语义误解时,你不应该使用指针.     1 必须指向对象,不能引用空     2 始终指向相同的内存 ...

  6. More Effective C++ 阅读笔记 解释清晰

    文章目录 3.1 Item M1: 指针与引用的区别 3.2 Item M2:尽量使用C++风格的类型转换 3.3 Item M3:不要对数组使用多态 3.4 Item M4:避免无用的缺省构造函数 ...

  7. More effective C++学习总结

    More effective C++摘要 3 基础议题部分: 3.1 M1:指针与引用的区别 首先,要认识到在任何情况下都不能使用指向空值的引用,引用必须被初始化.一个引用必须总是指向某些对象. (不 ...

  8. [GCC]告警信息梳理

    -Wall,-Wextra开启的告警 -Waddress:可能是无意义的地址使用方式(包括函数地址.变量地址等). void f (int, int, int, bool, int *); void ...

  9. VC代码的编写和调试

    VC代码的编写和调试(转载) VC代码的编写和调试(转载) //========================================== // [转载声明] // 出自: // 作者:   ...

最新文章

  1. 还有多久才能用上2000元以下的5G手机?答案来了
  2. Sublime Text使用教程【转】
  3. Java枚举enum以及应用:枚举实现单例模式
  4. Yarn资源分配示例
  5. LeetCode 1408. 数组中的字符串匹配(暴力查找)
  6. 关于虚拟机linux密码的那点事
  7. 生日快乐程序员的浪漫代码_python告白代码,只属于程序员的浪漫
  8. Python实现感知器的逻辑电路(与门、与非门、或门、异或门)
  9. [leetcode]Next Greater Element
  10. python导入excel模块_python使用openpyxl模块操作excel
  11. Vim 和 NeoVim 曝出高危漏洞
  12. 31.URL 管理(2)
  13. AI2019下载Adobe Illustrator CC2019安装教程
  14. CS5532 HAL库版本工程代码
  15. Photoshop 有什么技巧让你相见恨晚?
  16. spss多因素方差分析
  17. 人体姿态2018(五)Can 3D Pose be Learned from 2D Projections Alone?
  18. Python中 list[:]与 list 的区别
  19. 用循环首次适应算法、最佳适应算法和最坏适应算法,模拟可变分区存储管理,实现对内存区的分配和回收管理
  20. docusign文档打不开_关于salesforce:创建Docusign文档并从其他系统发送电子邮件

热门文章

  1. 只需一条信息即可远程利用严重的思科 Jabber RCE缺陷
  2. 奇安信代码卫士帮助微软修复严重漏洞,获官方致谢和奖金
  3. Oracle CoherenceWebLogic反序列化远程代码执行漏洞安全风险通告
  4. 转:GCC,LLVM,Clang编译器对比
  5. java的poi技术读取Excel[2003-2007,2010]
  6. zypper 工具详解
  7. 在GridView控件FooterTemplate内添加记录 Ver2
  8. shell批量文件编码转换
  9. Python中在脚本中引用其他文件函数的方法
  10. 能打开java文件的软件有哪些_使用JAVA打开本地应用程序相关的文件