第17章  用于大型程序的工具
  1. 异常处理
    不存在数组或函数类型的异常。相反,如果抛出一个数组,被抛出的对象转换为指向数组首元素的指针,类似地,如果抛出一个函数,函数被转换为指向该函数的指针。
  2. 不要抛出指针
  3. 析构函数不要抛出异常
  4. 除下面几种可能的区别之外,异常的类型与 catch 说明符的类型必须完全匹配: 
    •     允许从非 const 到 const 的转换。也就是说,非 const 对象的 throw 可以与指定接受 const 引用的 catch 匹配。
    •     允许从派生类型型到基类类型的转换。
    •     将数组转换为指向数组类型的指针,将函数转换为指向函数类型的适当指针。
  5. 命名空间
    命名空间为防止名字冲突提供了更加可控的机制,命名空间能够划分全局命名空间,这样使用独立开发的库就更加容易了。
    一个命名空间是一个作用域,通过在命名空间内部定义库中的名字,库的作者(以及用户)可以避免全局名字固有的限制。
  6. 命名空间的定义:
    namespace cplusplus_primer
    {
             class Sales_item { /* ... */};
             Sales_item operator+(const Sales_item&,  const Sales_item&);
             class Query  { /* ... */}; 
             class Query_base { /* ... */};
    }

    命名空间的名字在定义该命名空间的作用域中必须是唯一的。
    命名空间可以在全局作用域或其他作用域内部定义,但不能在函数或类内部定义。
    命名空间名字后面接着由花括号括住的一块声明和定义,可以在命名空间中放入可以出现在全局作用域的任意声明:类、变量(以及它们的初始化)、函数(以及它们的定义)、模板以及其他命名空间。
    命名空间作用域不能以分号结束。
    因为不同命名空间引入不同作用域,所以不同命名空间可以具有同名成员。
    在命名空间中定义的名字可以被命名空间中的其他成员直接使用,命名空间外部的代码必须指出名字定义在哪个命名空间中。

  7. 从命名空间外部使用命名空间成员
    (1)总是使用限定名
         namespace_name::member_name 
    (2)编写 using 声明来获得对我们知道将经常使用的名字的直接访问:
         using cplusplus_primer::Query; 
    在这个 using 声明之后,程序可以无须 cplusplus_primer 限定符而直接使用名字 Query
  8. 命名空间可以是不连续的
    命名空间可以在几个部分中定义。命名空间由它的分离定义部分的总和构成,命名空间是累积的。一个命名空间的分离部分可以分散在多个文件中,在不同文本文件中的命名空间定义也是累积的。
  9. 接口和实现的分离
    可以用与管理自己的类和函数定义相同的方法来组织命名空间:
    (1) 定义类的命名空间成员,以及作为类接口的一部分的函数声明与对象声明,可以放在头文件中,使用命名空间成员的文件可以包含这些头文件。
    (2) 命名空间成员的定义可以放在单独的源文件中。
  10. 全局命名空间
    定义在全局作用域的名字(在任意类、函数或命名空间外部声明的名字)是定义在全局命名空间中的。
    因为全局命名空间是隐含的,它没有名字,所以记号  ::member_name 引用全局命名空间的成员。
  11. 嵌套命名空间
    一个嵌套命名空间即是一个嵌套作用域——其作用域嵌套在包含它的命名空间内部。
    嵌套命名空间中的名字遵循常规规则:外围命名空间中声明的名字被嵌套命名空间中同一名字的声明所屏蔽。嵌套命名空间内部定义的名字局部于该命名空间。外围命名空间之外的代码只能通过限定名引用嵌套命名空间中的名字。
  12. 嵌套命名空间中成员的名字由外围命名空间的名字和嵌套命名空间的名字构成。
    例如,嵌套命名空间 QueryLib 中声明的类的名字是   cplusplus_primer::QueryLib::Query
  13. 未命名的命名空间
    未命名的命名空间在定义时没有给定名字。
    未命名的命名空间与其他命名空间不同,未命名的命名空间的定义局部于特定文件,从不跨越多个文本文件。
  14. 命名空间成员的使用——使用using声明
    using std::map; 
    一个 using 声明一次只引入一个命名空间成员,它使得无论程序中使用哪些名字,都能够非常明确。
    using 声明中引入的名字遵循常规作用域规则。从 using 声明点开始,直到包含 using 声明的作用域的末尾,名字都是可见的。外部作用域中定义的同名实体被屏蔽。
  15. 命名空间别名
    可用命名空间别名将较短的同义词与命名空间名字相关联,例如:
    namespace primer = cplusplus_primer;
    一个命名空间可以有许多别名,所有别名以及原来的命名空间名字都可以互换使用。
  16. using 指示
    using namespace std;
    using 指示以关键字 using 开头,后接关键字 namespace,再接命名空间名字。如果该名字不是已经定义的命名空间名字,就会出错。 
    using 指示使得特定命名空间所有名字可见,没有限制。短格式名字可从 using 指示点开始使用,直到出现 using 指示的作用域的末尾。
  17. 实参相关的查找与类类型形参
    std::string s;    
    getline(std::cin, s); 
    std::string s;
    它在命名空间 std 中查找并找到由 string 类型定义的 getline 函数。
  18. 重载与命名空间
    两个不同命名空间的成员的函数不能互相重载。
    同一个命名空间可以包含一组重载函数成员。
  19. 重载与 using 声明 
    如果命名空间内部的函数是重载的,那么,该函数名字的 using 声明声明了所有具有该名字的函数。如果命名空间 NS 中有用于 int 和 double 的函数,则 NS::print 的 using 声明使得两个函数都在当前作用域中可见。
  20. 重载与 using 指示
    using 指示将命名空间成员提升到外围作用域。如果命名空间函数与命名空间所在的作用域中声明的函数同名,就将命名空间成员加到重载集合中:
  21. 多重继承
    派生类的构造函数可以在构造函数初始化式中给零个或多个基类传递值:
  22. 构造的次序
    构造函数初始化式只能控制用于初始化基类的值,不能控制基类的构造次序。
    基类构造函数按照基类在类派生列表中的出现次序调用。
  23. 转换与多个基类
    在单个基类情况下,派生类的指针或引用可以自动转换为基类的指针或引用,对于多重继承也是如此,派生类的指针或引用可以转换为其任意基类的指针或引用。
  24. 多个基类可能导致二义性
    可以通过指定使用哪个类解决二义性:ying_yang.Endangered::print(cout);
    避免潜在二义性最好的方法是,在解决二义性的派生类中定义函数的一个版本。
  25. 虚继承
    虚继承是一种机制,类通过虚继承指出它希望共享其虚基类的状态。在虚继承下,对给定虚基类,无论该类在派生层次中作为虚基类出现多少次,只继承一个共享的基类子对象。共享的基类子对象称为虚基类。
  26. 特殊的初始化
    从具有虚基类的类继承的类对初始化进行特殊处理。在虚派生中,由最低层派生类的构造函数初始化虚基类,而且是先构造虚基类,然后构造非虚基类。
    任何直接或间接继承虚基类的类一般也必须为该基类提供自己的初始化式。

 

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

  1. C++ 提供下面两种方法分配和释放未构造的原始内存
    (1)  allocator 类,它提供可感知类型的内存分配。这个类支持一个抽象接口,以分配内存并随后使用该内存保存对象。
    (2)  标准库中的 operator new 和 operator delete,它们分配和释放需要大小的原始的、未类型化的内存。
  2. allocator 类

