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

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

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

异常处理

异常将问题的检测和解决过程分离开
当执行一个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. centos6安装opencv2

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

  2. SpringMVC整合Thymeleaf

    Thymeleaf的介绍 进行JavaWeb开发时主要用到的是JSP,传统的JSP需要在页面中加入大量的JSTL标签,这些标签只能运行在服务器中,前端开发人员维护这些页面比较困难,页面加载速度也比较慢 ...

  3. linux忘记root密码

    在选择系统界面选中要修改的系统(我的就是默认的第一个),按e建进入修改,在修改界面一直下到文件末尾,在末尾前一行左右,找到UTF-8那一行,在这一行敲一个空格,然后打init=/bin/sh 修改完成 ...

  4. makefile——小试牛刀

    //a.h,包含头文件stdio.h,并且定义一个函数print #include<stdio.h> void print(); //b.c,包含头文件a.h,然后就可以写print函数的 ...

  5. apache kafka系列之在zookeeper中存储结构

    1.topic注册信息 /brokers/topics/[topic] : 存储某个topic的partitions所有分配信息 Schema:   {    "version": ...

  6. How_Require_Extensions_Work

    Why Doing require extensions correctly is essential, because: Users should be able to install multip ...

  7. C# to IL 7 Pointers(指针)

    Pointers are the heart and soul of a programming language. The only reason why the Cprogramming lang ...

  8. .NET本质论 用类型编程

    运行时的类型 类型本身并不是万能的.类型真正有意思的地方在于,程序员使用类型的实例,并让它们相互作用.类型的实例(instance)既可以是对象,也可以是值,这取决于类型如何定义的.基本数据类型(pr ...

  9. NPOI之Excel——合并单元格、设置样式、输入公式、设置筛选等

    首先建立一个空白的工作簿用作测试,并在其中建立空白工作表,在表中建立空白行,在行中建立单元格,并填入内容: //建立空白工作簿 IWorkbook workbook = new HSSFWorkboo ...

  10. Pycharm主题设置以及导入方式

    主题下载链接: http://www.themesmap.com/ pycharm -- 导入主题(theme) and 修改背景颜色(护眼色)   前情提要 众所周知,随着python语言的不断流行 ...