C/C++基础----用于大型程序的工具(异常处理,命名空间,多重继承)
独立开发的子系统间协同处理错误的能力
使用各种库(可能包含独立开发的库进行协同开发的能力)
对比复杂的应用概念建模的能力
异常处理
异常将问题的检测和解决过程分离开
当执行一个throw之后,程序控制权转移到了与之匹配的catch
控制权的转移有两个重要的含义
1沿着调用链的函数可能会提早退出
2一旦程序开始执行异常处理代码,则沿着调用链创建的对象将被销毁
- 栈展开
栈展开,层层往外查找。如果找到了匹配的catch,则进入执行代码。执行完catch之后,找到与try块关联的最后一个catch子句之后的点,并从这里继续执行。
如果没找到,则调用terminate退出程序
栈展开过程中,对象被自动销毁,可能当前对象只构造了一部分,我们也要确保这部分被正确的销毁。
析构函数总是会被执行,可以使用类来控制资源的分配
析构函数需要执行某个可能抛出异常的操作,则该操作应该被放置在一个try语句块中,并且在析构函数中得到处理。
- 异常抛出,catch
当抛出一条表达式时,该表达式的静态编译时类型决定了异常对象的类型
catch中声明的类型必须是完全类型,可以是左值引用,但不能是右值引用。
多个catch语句之间存在继承关系,继承链底端的类放在前面。
catch语句允许的类型转换
1非常量转常量
2派生类转基类
3数组或函数转指针
重新抛出
空throw只能出现在catch内或catch直接或间接调用的函数内。
catch(…)捕获所有异常
如想处理构造函数初始值抛出的异常
template<typename T>
Blob<T>::Blob(std::initializer_list<T> il) try : data(std::make_shared<std::vector<T>>(il) {}
既能处理构造函数体抛出的异常也能处理成员初始化列表抛出的异常。
- noexcept说明符
经常用在1确认函数不会抛出异常2根本不知道该如何处理异常
noexcept运算符
noexcept(fun(i)) //表示给定的表达式是否会抛出异常
- 异常类层次
exception仅仅定义了拷贝构造、拷贝赋值、虚析构函数、what虚函数
exception、bad_cast、bad_alloc定义了默认构造函数
logic_error和runtime_error没有默认构造,接收一个string或C风格字符串
(1)语言本身所支持的异常
此类异常用以支撑某些语言特性。主要包括:
bad_alloc:new操作失败会抛出。
bad_cast:执行期间加在一个引用上面的动态性型别转换操作失败时抛出。
bad_typeid:执行RTTI时,交给typeid的参数为零或空指针时抛出
bad_exception:非预期的异常
(2)C++标准程序库发出的异常
logic_error。逻辑错误是由于程序内部逻辑而导致的错误。逻辑错误是可以避免的,且在程序开始执行之前,能够被检测到。
domain_error:专业领域内的范畴 invalid_argument:无效参数,比如讲bitset以char而非0或1进行初始化 length_error:可能超越了最大极限,比如对着某个字符串附加太多字符。 out_of_range:参数不再预期范围内。例如在诸如array的容器或字符串string中采用一个错误索引。
runtime_error,用来指出“不在程序范围内,且不容易回避”的事件。此类错误只在程序执行时才是可检测的。
range_error:内部计算时发生区间错误
overflow_error:算数运算时发生上溢
underflow_error:算数运算时发生下溢
命名空间
为防止名字冲突提供了更加可控的机制
命名空间可以不连续
#include通常不在命名空间内,头文件中所有名字定义成该命名空间的成员
命名空间之外定义必须使用含有前缀的名字
模板特例化必须定义在原模板所属的命名空间内
内联命名空间中的名字可以直接被外层命名空间直接使用,关键字inline必须出现在命名空间第一次定义的地方。
- 匿名的命名空间
未命名的命名空间中定义的变量拥有静态周期,可以不连续,但是不能跨越多个文件。
所定义名字的作用域与该命名空间所在作用域相同,不会横跨多个不同文件。
- using声明和using指示
using声明
有效范围从声明的地方到using声明所在作用域结束。外层作用域的同名实体被隐藏。
可以出现在全局作用域、局部作用域、命名空间作用域以及类作用域中
简单地令名字在局部作用域内有效
using指示
可以出现在全局作用域、局部作用域、命名空间作用域。
将命名空间成员提升到包含命名空间本身和using指示的最近作用域的能力。
头文件通常只负责定义接口部分名字,而不定义实现部分名字。因此头文件做多只能在它的函数或者命名空间内使用using指示或声明。
命名空间中名字隐藏的规则有一个重要的例外:
给函数传递一个类类型的对象时,除了在常规的作用域查找外,还会查找实参类所属的命名空间,对应传递的引用或指针的调用同样有效。
1先在当前作用域寻找
2在外层作用域查找
3实参类所属的命名空间
影响候选函数的搜索
using声明如果跟已有函数冲突会引发错误,using指示则不会,只要调用时指明作用域。
一个未声明的类或函数如果第一次出现在友元声明中,则认为他是最近的外层命名空间的成员。
多重继承
构造顺序,首先构造虚基类,然后按派生列表中的顺序依次构造直接基类。
对象、指针和引用的静态类型决定了能够使用哪些成员。
C/C++基础----用于大型程序的工具(异常处理,命名空间,多重继承)的更多相关文章
- C++ Primer 学习笔记_88_用于大型程序的工具 --异常处理[续1]
用于大型程序的工具 --异常处理[续1] 四.又一次抛出 有可能单个catch不能全然处理一个异常.在进行了一些校正行动之后,catch可能确定该异常必须由函数调用链中更上层的函数来处理,catch能 ...
- C++ Primer 学习笔记_87_用于大型程序的工具 --异常处理
用于大型程序的工具 --异常处理 引言: C++语言包括的一些特征在问题比較复杂,非个人所能管理时最为实用.如:异常处理.命名空间和多重继承. 相对于小的程序猿团队所能开发的系统需求而言,大规模编程[ ...
- C++ Primer 学习笔记_95_用于大型程序的工具 --多重继承与虚继承
用于大型程序的工具 --多重继承与虚继承 引言: 大多数应用程序使用单个基类的公用继承,可是,在某些情况下,单继承是不够用的,由于可能无法为问题域建模,或者会对模型带来不必要的复杂性. 在这些情况下, ...
- C++ Primer 学习笔记_91_用于大型程序的工具 --命名空间
用于大型程序的工具 --命名空间 引言: 在一个给定作用域中定义的每一个名字在该作用域中必须是唯一的,对庞大.复杂的应用程序而言,这个要求可能难以满足.这样的应用程序的全局作用域中一般有很多名字定义. ...
- 【c++ Prime 学习笔记】第18章 用于大型程序的工具
大规模应用程序的特殊要求包括: 在独立开发的子系统之间协同处理错误:异常处理 使用各种库(可能包含独立开发的库)进行协同开发:命名空间 对比较复杂的应用概念建模:多重继承 18.1 异常处理 异常处理 ...
- C++ 用于大型程序的工具
<C++ Primer 4th>读书笔记 相对于小的程序员团队所能开发的系统需求而言,大规模编程对程序设计语言的要求更高.大规模应用程序往往具有下列特殊要求: 1. 更严格的正常运转时间以 ...
- 【C++ Primer】用于大型程序的工具
1. 异常处理 异常以类似于将实參传递给函数的方式抛出和捕获.异常可以是可传给非引用实參的随意实參的类型,这意味着必须可以复制该类型的对象. 当抛出一个表达式的时候,被抛出对象的静态编译时类型将决定异 ...
- C++ Primer 5th 第18章 用于大型程序的工具
C++大规模程序设计至少存在三个特殊要求: 错误处理 库的引入 复杂建模 以上三种对应C++语言的三种特性:异常处理.命名空间.多重继承. 异常处理 异常处理机制是一种允许偷懒的工具,在出现非正确的情 ...
- 黑马程序员——【Java基础】——泛型、Utilities工具类、其他对象API
---------- android培训.java培训.期待与您交流! ---------- 一.泛型 (一)泛型概述 1.泛型:JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制 ...
随机推荐
- Windows编程___创建窗口
创建Windows窗口不难,可以简要的概括为: 1,# 注册一个窗口类 填充WNDCLASS结构 书写窗口消息处理函数WinProc 2,# 创建一个窗口 填写基本的窗口信息 3,# 显示窗口 4,# ...
- Error Downloading Packages: yum更新出现错误
yum install lrzsz 失败报错: 解决思路: 1:执行yum clean all 清除缓存目录下的软件包及旧的headers: 2:接着执行 yum list 重新列出所有已经安装和可 ...
- this和super用法详解
这几天看到类在继承时会用到this和super,这里就做了一点总结,与各位共同交流,有错误请各位指正~ this this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. this ...
- lesson8-图像问答-小象cv
QA即图像问答:覆盖最全面的AI,ai完备性 动态模型:不同任务需要不同模型 or 不同细分任务需要不同模型参数 数据集: 1)VQA,显示图片+抽象场景:每个问题给10个不同答案:含有无图片答案(考 ...
- ACM-ICPC 2018 焦作赛区网络预赛- G:Give Candies(费马小定理,快速幂)
There are N children in kindergarten. Miss Li bought them NNN candies. To make the process more inte ...
- PS学习之如何把小姐姐塞进瓶子里
准备素材 开始制作 用PS新建一个国际通用纸张大小的画布 分辨率可以调为72 改变背景色 插入图片 水平居中对齐 插入木质素材 放大 覆盖之前的素材 调整图层顺序 创建剪切蒙版 对木桩添加曲线 设置立 ...
- [动态差分+二维前缀和][小a的轰炸游戏]
链接:https://ac.nowcoder.com/acm/contest/317/E来源:牛客网 题目描述 小a正在玩一款即时战略游戏,现在他要用航空母舰对敌方阵地进行轰炸 地方阵地可以看做是n× ...
- 关于kafka的新的group无法订阅到topic中历史消息的问题
今天在写kafka的java api例子时候,遇到一个问题,比如我创建了一个test主题,往里面写了1,2,3,4,5条消息,在这个时候,我用一个新的group启动了一个消费者,发现该消费者只能读到5 ...
- Linux下安装jdk&Jmeter
一.在Linux上部署一个jdk以及Jmeter tips1:Linux安装tar.gz文件到路径 tar -zxvf 软件包名.tar.gz -C 路径 比如我的jdk-8u131-linux- ...
- 在浏览器中输入url回车之后会发生什么
在浏览器中输入URL之后,浏览器会经历以下5个步骤: 1.解析URL 2.DNS域名解析 3.浏览器与网站建立TCP链接(三次握手) 4.请求和传输数据 5.浏览器渲染页面 一.解析URL 什么是ur ...