1. 使用公有继承时,类可以继承接口,可能还有实现(基类的纯虚函数提供接口,但不提供实现)。获得接口是is-a关系的组成部分。而使用组合,类可以获得实现,但不能获得接口,不继承接口是has-a关系的组成部分。
2. C++包含让程序员能够限制程序结构的特性——使用explicit防止单参数构造函数的隐式转换,使用const限制方法修改数据等等。这样做的根本原因是在编译阶段出现错误优于在运行阶段出现错误。
3. 当初始化列表包含多个项目时,这些项目被初始化的顺序为它们被声明的顺序,而不是它们在初始化列表中的顺序。
4. 使用私有继承,基类的公有成员和保护成员都将成为私有成员。私有继承提供的特性和包含相同:获得实现而不获得接口,所以,私有继承也可以用来实现has-a关系。
5. 包含 提供了被显式命名的对象成员,而私有继承提供了无名称的子对象成员。使用包含时将使用对象名来调用方法,而使用私有继承时将使用类名和作用域解析符来调用方法。这个方法并不适用于友元函数,然而可以通过显式的转化为基类来调用正确的函数。
6. 私有继承中,未进行显式类型转换的派生类引用或指针,无法赋值给基类的引用或指针。
7. 通常,应使用包含来建立has-a关系;如果新类需要访问原有类的保护成员,或需要重新定义虚函数,则应使用私有继承。
8. 使用一个using声明来指出派生类可以使用特定的基类成员,即使使用的是私有派生。
9. 与单继承一样,多继承表示的也是is-a关系,必须使用关键字public来限定每一个基类,否则编译器将认为是私有派生。
10. C++在基类是虚的时,禁止信息通过中间类自动传递给基类,即如果类有间接虚基类,则除非只需使用该虚基类的默认构造函数,否则必须显式调用该虚基类的某个构造函数,对于虚基类这是合法的,对于非虚基类,这是非法的。
11. 多重继承可能导致函数调用的二义性,一种方法是使用模块化方式,而不是递增方式,即提供一个祖先组件的方法和一个只显示父类组件的方法,然后在该类中组合起来。
12. 虚二义性规则与访问规则无关。
13. 不能将模板成员函数放在独立的实现文件中,在C++11之前,C++标准的确提供了关键字export,让您能够将模板成员函数放在独立实现的文件中,但支持该关键字的编译器不多,C++11不再这样使用关键字export,而将其保留用于其他用途。
14. 类模板必须显式提供所需类型,这与常规函数模板是不同的,因为编译器可以根据函数的参数类型来确定要生成哪种函数。
15. 指定特殊的类型而不是用作泛型名被称为非类型或表达式参数,这个参数可以是整型、枚举、引用或指针,模板代码不能修改参数的值,也不能使用参数的地址,实例化模板时,用作表达式参数的值必须是常量表达式。
16. 模板类可用作基类、组件类,还可以用作其他模板的类型参数。
17. C++98要求使用至少一个空白字符将两个>符号分开,以免与运算符>>混淆,C++11不要求那么做。
18. 可以为类模板类型参数提供默认值,但不能为函数模板参数提供默认值。然而可以为非类型参数提供默认值,这对于类模板和函数模板都是适用的。
19. 使用关键字template声明类的特定具体化时,将发生模板的显式实例化,这种情况下,编译器将使用通用模板生成实例,虽然尚未请求这个类的对象。
20. 模板的显式具体化是对于特定类型的定义。有时候,可能需要在为特殊类型实例化时,对模板进行修改,是其行为不同,在这种情况下,可以创建显式具体化。当具体化模板和通用模板都与实例化请求匹配时,编译器将使用具体化程度最高的版本。
21. C++还允许部分具体化,即部分限制模板的通用性,例如部分具体化可以给类型参数之一制定具体的类型。
22. 模板类也可以有友元,分为三类:非模板友元,它是模板所有实例化的友元;约束模板友元,即友元的类型取决于类被实例化时的类型,分为3步:首先,在类的定义前声明某个模板函数,然后再将模板声明为友元,这些语句根据类模板参数的类型声明具体化,最后为友元提供模板定义;非约束模板友元函数,即每个函数具体化都是每个类具体化的友元,友元函数模板类型参数与模板类类型参数不同。
23. C++11中的别名用法:使用using xx = xxx 来声明类型的别名
// 模板别名templateusing arrType = std::array ;arrType intArr;// 非模板别名using pc2 = const char *;