zoukankan      html  css  js  c++  java
  • 《C++ Primer》读书记录五

    2015年6月9日  星期二 22:09

    第五部分  高级主题 第17章~第18章

    第17章 用于大型程序的工具

    • 异常处理,C++的异常处理中,需要由问题检测部分抛出一个对象给处理代码,通过这个对象的类型和内容,两个部分能够就出现了什么错误进行通信
      • 抛出类类型的异常,异常是通过throw对象而引发raise的。该对象的类型决定应该激活那个处理代码。被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位最近的那个。抛出指针通常是个坏主意,抛出指针要求在对于处理代码存在的任意地方存在指针所指向的对象
      • 栈展开,抛出异常后,暂停当前函数的操作,开始由近及远地查找匹配的catch子句,这个过程称为栈展开stack unwinding。栈展开期间,释放局部对象所用的内存并运行类类型局部对象的i析构函数。析构函数应该从不抛出异常
      • 捕获异常,带有因继承而相关的类型的多个catch子句,必须从最低派生类型到最高派生类型
      • 重新抛出,单个catch不能完全处理一个异常,在进行一些校正行动后,可以通过重新抛出rethrow将异常递给函数调用链中更上层的函数,重新抛出是后面不跟类型或表达式的一个throw,空throw语句将重新抛出异常
      • 捕获所有异常的处理代码,catch-all.如果catch(……)与其他catch子句结合使用,必须最后一个。否则,任何跟在它后面的catch子句都不能被匹配
      • //match any exception that might be thrown
        cathc(......){
          //place our code here
        }
      • 函数测试块与构造函数
      • 异常类层次

                                

      • 自动资源释放,如果用new动态分配内存,在delete之前发生异常,那么内存没有被释放。  
        • 异常安全的:如果发生异常,被分配的任何资源都适当地释放。
        • 用类管理资源分配:如果定义一个类来封装资源的分配和释放,可以保证正确释放资源,这一技术称为”资源分配即初始化“,检测RAII
      • auto_ptr类,是资源分配及初始化技术的例子,它是一个接受类型形参的模板,为动态分配的对象提供异常安全。auto_ptr对象只能保存一个指向对象的指针,并且不能用于指向动态分配的数组,这会导致未定义的运行时行为,因为它只释放一个对象——使用普通delete操作符,而不用数组的delete[]操作符。
      • 异常说明指定,如果函数抛出异常,被抛出的异常将是包含在该说明中的一种,或者是从列出的异常中派生的类型
        • 定义异常说明, void recoup(int) throw(runtime_error)表示如果recoup抛出异常,该异常将是runtime_error对象,或者由它派生的类型的异常。
    • 命名空间

        在使用来自多个供应商的库编写应用程序时,名字中有一些几乎不可避免的会发生冲突,称为命名空间污染namespace pollution问题。命名空间为防止名字冲突提供了更加可控的机制,命名空间能够划分全局命名空间,这样使用独立开发的库就更加容易了。一个命名空间是一个作用域,通过在命名空间内部定义库中的名字,可以避免全局名字固有的限制。

      • 命名空间的定义,以关键字namespace开始,后接命名空间的名字。命名空间可以在全局作用域或其他作用域内部定义,但不能在函数或类内部定义
      • 嵌套命名空间。外围命名空间中声明的名字被嵌套命名空间中同一名字的声明所屏蔽、
      • 未命名的命名空间,它的定义局部于特定文件,从不跨越多个文本文件。未命名的命名空间取代文件中的静态声明
      • 命名空间成员的使用,using声明,using std::map,using指示,using namespace A。
      • 类、命名空间和作用域,在类作用域中使用名字的时候,首先在成员本身中查找,然后在类中查找,包括基类,然后再检查外围作用域,除了成员定义例外,总是向上查找作用域:名字在使用前必须声明。
      • 重载与命名空间,重载与using 声明,重载与using指示,跨越多个using指示的重载
      • 命名空间与模板
    • 多重继承与虚继承
      • 多重继承,多重继承的派生类从每个基类中继承状态,派生类构造函数初始化所有基类,构造的次序既不受构造函数初始化列表中出现的基类的影响,也不受基类在构造函数初始化列表中的出现次序的影响。析构的次序总是按照构造函数运行的逆序调用。
      • 转换与多个基类,派生类的指针或引用可以转换为其任意基类的指针和引用,在多重继承情况下,遇到二义性转换的可能性更大
      • 多重继承派生类的赋值控制,与单继承一样,使用基类自己的复制构造函数,赋值操作符或析构函数隐式构造、赋值或撤销每个基类
      • 多重继承下的类作用域,多个基类可能导致二义性,首先发生名字查找,然后编译器才确定找到的声明是否合法,可以通过指定使用哪个类解决二义性
      • 虚继承,virtual inheritance是一种机制,类通过虚继承指出它希望共享其虚基类的状态,在虚继承下,无论该类在派生层次中作为虚基类出现多少次,只继承一个共享的基类子对象。
      • 虚基类的声明,通过关键字virtual修改声明,将基类指定为通过虚继承派生。
      • 特殊的初始化语义,为了解决重复初始化问题,从具有虚基类的类继承的类对初始化进行特殊处理,在虚派生中,由最底层派生类的构造函数初始化虚基类。

    第18章  特殊工具与技术

    • 优化内存分配
    • 运行时类型识别RTTI
    • 类成员的指针
    • 嵌套类
    • 联合:节省空间的类
    • 局部类
    • 固有的不可移植的特征
  • 相关阅读:
    2018-2-13-安装-aria2
    ..USERstm32f10x.h(428): error: #67: expected a "}" ADC1_2_IRQn = 18, /*!
    zubax_gnss移植到STM32F407
    ChibiOS/RT移植到STM32F407
    arm-none-eabi/bin/ld: build/com.zubax.gnss.elf section `.text' will not fit in region `flash'
    Traceback (most recent call last): File "../zubax_chibios/tools/make_boot_descriptor.py", line 251
    Eclipse 交叉编译环境
    PX4/Pixhawk uORB
    FreeRTOS 任务创建和删除(静态)
    FreeRTOS 任务创建和删除(动态)
  • 原文地址:https://www.cnblogs.com/sherPur/p/4564804.html
Copyright © 2011-2022 走看看