基础知识点 | 1020_STL容器,dynamic_cast,重写重载和volatile等知识点

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 关键字用于阻止编译器过度优化:

  1. 阻止编译器为了提高速度将一个变量缓存到寄存器内而不写回(单次读写的原子性)
  2. 阻止编译器调整操作 volatile 变量的指令顺序(有序性)
  3. 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。(实现可见性)

上一篇:AcWing 1020. 潜水员 二维费用的背包问题 求最小


下一篇:牛客网 华为 机试 HJ16 购物单