第一篇
CH1
1. 试图一下子就能写出一个完全成功的程序几乎是不可能的。
2. 一个简单的错误常常有很多关联影响,会使编译器报告的错误比实际要多得多。因此,一旦错误被改正后,应当马上重新编译。
3. 三个预定义iostream对象: cin、cout和cerr
CH2
1. 在C++中,数组不同于整数类型和浮点数类型,它不是C++语言的一等(first-class)公民。
2. 在C++中,指针的主要用处是管理和操纵动态分配的内存。
3. 静态与动态内存分配的两个主要区别是:1)静态对象是有名字的变量,我们直接对其进行操作;2)静态对象的分配与释放由编译器自动处理。
4. 内存泄漏(memory leak)是指一块动态分配的内存,我们不再拥有指向这块内存的指针,因此我们没有办法将它返还给程序供以后重新使用。
5. 类名代表的是一个新的数据类型,我们可以用它来定义这种类类型的对象,就像用内置的类型定义对象一样。
6. 类定义包括两个部分:类头(class head),由关键字class与相关联的类名构成。类体(class body),由花括号括起来,以分号结束。
7. 类的成员包括“该类能执行的操作”和“代表类抽象所必需的数据”。这些操作称为成员函数(member function)或方法(method)。
8. 公有成员提供了该类的公有接口(public interface)——即实现了这个类的行为的操作集合。它包括该类的所有成员函数,或者只包括其中一个子集。私有成员提供私有实现代码(private implementation)——即存储信息的数据。
9. 信息隐藏(information hiding):类的公共接口与私有实现代码的分离。
10. 在类定义中被定义的成员函数会被自动当作是内联函数(inline function)。此外我们也可以用inline 关键字显式地要求一个函数被视为内联函数。
11. 程序设计中的一个常见错误是使用事先并没向被正确初始化的对象,所以C++为用户定义的类提供了一种自动初始化机制:类构造函数(class constructor)。
12. 构造函数是一种特殊的类成员函数,专门用于初始化对象。如果构造函数被定义了,那么在类的每个对象第一次被使用之前,这构造函数就被自动应用在对象上。
13. 构造函数的名字与类的名字相同,不能给构造函数指定返回值,并且可以给类定义多个构造函数。
14. 函数重载(function overloading)允许两个或更多个函数使用同一个名字,限制条件是它们的参数表必须不同:参数类型不同,或参数的数目不同。
15. 缺省构造函数(default constructor)不需要用户提供任何参数。
16. C++类的关键特征是接口与实现的分离。接口是一些“用户可以应用到类对象上的操作”的集合。它由三部分构成:这些操作的名字,它们的返回值,以及它们的参数表。
17. 在C++中被继承的类被称作基类(base class)。新类被称作从基类派生(derived)而来,把它叫做基类的派生类(derived class)或子类型(subtype)。
18. 子类型与基类共享公共的接口(common interface)——公有操作的公共集。类之间的类型/子类型关系形成了继承或派生层次关系(inheritance or derivationhierarchy)。
19. 在继承机制下有多个类的提供者:一个提供基类实现(可能还有一些派生类),另外一个或多个提供者在继承层次的生命周期内提供派生类。
20. C++提供了另外一个访问级别:保护(protected)级别。在类的保护区域内的数据成员和成员函数,不提供给一般的程序,只提供给派生类。
21. 派生类对象的初始化过程是这样的,首先自动调用每个基类的构造函数来初始化相关的基类子对象,然后再执行派生类的构造函数。
22. 异常(exception)是指在运行时刻程序出现的反情形;异常处理(exception handling)为“响应运行时刻的程序异常”提供了一个标准的语言级的设施。
23. 关键字namespace后面的名字标识了一个名字空间,它独立于全局名字空间,我们可以在里面放一些希望声明在函数或类之外的实体。名字空间并不改变其中的声明的意义,只是改变了它们的可视性。
24. 名字空间别名(namespace alias)允许用一个可替代的、短的或更一般的名字与一个现有的名字空间关联起来。
25. using指示符(using directive)使名字空间内的所有声明都可见,这样这些声明能够不加限定地使用。
26. using声明(using declaration)提供了选择更为精细的名字可视性机制,它允许使名字中的单个声明可见。
27. 我们实现的(Array)类模板与vector类模板的实现之间有两个主要区别:第一个区别是vector类模板支持“向现有的数组元素赋值”的概念以及“插入附加元素”的概念——即vector数组可以在运行时刻动态增长(如果程序员希望使用这个特性的话)。第二个区别是更加广泛,代表了设计方法的重要转变。
28. 能够应用到向量上的操作:搜索(search)算法,分类排序(sorting)与通用排序(ordering)算法,删除(deletion)算法,算术(numeric)算法,生成(generation)和变异(mutation)算法,关系(relational)算法。