C++ Primer(第4版)-学习笔记-第5部分:高级主题的更多相关文章

  1. C++Primer第5版学习笔记(四)

    C++Primer第5版学习笔记(四) 第六章的重难点内容         你可以点击这里回顾第四/五章的内容       第六章是和函数有关的知识,函数就是命名了的代码块,可以处理不同的情况,本章内 ...

  2. C++Primer第5版学习笔记(三)

    C++Primer第5版学习笔记(三) 第四/五章的重难点内容           你可以点击这里回顾第三章内容       因为第五章的内容比较少,因此和第四章的笔记内容合并.       第四章是 ...

  3. C++Primer第5版学习笔记(二)

    C++Primer第5版学习笔记(二) 第三章的重难点内容         这篇笔记记录了我在学习C++常用基本语法的学习过程,基本只记录一些重难点,对概念的描述不是一开始就详尽和准确的,而是层层深入 ...

  4. C++Primer第5版学习笔记(一)

    C++Primer第5版学习笔记(一) 第一.二章的重难点内容        这个笔记本主要记录了我在学习C++Primer(第5版,中文版)的过程中遇到的重难点及其分析.因为第一.二章都比较简单,因 ...

  5. C++Primer第五版学习笔记

    <C++ Primer>Learning Note 程序实例下载地址:http://www.informit.com/title/0321714113 第一章            开始 ...

  6. C++ Primer(第4版)-学习笔记-第4部分:面向对象编程与泛型编程

    第15章 面向对象编程OOP(Object-oriented programming)           面向对象编程基于三个基本概念:数据抽象.继承和动态绑定.      在 C++ 中,用类进行 ...

  7. C++ Primer(第4版)-学习笔记-第3部分:类和数据抽象

    第12章 类       每个类可以没有成员,也可以定义多个成员,成员可以是数据.函数或类型别名. 成员函数必须在类内部声明,可以在类内部定义,也可以在类外部定义.如果在类内部定义,就默认是内联函数. ...

  8. C++ Primer(第4版)-学习笔记-第2部分:容器和算法

    第9章 顺序容器 顺序容器和关联容器 顺序容器内的元素按其位置存储和访问. 关联容器,其元素按键(key)排序. 顺序容器(sequential container). 顺序容器的元素排列次序与元素值 ...

  9. C++ Primer(第4版)-学习笔记-第1部分:基本语言

    第1章  快速入门 每个C++程序都包含一个或多个函数,而且必须有一个命名为main. main函数是唯一被操作系统显式调用的函数,main函数的返回值必须是int或者void(无返回值) 函数体是函 ...

