顺序容器

vector有多个构造函数默认的构造函数是构造一个初始长度为0的内存空间且分配的内存空间是以2的倍数动态增长的在push_back的过程中若发现分配的内存空间不足则重新分配一段连续的内存空间其大小是现在连续空间的2倍在将原先空间中的元素复制到新的空间中性能消耗较大
vector在尾端增添数据拥有比较好的性能
vector内部实现实际上是动态数组分配好了一块内存空间

如果你需要高效的随机存取而不在乎插入和删除的效率使用vector

如果你需要大量的插入和删除而不关心随机存取则应使用list

如果你需要随机存取而且关心两端数据的插入和删除则应使用deque

非类型参数

非类型参数只能是整数枚举类型指向外部链接的指针

非类型参数不能是一个浮点类型和类类型

抽象类

包含有纯虚函数的类称作抽象类
纯虚函数
‘virtual void Test(void)=0;’
基类不需要实现函数提供模板为子类使用
抽象类不能创建对象因为纯虚函数没有实现功能
可以作为引用或者指针的类型
子类继承抽象类时必须实现抽象类里面的全部纯虚函数否则子类也为抽象类

虚析构函数

若子类继承基类两者析构函数不加virtual关键字此时调用函数 参数为基类指针指向子类对象 删除对象那么只会执行基类构造函数此时对于编译器而言你传进去的基类指针在函数体已经静态编译好为基类的构造函数

如果在基类的析构函数前加上virtual关键字此时对于子类的析构函数也会自动加上virtual关键字从而加入到虚函数表中再调用上面的函数会首先寻找调用子类的析构函数此时在子类的析构函数最后面编译器会自动执行基类的析构函数

隐藏

当子类继承基类时若函数名相同参数名不同此时基类有没有virtual关键字函数都将被隐藏
当子类继承基类时若函数名相同参数相同基类没有virtual关键字此时基类函数将被隐藏

多态总结

1.基类(父类)里面的方法是用virtual关键字修饰变成虚函数

2.子类继承父类重写父类里面的方法

3.用父类的指针或引用指向子类对象

4.通过父类指针或引用调用子类重写的父类方法

静态多态是编译器在编译期间完成的编译器会根据实参类型来选择调用合适的函数如果有合适的函数就调用没有的话就会发出警告或者报错

静态多态:函数重载泛型编程

动态多态是在程序运行时 根据基类的引用指向的对象来确定自己具体该调用哪一个类的虚函数

动态多态虚函数

作用:把不同的子类对象都当作父类来看可以屏蔽不同子类对象之间的差异写出通用的代码做出通用的编程以适应需求的不断变化多态是设计模式的基础多态是框架的基础

继承和组合

继承格式

class 派生类名:继承方式 基类名1<span class="bd-box"><h-char class="bd bd-beg"><h-inner>,</h-inner></h-char></span>继承方式 基类名2<span class="bd-box"><h-char class="bd bd-beg"><h-inner>,</h-inner></h-char></span>.... { 派生类类体 };
继承方式有:public , protected,private

基类构造函数的调用必须在派生类的初始化列表中指定传递参数如果没有指定则默认调用基类无参数的构造函数

派生类对象仍无法直接访问基类的private成员变量

构造函数调用顺序:
先按照继承时的顺序挨个调用基类的构造函数然后调用派生类的构造函数

析构函数调用顺序和构造函数调用顺序相反

const用法

const 修饰的成员变量只能在构造函数的参数列表中初始化
const 修饰的成员函数不能改变成员变量的值
定义:
void function(void) const
const 修饰的对象只能调用常成员函数不能调用非 常成员函数