重载是指同一个类中函数名相同参数不同(virtual可有可无)的情况
覆盖是指基类和派生类中函数名参数相同,基类函数必须有virtual关键字的情况
隐藏是指基类和派生类之间有以下2中情况(1,函数名相同参数不同virtual可有可无 || 2,函数名参数相同,基类函数无virtual关键字)
(覆盖: 基类virtual函数,派生类有同名相同参数函数时会覆盖基类原函数,即使派生类转成基类指针也访问不到基类原函数,访问的一定是派生类的函数
而藏的情况只要把指针转成基类的指针就可以访问到基类的函数)
指针和引用区别
(相同点:都是地址的概念,指针指向一块内存,内容是所指内存的地址; 引用是某块内存的别名
区别:指针变量需要编译器为它分配4个字节的内存,而引用不占任何内存空间,且引用一定不能为空,引用没有const)
vector,deque,list优缺点,适用情况
vector(就是动态数组,元素连续存放,有保留内存,如果内存空间不够时,会申请一块足够大的内存并进行内存的拷贝,由于内存空间连续,所以在中间进行插入和删除会造成内存块的拷贝,这些都大大影响了vector的效率,对任何元素访问都是O(1),也就是常数,适合做随机访问容器)
list(就是双向链表,元素也在堆中存放,它的内存空间可以是不连续的,通过指针来进行数据访问,这个特点使得它的随机存取效率很低,因为没有[]操作符的重载,但可以很好的支持任意地方的插入和删除.list没有空间预留,插入元素要分配内存,删除元素要释放内存,适合做随机操作容器)
deque(是双端队列,也是在堆中保存内容的,deque可以在前后快速的添加删除元素,有很高的随机访问速度,支持[]操作符,deque是按页或块来分配存储器的,每页包含固定数目的元素,页与页之间有指针指向,像是list和vector的结合品.vecotr只在尾端插入元素才有效率,而deque在前后端都提供常数时间的插入删除操作,而且体积增长方面也比vectgor更具有效率.)
一般原则(1,需要高效的随机存取,而不在乎掺入和删除的效率用vector. 2,需要大量的插入和删除,而不在乎随机存取用list. 3,需要随机存取,并且关心两端数据的插入和删除用deque.)
指针的几种典型应用情况
int *p[n]; -----指针数组,每个元素均为指向整型数据的指针
int (*)p[n]; ------p为指向一维数组的指针,这个一维数组有n个整型数据
int *p(); ----------函数带回指针,指针指向返回的值
int (*)p(); ------p为指向函数的指针
内联函数,构造函数,静态成员函数不能为virtual函数.
内存分配方式有三种
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存
Extern "c"是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数.这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++能直接调用C函数,加上extren "c"后,C++就能直接调用C函数了.
Extern "c"主要使用正规DLL函数的引用和导出和在C++包含C函数或C头文件时使用.使用时在前面加上extern "c" 关键字即可.