很少有人知道的c++中的try块函数
c++有一些在现实世界中很少看到的结构。这些结构有着自己的用法,但是要特别小心保守的予以运用。就像是网站 The Old New Thing首页标题上面的说的那样:
“代码通常被读的次数原因超过了被写的次数,所以计划要遵循此道。”
在下面将介绍一些很少有人能够知道的c++构造函数,包括其中的运用场景,语法和陷阱。
运用场景
try函数块的应用场景一般局限于下面几个:
(1)构造函数初始化列表;
(2)基类构造含数据;
(3)析构函数;
语法
对于函数
void f() try { /*...*/ } catch (...) { /*...*/ }
这等价于
void f() { try { /*...*/ } catch (...) { /*...*/ } }
对于构造函数初始化列表
struct A : public B
{
A() try : B(), foo(1), bar(2)
{
// constructor body
}
catch (...)
{
// exceptions from the initializer list are caught here
// but also rethrown after this block (unless the program is aborted)
} private:
Foo foo;
Bar bar;
};
对于析构函数来说,跟正常函数的使用方法是类似的
struct A
{
~A()
try
{
// destructor body
}
catch (...)
{
// exceptions from the destructor are caught here
// but also rethrown after this block (unless the program is aborted)
}
};
陷阱
- 任何在构造函数和析构函数中捕捉的异常,默认情况下都会被重新抛出。这样的话,大多是情况下当捕捉到一个异常的时候,你能够做的事情就是用日志记录,或者是做一些清理工作。不管一个对象因为什么原因而失败了,你都不应该尝试去保存它的实例。
- 在函数catch块中的return语句表现的跟函数中的返回语句一样;
- 但控制流走到catch模块最后的时候,函数将返回。如果没有任何返回语句而且函数返回类型是非void的,那么行为将会是不确定的。
- try块函数主要有一些非直观的行为:
- 从命名空间范围内定义的构造函数中抛出的异常无法捕捉。
- 从static变量中获取的析构函数的对象中抛出的异常无法捕捉。
如上,try模块函数在进行代码审查的时候至少是应该引起重视的。try块函数使用并非都是错的,在一些上没有提到的用户场景中用到的时候,很容易出现问题。
来源http://szelei.me/rarely-known-cpp-constructs-part-1-function-try-blocks/
很少有人知道的c++中的try块函数的更多相关文章
- 几个超级好用但很少有人知道的 webstorm技巧
我总结一些我发现的比较实用的功能,内容来自日常工作中用到的功能.图片来自PPT,是在公司内部的分享. 你不知道的webstorm进阶使用技巧 1.双击shift 全局搜索,可以搜索代码.设置等. 如果 ...
- 很少人知道的office专用卸载工具
Microsoft Office是微软公司开发的一套基于 Windows 操作系统的办公软件套装.常用组件有 Word.Excel.Powerpoint等.当我们不需要再用了或者想安装旧版本的话,首先 ...
- 几个超级实用但很少人知道的 VS 技巧
大家好,今天分享几个我知道的实用 VS 技巧,而这些技巧我发现很多人都不知道.因为我经常在工作中遇到:我在同事电脑上解决问题,或在会议上演示代码示例时,使用了一些 VS "骚"操作 ...
- 几个超级实用但很少人知道的 VS 技巧[更新]
大家好,今天分享一些实用的 VS 技巧,而这些技巧我发现很多人都不知道.因为我经常在工作中遇到:我在同事电脑上解决问题,或在会议上演示代码示例时,使用了一些 VS "骚"操作,他们 ...
- 12个很少被人知道的CSS事实
之前没有认真的研究过,padding-bottom的值如果是百分比,那么它的实际值是根据父类的宽度来调整的.我还以为是根据这个元素的本身的宽度来定义呢?汗..padding-top/padding-l ...
- 很少有人会告诉你的Android开发基本常识
原文:很少有人会告诉你的Android开发基本常识. 文章介绍了一些关于开发.测试.版本管理.工具使用等方面的知识.
- 记录下一个C++初始化的方式(很少有人这么用,但是却是一个使代码更加简洁的方式)
很多时候,在一个类创建的时候给它初始化,一般呢,99%的人都会这么用: //A.h Class CA { int a; char* p; int getValue(); }; //A.cpp CA:: ...
- 为数不多的人知道的 Kotlin 技巧及解析
文章中没有奇淫技巧,都是一些在实际开发中常用,但很容易被我们忽略的一些常见问题,源于平时的总结,这篇文章主要对这些常见问题进行分析. 这篇文章主要分析一些常见问题的解决方案,如果使用不当会对 性能 和 ...
- 你应该要知道的JS中的this
前言 this 是 JavaScript 中不可不谈的一个知识点,它非常重要但又不容易理解.因为 JavaScript 中的 this 不同于其他语言.不同场景下的 this 指向不同(当函数被调用执 ...
随机推荐
- (2/18)重学Standford_iOS7开发_Xcode_课程笔记
第二课: 1.惰性初始化 -(ObjectType *)example { f(!_example) example =[[ObjectType alloc] init]; return _examp ...
- Java多线程异步调度程序分析(二)
源自:http://blog.sina.com.cn/s/blog_4cc16fc50100c0uh.html public abstract class Result { //抽象的结果类 pu ...
- Android应用源码图书馆管理系统带服务端数据库
本项目是一套基于安卓的图书馆管理系统,包括jsp服务端源码,安卓客户端源码和mysql数据库.代码比较简单,供学习anroid与j2ee交互.例如Sqlite的使用.安卓客户端与jsp的web服务端的 ...
- RAID 2.0
传统的RAID 1.0: 选几个硬盘—>做成RAID 5—>根据容量创建LUN—>映射给主机 1.重建时间随单盘容量的增大而迅速增加 2.性能上,一个LUN的读写只能在一个磁盘组 ...
- hibernate入门之person表
下面的hibernate入门person表指的是:根据mysql数据库中的test表和其中的元素-->建立映射表==>进而创建持久化类的顺序来操作了,下面为步骤 1.配置MySQL驱动程序 ...
- labview 移位寄存器、隧道、索引隧道的区别
Lab view区别:移位寄存器.隧道.索引隧道 最近研究Lab view的时候发现移位寄存器和隧道的功能非常相似但是又有区别 外部数据进入循环体是通过隧道进入的,有几种方式: 图1:For 循环结构 ...
- 为什么java不支持多重继承?
什么是钻石问题?如下图所示,B和C继承于A,D继承B和C(多重继承),在D中调用A的方法时,无法判断是调用B中的实现还是C的实现,下图继承关系是个菱形,所以该问题又叫做菱形问题. 如果java要解决这 ...
- ASP.NET MVC 第八回 Helper之演化
题目:如何在View中写一个超级连接连接到主页? 这个问题看起来很好回答: <a href="/home/index">首页</a> 其实上面这种不能称之为 ...
- ado.net 学习小结
连接数据源 Connection对象.Connection对象处于最顶层,是所有数据访问请求的关口.我们通过其暴露的属性进行配置.下面是一段连接字符串的示例. if (string.IsNullOrE ...
- Java-struts2 配置hellow world
这里进行struts框架的配置问题,和简单的输出hellow world 配置的步骤 1. 配置TomCat 2. Jak 3. 拷贝struts.xml文件到src目录 ...