随机推荐

  1. win32gui.EnumWindows my.os.EnumWindows.py

    import win32guidef _MyCallback(hwnd, extra): windows = extra temp = [] temp.append(hex(hwnd)) temp.a ...

  2. struts2基础代码实现

    结构图: load.jsp <%@ page language="java" import="java.util.*" pageEncoding=&quo ...

  3. mysql自增主键在大量删除后如何重新设置避免断层

    alter table tt auto_increment=8; 表tt mysql> select * from tt; +----+ | id | +----+ | 1 | | 2 | | ...

  4. "git rm" 和 "rm" 的区别(转载)

    转自:http://yang3wei.github.io/blog/2013/02/03/git-rm-he-rm-de-qu-bie/ 这是一个比较肤浅的问题,但对于 git 初学者来说,还是有必要 ...

  5. Android 在eclipse中没有出现AVD的解决方法(转载)

    转自:http://frabbit2013.blog.51cto.com/1067958/1243549 本文主要介绍在系统中成功配置好Android开发环境(即SDK is ok and ADT o ...

  6. oracle给用户授权

    1.在PLSQL里,用sys(oracle系统用户)登陆,登陆的时候一定要选择SYSDBA.普通用户登陆选择normal就可以了 2.创建用户 *也可以给普通用户授权为dba即数据库管理员.在导入导出 ...

  7. bzoj 1630: [Usaco2007 Demo]Ant Counting【dp】

    满脑子组合数学,根本没想到dp 设f[i][j]为前i只蚂蚁,选出j只的方案数,初始状态为f[0][0]=1 转移为 \[ f[i][j]=\sum_{k=0}^{a[i]}f[i-1][j-k] \ ...

  8. bzoj 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛【二分+贪心】

    二分答案,贪心判定 #include<iostream> #include<cstdio> #include<algorithm> using namespace ...

  9. bzoj 1641: [Usaco2007 Nov]Cow Hurdles 奶牛跨栏【Floyd】

    先跑一遍取max版的Floyd,直接用数组回答询问即可 #include<iostream> #include<cstdio> using namespace std; con ...

  10. 启动VMware环境下的Linux操作系统,添加新分区

    启动VMware环境下的Linux操作系统,添加新分区,需要root账号身份. 3.1 [fdisk -l] 最大分区为/dev/sda3,说明新创建的分区将会是sda4 3.2 输入[fdisk / ...