1.字符串函数
函数声明:char *strcat ( char *desst, const char *src )
功能:连接字符串,将 src 字符串 拷贝到 dest 所指的字符串尾
函数声明:char *strcpy(char *dest, const char *src)
功能:复制字符串,将 src 字符串 复制赋值给 dest 所指的字符串尾
2.STL container
序列容器:动态数组vector,双端队列deque(本质是动态数组加索引),链表list
关联容器:set,map,multiset,multimap,bitset(叫bit_array更合适)。
容器适配器:stack,queue,priority_queue。
关于迭代器:
关联容器删除当前的iterator,只会使当前的iterator失效,只要在erase前,递增当前iterator即可。
序列式容器,删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor, deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。不过erase方法可以返回下一个有效的iterator,list使用了不连续分配的内存,但它的erase方法也会返回下一个有效的iterator。
3.初始化
在C++中,类的静态成员必须在类内声明,在类外初始化,像下面这样:
class A{
private:
static int count ; // 类内声明
};
int A::count = 0 ; // 类外初始化,不必再加static关键字
能在类中初始化的成员只有一种,那就是静态常量成员。
class A{
private:
static const int count = 0; // 静态常量成员可以在类内初始化
};
4.dynamic_cast 动态转换
dynamic_cast<>用于C++类继承多态间的转换,分为:
-
子类向基类的向上转型(Up Cast)
- 向上转型其几乎肯定是成功的,只需用将子类的指针或引用赋给基类的指针或引用即可,。
- 特殊情况:当处于多继承的类层次结构和虚拟基类时(即菱形非虚拟继承),upcast可能会有歧义。
-
基类向子类的向下转型(Down Cast)
-
向下转型不一定成功,必须存在虚函数,不然会出现编译错误
-
dynamic_cast将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理。
dynamic_cast涉及运行时类别检查,如果绑定到引用或指针的对象不是目标类型的对象,则dynamic_cast失败。如果是指针类型失败,则dynamic_cast的返回结果为0,如果是引用类型的失败,则抛出一个bad_cast错误。
-
5.多态,重写,重载
重载和重写的区别:
-
重载(overload):在同一个类中,函数名相同,参数列表不同,编译器会根据这些函数的不同参数列表,将同名的函数名称做修饰,从而生成一些不同名称的预处理函数,未体现多态。
-
重写(override):也叫覆盖,子类重新定义父类中有相同名称相同参数的虚函数,主要是在继承关系中出现的,被重写的函数必须是virtual的,重写函数的访问修饰符可以不同,尽管virtual是private的,子类中重写函数改为public,protected也可以,体现了多态。
多态分为两类:
- 静态多态: 函数重载 和 运算符重载属于静态多态,复用函数名
- 动态多态: 派生类和虚函数实现运行时多态
静态多态和动态多态区别:
- 静态多态的函数地址早绑定 - 编译阶段确定函数地址
- 动态多态的函数地址晚绑定 - 运行阶段确定函数地址
6.volatile关键字
volatile 关键字用于阻止编译器过度优化:
- 阻止编译器为了提高速度将一个变量缓存到寄存器内而不写回(单次读写的原子性)
- 阻止编译器调整操作 volatile 变量的指令顺序(有序性)
- 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。(实现可见性)