大规模应用程序的特殊要求包括: 在独立开发的子系统之间协同处理错误:异常处理 使用各种库(可能包含独立开发的库)进行协同开发:命名空间 对比较复杂的应用概念建模:多重继承 18.1 异常处理 异常处理机制允许程序在运行时对出现的问题进行通信并处理 异常使得可将问题的检测和解决分离,一部分用于检测问题的出现,另一部分用于解决问题 18.1.1 抛出异常 通过抛出一条表达式来引发一个异常,被抛出表达式的类型和当前的调用链共同决定哪段处理代码被用于处理该异常. 被选中的处理代码是当前调用链中与抛出对象…
C++大规模程序设计至少存在三个特殊要求: 错误处理 库的引入 复杂建模 以上三种对应C++语言的三种特性:异常处理.命名空间.多重继承. 异常处理 异常处理机制是一种允许偷懒的工具,在出现非正确的情况时,进行错误之间的协作处理.异常使得问题检测和解决过程分离开来.程序的一部分检测问题,另一个部分专门解决问题. 抛出异常 在C++中通过抛出一个表达式来引发异常,被抛出的表达式的类型以及当前调用链共同决定哪个部分来处理异常.被选择的部分是调用链和抛出类型匹配最近的处理部分.根据抛出类型的类型及其内…
用于大型程序的工具 --多重继承与虚继承 引言: 大多数应用程序使用单个基类的公用继承,可是,在某些情况下,单继承是不够用的,由于可能无法为问题域建模,或者会对模型带来不必要的复杂性. 在这些情况下,多重继承能够更直接地为应用程序建模.多重继承是从多于一个直接基类派生类的能力,多重继承的派生类继承其全部父类的属性. 一.多重继承 1.定义多个类 为了支持多重继承,扩充派生列表: class Bear : public ZooAnimal { //... }; 以支持由逗号分隔的基类列表: cla…
用于大型程序的工具 --异常处理[续1] 四.又一次抛出 有可能单个catch不能全然处理一个异常.在进行了一些校正行动之后,catch可能确定该异常必须由函数调用链中更上层的函数来处理,catch能够又一次抛出将异常传递给函数调用链中更上层的函数.又一次抛出是后面不跟类型或表达式的一个throw: throw; 空throw语句将又一次抛出异常对象,它仅仅能出如今catch或从catch调用的函数中.假设在处理代码不活动时碰到空throw,就调用terminate函数. 尽管又一次抛出不指定自…
用于大型程序的工具 --异常处理 引言: C++语言包括的一些特征在问题比較复杂,非个人所能管理时最为实用.如:异常处理.命名空间和多重继承. 相对于小的程序猿团队所能开发的系统需求而言,大规模编程[往往涉及数千万行代码]对程序设计语言的要求更高.大规模应用程序往往具有下列特殊要求: 1.更严格的正常运转时间以及更健壮的错误检測和错误处理.错误处理常常必须跨越独立开发的多个子系统进行[异常处理]. 2.能够用各种库(可能包括独立开发的库)构造程序[命名空间]. 3.能够处理更复杂的应用概念[多重…
用于大型程序的工具 --命名空间 引言: 在一个给定作用域中定义的每一个名字在该作用域中必须是唯一的,对庞大.复杂的应用程序而言,这个要求可能难以满足.这样的应用程序的全局作用域中一般有很多名字定义.由独立开发的库构成的复杂程序更有可能遇到名字冲突 -- 相同的名字既可能在我们自己的代码中使用,也可能(更常见地)在独立供应商提供的代码中使用. 库倾向于定义很多全局名字 -- 主要是模板名.类型名或函数名.在使用来自多个供应商的库编写应用程序的时候,这些名字中有一些差点儿不可避免地会发生冲突,这样…
第十八章 自定义泛型.枚举与注释 18.1 自定义泛型 泛型定义: (1)仅定义在方法上的泛型语法 (2)用来限制泛型可用类型的extends与super关键字(3)?类型通配字符的使用 18.1.1 使用extends与? 1.若extends之后指定了类与接口,想再指定其他接口,可以使用&连接. 2.如果B是A的子类,而Node< B>可视为一种Node< A>,则称Node具有共变性或有弹性的.Java泛型不具有共变性,可以使用类型通配字符?与extends来声明变量…
<C++ Primer 4th>读书笔记 相对于小的程序员团队所能开发的系统需求而言,大规模编程对程序设计语言的要求更高.大规模应用程序往往具有下列特殊要求: 1. 更严格的正常运转时间以及更健壮的错误检测和错误处理.错误处理经常必须跨越独立开发的多个子系统进行. 2. 能够用各种库(可能包含独立开发的库)构造程序. 3. 能够处理更复杂的应用概念. C++ 中有下列三个特征分别针对这些要求:异常处理.命名空间和多重继承. 异常处理 通过异常我们能够将问题的检测和问题的解决分离,这样程序的问题…
1. 异常处理 异常以类似于将实參传递给函数的方式抛出和捕获.异常可以是可传给非引用实參的随意实參的类型,这意味着必须可以复制该类型的对象. 当抛出一个表达式的时候,被抛出对象的静态编译时类型将决定异常对象的类型. 抛出指针一般是个坏主意. 栈展开:沿着嵌套函数调用链继续向上,直到为异常找到一个catch子句. 栈展开期间.释放局部对象所用的内存并执行类类型局部对象的析构函数. 一个块能够通过new动态分配内存.假设该块因异常而退出.编译器不会删除该指针.已分配的内存将不会释放. 析构函数应该从…
独立开发的子系统间协同处理错误的能力 使用各种库(可能包含独立开发的库进行协同开发的能力) 对比复杂的应用概念建模的能力 异常处理 异常将问题的检测和解决过程分离开 当执行一个throw之后,程序控制权转移到了与之匹配的catch 控制权的转移有两个重要的含义 1沿着调用链的函数可能会提早退出 2一旦程序开始执行异常处理代码,则沿着调用链创建的对象将被销毁 栈展开 栈展开,层层往外查找.如果找到了匹配的catch,则进入执行代码.执行完catch之后,找到与try块关联的最后一个catch子句之…