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版本以后出现的新特性,用于解决安全问题,是一个类型安全机制 ...
随机推荐
- 【转&改进】Linux MPI 单机配置
MPI的全称是Message Passing Interface即标准消息传递界面,可以用于并行计算.MPI有多种实现版本,如MPICH, CHIMP以及OPENMPI.这里我们采用MPICH版本. ...
- vmware如何安装ubuntu
一.安装vamware 二.新建虚拟机 三.安装虚拟机的镜像文件 三.正式安装ubuntu 可能会出现的问题有: 下面为百度上的方法: 敲重点: 倘若按照网上的方法:关机重启按F2无法进入BIOS.则 ...
- ACM-ICPC 2018 沈阳赛区网络预赛-K:Supreme Number
Supreme Number A prime number (or a prime) is a natural number greater than 11 that cannot be formed ...
- 矩阵快速幂 51nod
基准时间限制:3 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 给出一个N * N的矩阵,其中的元素均为正整数.求这个矩阵的M次方.由于M次方的计算结果太大,只需要输出 ...
- djjango cookie和session 的几种常用需求使用方法
------https://www.cnblogs.com/liuqingzheng/articles/8990027.html 需求情形一:正常设置cookie set_cookie(key,val ...
- 06 面向对象:多态&抽象类&接口&权限修饰符&内部类
多态: /* 多态(polymorphic)概述 * 事物存在的多种形态 多态前提 * a:要有继承关系. * b:要有方法重写. * c:要有父类引用指向子类对象. * 成员变量 * 编译看左边(父 ...
- C++学习(十)(C语言部分)之 分支语句
#include<stdio.h> // std 标准 io ----> input output 输入 输出 printf scanf getchar ...... #i ...
- 实验吧—隐写术——WP之 男神一般都很低调很低调的!!
首先我们打开解题连接~ 是直接给我们下载了一个压缩文件,解压后得到: 确实是很帅的小哥哥呢,呵呵...... 分析题目提示,“获取隐藏在图片中的flag”,嗯~这句很重要,他决定了我们要先用那种工具 ...
- json(传输格式)、异步加载、时间线
xml:过去传输的数据格式 json:现在的传输数据格式,属性名加双引号来区别,其实也是对象,传输的是个字符串,其实就是json 前端JSON.stringfy(obj) 然后传给后台 后台传回来的j ...
- bash scripts收集
只保留代码中的头文件声明 #! /bin/sh echo "leave only INCluding declaration in c files" find $1 -name ...