独立开发的子系统间协同处理错误的能力

使用各种库(可能包含独立开发的库进行协同开发的能力)

对比复杂的应用概念建模的能力

异常处理

异常将问题的检测和解决过程分离开
当执行一个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++基础----用于大型程序的工具(异常处理,命名空间,多重继承)的更多相关文章

  1. C++ Primer 学习笔记_88_用于大型程序的工具 --异常处理[续1]

    用于大型程序的工具 --异常处理[续1] 四.又一次抛出 有可能单个catch不能全然处理一个异常.在进行了一些校正行动之后,catch可能确定该异常必须由函数调用链中更上层的函数来处理,catch能 ...

  2. C++ Primer 学习笔记_87_用于大型程序的工具 --异常处理

    用于大型程序的工具 --异常处理 引言: C++语言包括的一些特征在问题比較复杂,非个人所能管理时最为实用.如:异常处理.命名空间和多重继承. 相对于小的程序猿团队所能开发的系统需求而言,大规模编程[ ...

  3. C++ Primer 学习笔记_95_用于大型程序的工具 --多重继承与虚继承

    用于大型程序的工具 --多重继承与虚继承 引言: 大多数应用程序使用单个基类的公用继承,可是,在某些情况下,单继承是不够用的,由于可能无法为问题域建模,或者会对模型带来不必要的复杂性. 在这些情况下, ...

  4. C++ Primer 学习笔记_91_用于大型程序的工具 --命名空间

    用于大型程序的工具 --命名空间 引言: 在一个给定作用域中定义的每一个名字在该作用域中必须是唯一的,对庞大.复杂的应用程序而言,这个要求可能难以满足.这样的应用程序的全局作用域中一般有很多名字定义. ...

  5. 【c++ Prime 学习笔记】第18章 用于大型程序的工具

    大规模应用程序的特殊要求包括: 在独立开发的子系统之间协同处理错误:异常处理 使用各种库(可能包含独立开发的库)进行协同开发:命名空间 对比较复杂的应用概念建模:多重继承 18.1 异常处理 异常处理 ...

  6. C++ 用于大型程序的工具

    <C++ Primer 4th>读书笔记 相对于小的程序员团队所能开发的系统需求而言,大规模编程对程序设计语言的要求更高.大规模应用程序往往具有下列特殊要求: 1. 更严格的正常运转时间以 ...

  7. 【C++ Primer】用于大型程序的工具

    1. 异常处理 异常以类似于将实參传递给函数的方式抛出和捕获.异常可以是可传给非引用实參的随意实參的类型,这意味着必须可以复制该类型的对象. 当抛出一个表达式的时候,被抛出对象的静态编译时类型将决定异 ...

  8. C++ Primer 5th 第18章 用于大型程序的工具

    C++大规模程序设计至少存在三个特殊要求: 错误处理 库的引入 复杂建模 以上三种对应C++语言的三种特性:异常处理.命名空间.多重继承. 异常处理 异常处理机制是一种允许偷懒的工具,在出现非正确的情 ...

  9. 黑马程序员——【Java基础】——泛型、Utilities工具类、其他对象API

    ---------- android培训.java培训.期待与您交流! ---------- 一.泛型 (一)泛型概述 1.泛型:JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制 ...

随机推荐

  1. Sublime 修改快捷键

    Preferences-Key Bindings-User 添加一行: { "keys": ["ctrl+d"], "command": & ...

  2. 洛谷P2051 中国象棋(dp)

    题目链接:传送门 题目大意: 在N行M列的棋盘中放象棋中的“炮”,问要使得“炮”两两互不伤害,有多少种放法. 1 ≤ n,m ≤ 100,答案对9999973取模. 思路: 按行更新答案.每行炮可以放 ...

  3. Windows 10下使用WMware 12 安装Ubuntu16.04,安装过程(附全过程图)

    序言:菜鸡的我又开始瞎搞Ubuntu了 首先在网下下载VMware 12 正常安装即可 关于产品密匙问题:5A02H-AU243-TZJ49-GTC7K-3C61N (这是我在网上找的密匙,反正自己是 ...

  4. centos6安装opencv2

    环境 centos6.5 opencv2.4 python2.6(centos自带的) 下载 opencv可从GitHub下载https://github.com/opencv/opencv/tree ...

  5. 05 面向对象:构造方法&static&继承&方法 &final

    构造方法及其重载: /* 构造方法格式特点 * a:方法名与类名相同(大小也要与类名一致) * b:没有返回值类型,连void都没有 * c:没有具体的返回值return; * 构造方法的重载 * 重 ...

  6. C++学习(二十)(C语言部分)之 函数1

    函数 printf 输出的函数 scanf 输入的函数函数是什么 怎么写 是一组一起执行一个任务的语句 一个程序的基本组成单位是函数 只需要知道函数名字和括号里面要填的内容 就可以调用函数 1.如果代 ...

  7. 4.input()

    >>> help(input) Help on built-in function input in module builtins: input(prompt=None, /) R ...

  8. numpy.array

    关于python中的二维数组,主要有list和numpy.array两种. 好吧,其实还有matrices,但它必须是2维的,而numpy arrays (ndarrays) 可以是多维的. 我们主要 ...

  9. linux二进制/十六进制日志文件如何查看和编辑

    使用cat查看二进制,显示乱码 [root@localhost ~]# cat /var/log/wtmp ~~~reboot3.10.0-514.el7.x86_64 �YO#5~~~runleve ...

  10. malloc,calloc,alloca和free函数

    void *malloc(size_t size)因为返回类型为空,所以可以赋值到任何类型指针,其分配的空间大小为size,返回新分配内存地址的起始处的指针,其所分配的内存未经初始化,若分配失败返回N ...