什么是多态:
一个接口,多种方法。
主要通过虚函数来实现。基类的函数前面加上virtual ,在派生类中重写该函数,运行时根据对象的实际类型来调用相应的函数,对象是派生类,就调用重写的函数(没有重写就默认为基类的)。
虚函数表:
如果一个类中有虚函数,这个类就会包含一张虚函数表,虚函数表存储的每一项是一个虚函数的地址。
虚指针会存在于对象实例地址的最前面,保证虚函数表有着最高的性能,这个虚指针指向虚函数表。
还有多继承和虚继承,它们都有所不同(待更)
类中四大默认函数:
class a{
public:
a(){} //构造函数
~a(){} //析构函数
a(const a &b){} //拷贝构造函数
a&operator=(const a &b){} //赋值函数
};
- 对象不存在,要创建它,无其它对象给它初始化 —— 调构造函数
- 对象不存在,要创建它,有其它对象给它初始化 —— 调构造拷贝函数
- 对象已存在,要改变它的值,用其他对象给他来赋值 —— 调赋值函数
- 删除对象 —— 调用析构函数
指针和引用的区别:
指针是一个实体,引用只是别名
指针存储的是变量的地址
引用只能在定义是初始化,后面不可以修改,而指针可以
引用没有const,指针有,const的指针不可变
引用不可以为空,指针可以
sizeof引用得到的是所指变量的大小,而sizeof指针得到的是指针本身的大小。
到这里可以讲一讲值传递,指针传递,引用传递
值传递:顾名思义,只是将值传了过去,函数对形参的修改不会影响原来的变量。
指针传递:指针指向的是变量的地址,传递的时候就是将地址传给形参,函数对指针的改变会影响原来的变量。
引用传递:别名,相当于对原来的变量直接操作。
指针常量和常量指针的区别
指针常量:
int a,b;
int *const p=&a
本质是常量,只不过以指针修饰
p=&b; //wrong
*p=1; //true
常量指针:
int a,b;
const int *p=&a;
本质是指针
p=&b; //true
*p=1; //wrong
vector:
vector相当于一个动态的数组
vector里的元素都是按连续地址存放的,当声明一个vector时会自动分配一个大小,不过当我们push足够多的元素使得这个空间已经满了的时候,它就会重新分配一个目前内存1.5-2倍的新内存区,将原数组复制过去再进行操作。
而且vector的内存只增不减,假设初始内存大小可以放50个元素,当我们要放51个元素是,它重新分配一个可以放100的内存(原来的那50内存就通过析构函数释放了),而后我们就算删除vector里面的元素直到只剩1个元素时,它的内存大小还是100。
但是我们知道它有很多多余的空间,我们可以调用shrink_to_fit()这个函数来回收多余的空间。
set, map:
底层原理都是通过红黑树实现
红黑树的原理:
1. 节点都是红色或者黑色的
2. 根节点是黑色的
3. 每个叶节点(包含NULL)是黑色的
4. 每个红色节点的子节点都是黑色的(相邻的两个节点不都为红色)
5. 从任一节点到其每个叶子节点的所有路径都包含相同数量的黑色节点
保持树的平衡,虽然对比平衡树来说牺牲了一些平衡,但降低了插入和删除的复杂度
(先这样,后面我再慢慢更新,STL里的其它东西我也会讲)
笔记:
待更新 操作系统,计算机网络
TIME_WAIT
进程和线程的区别