C++ Primer学习笔记(第17、18章)

17章 用于大型程序的工具

  1. 栈展开:用于描诉在查找catch捕获抛出异常的函数过程。在进入相应catch之前,撤销在异常之前构造的局部对象。

  2. 重新抛出:一个空的throw——没有指定表达式的throw。只有捕获子句或者从catch直接或间接调用的函数中的重新抛出才有效,其效果是将接到的异常对象重新抛出。

  3. 捕获所有异常的catch子句为catch(...)。如果catch(...)与其他catch子句结合使用,它必须是最后一个,否则,任何跟在它后面的catch子句都将不能被匹配。

  4. 函数测试块:为了处理来自构造函数初始化的异常,必须将构造函数编写为函数测试块。

                     T::T()

                           try : val(0),str(“ “)

                      { } catch(){ }

  1. 资源分配即初始化:来封装资源的分配和释放,可以保证正确释放资源。这一技术常称为“资源分配即初始化“,简称RAII

  2. auto_ptr类:一个库类模板,提供对动态分配对象的异常安全的访问。不能将auto_ptr对象绑定到数组或变量指针(auto_ptr释放资源,会破还该指针,一般新建一个指针给auto_ptr,如auto_ptr<string> ap(new string(“test”))),auto_ptr对象的复制和赋值是破坏性操作:将对象的所有权从右操作数转到左操作数。对auto_ptr对象进行复制删除左操作数中的对象,因此,不能将auto_ptr对象存储在容器中。

  3. 异常说明:用于函数声明定义上,指出函数抛出什么(如果有)异常类型。void print(string) throw (runtime_error)。空列表表示函数不抛出异常,没有异常说明的函数可以抛出任何异常。派生类的异常说明不能比基类还多,不能增加异常抛出。

  4. 命名空间:命名空间可以是不连续的,可以在几个部分中定义,在程序的不同部分,命名空间可以是打开的、关闭的和重新打开的。

  5. 未命名空间:没有命名的命名空间。与其他命名空间不同,未命名的命名空间的定义局部于特定文件,从不跨越多个文本文件。未命名的命名空间中定义的名字可以无须使用作用域操作符而直接访问。

  6. 命名空间成员的使用,三种访问:using声明(using std::cout);命名空间别名(namespace s=std);using指示(using namespace std;)。

  7. 接受类类型形参(或类类型指针及引用形参)的且与类本身定义在同一个命名空间中的函数(包括重载操作符),在用类类型对象(或类类型的引用及指针)作为实参的时候是可见的。如getline(std::cin,s)getline()cin在同一命名空间,故其可见。

  8. 虚继承:使用virtual继承的基类。效果:使继承多个虚基类的派生类中只出现一个虚基类。如B虚继承AC虚继承AD继承BC,则由于虚继承D中只有一个A基类。虚基类有最低层派生类(即D)的构造函数初始化,且最先初始化(在BC中不再初始化A)。

18章 特殊工具与技术

  1. C++中的内存分配,两种原始内存分配和释放的方法

    • allocator类:allocator可以实现内存分配与对象构造分离开。

    • 标准库中的operator newoperator delete,我们常用的newdelete就是调用的他们。

  2. 运行时类型识别(RTTI),运行时直接询问对象的动态类型。RTTI只适用于定义了虚函数的类(且是指针或引用),没有定义虚函数的类型的类型信息是可用的但反映静态类型。

    • typeid操作符:返回对象的实际类型。typeide),e是任意表达式或者类型名。

    • dynamic_cast操作符:将基类类型的指针或引用安全的转换为派生类型的指针或引用。

  3. 成员指针:用来获取类特定成员的指针。成员指针包含类的类型以及成员的类型。class T{ string content;}string T::*ps_content=&T::content;

  4. 联合:类形式的聚合类型,它可以定义多个数据成员,但在任意点只有一个成员可以具有值。联合的成员必须为简单类型:内置类型,复合类型,没有定义构造函数、析构函数和赋值操作符的类类型。union不能具有静态数据成员或引用成员。union可以定义成员函数,包括构造函数和析够函数。但是,union不能作为基类使用。

  5. 局部类:在函数体内部定义的类称为局部类。局部类只在定义它的函数内部可见,类的所有成员必须定义在类定义体内部。局部类不能有静态成员,局部类成员不能访问外围函数中定义的局部变量,它们可以使用外围函数中定义的类型名、静态变量和枚举成员。

  6. C++的三个固有的不可移植的特征:位域、volatile限定符和链接指示。

    • 位域:有符号或无符号整型类成员,它指定了分配给成员的维数。

                   class File{

                      int mode : 2;

                      int modified : 1;

                      int next : 29;

                 }

    • volatile:类型限定符,告诉编译器可以在程序的直接控制之外改变一个变量。它告诉编译器不能执行某些优化的信号。

    • 链接指示:extern “C”,在C++程序中调用其他程序设计语言编写的函数。

原文地址:https://www.cnblogs.com/little_ask/p/2660890.html