C++ Primer Plus 第6版 学习笔记-chapter14

本部分罗列了本章的难点或注意点,以便复习巩固或者回忆,关注私聊我可以免费领取pdf版C++ Primer Plus 第6版。

  1. 初始化列表包含多个项目时,初始化顺序为它们被声明的顺序,而不是它们在初始化列表中的顺序

  2. has-a 包含对象的类 私有继承

  3. 私有继承,类继承实现,但基类的公有成员和保护成员都将成为派生类的私有成员

  4. 私有继承初始化,构造函数使用成员初始化省略了显式对象名称,而使用类名

  5. 私有继承使用类名和作用域解析运算符来调用基类

  6. 私有继承,通过强制转换来访问基类对象

  7. 在私有继承中,在不进行显示类型转换的情况下,不能讲指向派生类的引用或指针赋给基类引用或指针

  8. 通常使用包含来简历has-a;如果新类需要访问原有类的保护成员,或需要重新定义虚函数,则应使用私有函数

  9. 保护继承,基类的公有成员和保护成员都将成为派生类的保护成员,和私有继承一样,基类的接口在派生类中可用,但在继承层次结构之外是不可用的

  10. 继承表p550

  11. 派生类可以使用私有基类的方法:定义一个使用该基类方法的派生类方法;将函数调用包装在另一个函数调用中,即使用using声明来指出派生类可以使用特定的基类成员,即使采用的是私有派

    class Student:private std::string,std::valarray<double>{
    ...
    public:
        using std::valarray<double>::min;
        double Student::sum() const{
            return std::valarray<double>::sum()
        }
    }
  12. 如不指出继承方式,编译器默认为私有继承

  13. 虚基类使得从多个类派生出的对象只继承一个基类对象

  14. 如果基类是虚的时,禁止信息通过中间类自动传递给基类,需要显式地调用所需的基类构造函数

    SingingWaiter(const Worker &wk,int p = 0,int v = Singer::other):Worker(wk),Waiter(wk,p),Singer(wk,v){}
  15. 多重继承可能导致函数调用的二义性,使用作用域解析运算符;重新定义函数

  16. 多重继承的模块化方式p559

  17. 派生类的名称优先于直接或间接祖先类中的相同名称,如果都不是对方的基类将造成二义性,虚二义性规则与访问规则无关

  18. 模板内中,如果在声明中定义了方法,则可以省略模板前缀和类限定符

  19. 不能把模板成员函数放在独立的实现文件中,因为模板不是函数,不能单独编译,因此,可以将模板信息放在一个头文件中

  20. 使用模板类必须显式地提供所需类型,这与常规的函数模板是不同的,因为编译器可以根据函数的参数类型来确定要生成哪种函数

  21. 指针栈的正确应用p573

  22. 允许指定数组大小的简单数组模板:在类中使用动态数组和构造函数参数来提供元素数目;使用模板参数来提供常规数组的大小template<calss T,int n>这种参数称为非类型或表达式参数

  23. 表达式参数有一些限制,可以是整型、枚举、引用、指针。double是非法,double*是合法的。另外,模板代码不能修改参数的值,也不能使用参数的地址。最后,实例化模板时,用作表达式参数的值必须是常量表达式

  24. 表达式参数方法使用的是自动变量维护内存栈,执行速度更快

  25. 表达式参数缺点:每种数组大小都将生成自己的模板,也就是每个类声明不一样。而动态数组和构造函数参数的方式只有一个类声明

  26. 模板可以递归使用

    ArrayTP<ArrayTP<int,5>,10> twodee;//int twodee[10][5]
  27. 可以使用多个类型参数

    template<class T1,class T2>
  28. 可以使用默认类型模板参数,但不能为函数模板参数提供默认值

    template<class T1,class T2 = int>class A{};
    A<double,double>a1;
    A<double>a2;
  29. 模板的具体化:隐式实例化、显式实例化、显式具体化、部分具体化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>{};
  30. 成员模板 在模板类中声明一个模板类,可以在外部或者内部定义 外部定义要使用下面的语法

    template <typename T>
        template <typename U>
  31. 将模板用作参数

    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;
  32. 模板类与友元:非模板友元;约束模板友元;非约束模板友元P558

  33. 约束模板友元的三个步骤:在类定义前声明每个模板函数;在类中再次将模板声明为友元,这些语句根据类模板参数的类型声明具体化;为友元提供定义

  34. C++11 using =

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值