本部分罗列了本章的难点或注意点,以便复习巩固或者回忆,关注私聊我可以免费领取pdf版C++ Primer Plus 第6版。
-
初始化列表包含多个项目时,初始化顺序为它们被声明的顺序,而不是它们在初始化列表中的顺序
-
has-a 包含对象的类 私有继承
-
私有继承,类继承实现,但基类的公有成员和保护成员都将成为派生类的私有成员
-
私有继承初始化,构造函数使用成员初始化省略了显式对象名称,而使用类名
-
私有继承使用类名和作用域解析运算符来调用基类
-
私有继承,通过强制转换来访问基类对象
-
在私有继承中,在不进行显示类型转换的情况下,不能讲指向派生类的引用或指针赋给基类引用或指针
-
通常使用包含来简历has-a;如果新类需要访问原有类的保护成员,或需要重新定义虚函数,则应使用私有函数
-
保护继承,基类的公有成员和保护成员都将成为派生类的保护成员,和私有继承一样,基类的接口在派生类中可用,但在继承层次结构之外是不可用的
-
继承表p550
-
派生类可以使用私有基类的方法:定义一个使用该基类方法的派生类方法;将函数调用包装在另一个函数调用中,即使用using声明来指出派生类可以使用特定的基类成员,即使采用的是私有派
class Student:private std::string,std::valarray<double>{ ... public: using std::valarray<double>::min; double Student::sum() const{ return std::valarray<double>::sum() } }
-
如不指出继承方式,编译器默认为私有继承
-
虚基类使得从多个类派生出的对象只继承一个基类对象
-
如果基类是虚的时,禁止信息通过中间类自动传递给基类,需要显式地调用所需的基类构造函数
SingingWaiter(const Worker &wk,int p = 0,int v = Singer::other):Worker(wk),Waiter(wk,p),Singer(wk,v){}
-
多重继承可能导致函数调用的二义性,使用作用域解析运算符;重新定义函数
-
多重继承的模块化方式p559
-
派生类的名称优先于直接或间接祖先类中的相同名称,如果都不是对方的基类将造成二义性,虚二义性规则与访问规则无关
-
模板内中,如果在声明中定义了方法,则可以省略模板前缀和类限定符
-
不能把模板成员函数放在独立的实现文件中,因为模板不是函数,不能单独编译,因此,可以将模板信息放在一个头文件中
-
使用模板类必须显式地提供所需类型,这与常规的函数模板是不同的,因为编译器可以根据函数的参数类型来确定要生成哪种函数
-
指针栈的正确应用p573
-
允许指定数组大小的简单数组模板:在类中使用动态数组和构造函数参数来提供元素数目;使用模板参数来提供常规数组的大小template<calss T,int n>这种参数称为非类型或表达式参数
-
表达式参数有一些限制,可以是整型、枚举、引用、指针。double是非法,double*是合法的。另外,模板代码不能修改参数的值,也不能使用参数的地址。最后,实例化模板时,用作表达式参数的值必须是常量表达式
-
表达式参数方法使用的是自动变量维护内存栈,执行速度更快
-
表达式参数缺点:每种数组大小都将生成自己的模板,也就是每个类声明不一样。而动态数组和构造函数参数的方式只有一个类声明
-
模板可以递归使用
ArrayTP<ArrayTP<int,5>,10> twodee;//int twodee[10][5]
-
可以使用多个类型参数
template<class T1,class T2>
-
可以使用默认类型模板参数,但不能为函数模板参数提供默认值
template<class T1,class T2 = int>class A{}; A<double,double>a1; A<double>a2;
-
模板的具体化:隐式实例化、显式实例化、显式具体化、部分具体化P582
ArrayTP<int,100> stuff; //隐式实例化 ArrayTP<double,30> *pt; //no object needed yet pt = new ArrayTP<double,30>; //implicit instantiation template class ArrayTP<string,100>; //explicit instantiation必须位于模板定义所在的名称空间 template <typename T>class SortedArray{}; template <> class SortedArray<const char char*>{}; SortedArray<int> scores; //use general definition SortedArrat<const char*> dates; //use specialized definition template <class T1,class T2>class Pair{}; template <class T1> class Pair<T1,int>{};
-
成员模板 在模板类中声明一个模板类,可以在外部或者内部定义 外部定义要使用下面的语法
template <typename T> template <typename U>
-
将模板用作参数
template<template <template T>> class Thing> class Crab{}; Crab<Stack> s1; template<template <template T> class Thing,typename U,typename V> class Crab{}; Crab<Stack,int,double> s1;
-
模板类与友元:非模板友元;约束模板友元;非约束模板友元P558
-
约束模板友元的三个步骤:在类定义前声明每个模板函数;在类中再次将模板声明为友元,这些语句根据类模板参数的类型声明具体化;为友元提供定义
-
C++11 using =