dynamic_cast
54. RTTI核心: typeid运算符 typeinfo类
(1) operator ==;
(2).operator !=;
(3).返回被测对象类型名const char* name()const;
(4).判断两个对象定义的先后关系 bool befer(…)const;
typeid(对象名/类型名)返回一个记录着目标类的类型的typeinfo类的对象
55. 模板:参数类型化的技术
(1).函数模板: 功能相同但类型不同的函数制造模型
Template
模板函数式由函数模板生成的函数(编译时生成)
Template
T abs (T x) { return x<0 -x:x; }
具现: int n = -5;
Cout <
无参函数模板必须采用显示实例化;
模板函数也可以内联;
(2). 类模板: 相同属性和功能的类的模型,创建成员布局相同的多个类。
类模板的模参可含有类型默认值:
Template
Class MyArray {
T m_A[len]; //编译完后Len已经为常量
Void push(T value);
};
每个成员函数实现时,无论是否使用到模参,都必须带模板头:
Template
Void MyArray
类模板必须显示实例化:
MyArray
模板参数默认值为模板:
Template
Class stack { Sequece container; };
Stack
Stack
Stack
56. 异常处理 : try throw catch
Throw负责发现异常报警,产生并抛掷异常对象,函数声明中称为“异常接口声明”;
Try设置侦错范围,即保护段;
Catch 负责处理异常的捕获;
异常处理机制靠类型匹配的,异常对象建立在专用的异常栈上而非函数栈,因而可跨越函数传递;
不要将局部对象的地址或引用作为异常对象抛出;
Throw必须用if等判断语句,触发建立异常栈,生成异常对象;
Catch只要勉强匹配就会忽略后面,catch(…)为万能匹配,应该安排在最后面;
全局对象在编译时确定,不能被捕获异常;
异常接口声明,列出函数可能抛掷的异常:
Void Fun() throw (A, B, C, D) 表明可能抛四种异常;
Void Fun() 表名可能抛出任何类型的异常;
Void Fun() throw () 不抛掷任何类型的异常;
Catch的参数应该使用引用或者指针,而不是值传递,这样才可以启用多态;l
派生类成员函数的异常声明至少应该与基类异常一致。
57. 标准模板库STL
STL六大组件: 容器,迭代器,算法,函数对象(仿函数),空间配置器(allocator),适配器;
(1).容器: 七种基本容器,三种扩展容器
基本容器: Vector, deque, list, set, multiset, map, multimap前三个为线性,后四个为平衡二叉搜索树(红-黑树);
扩展容器: 栈 ,队列, 优先队列(priority_deque);
类容器/近容器: string, bitset, valarray, 数组;
引用不可以做容器的元素,但指针可以,因为引用创建时必须初始化,且容器仅支持对象语义;
双端队列deque: 顺序容器,支持下标运算,本质上是两头开放的数组,没有容量的概念;
关联容器: 逻辑上非线性,即无序,不需要预留空间,也不存在内存再分配,一般采用红黑树作为底层存储;不可以直接对关联容器的元素对象直接修改,使用const_iterator.
Set容器: 值是单一的,不允许有重复,元素是升序的,set
Map容器: 一个个的key/value对-----pair对象;key不可重复,operator[]()返回key所对应的value;若key不存在则创建一个对象加入;
(2). 适配器: 使用组合或者聚集改造的别的类(7中基本容器)
Stack栈默认基于deque,还可以基于vector,list;
Queue 和priority_queue都在
(3). 函数对象
任何普通函数和重载了operator()的类对象都满足函数对象的特征;
十五个函数对象分为算术运算、关系运算、逻辑运算三种;
(4). 迭代器: 面向对象版的指针,指向容器中元素的相对位置,和普通指针用法基本相同;
分类: 输入迭代器
输出迭代器
前向迭代器
双向迭代器
随机访问迭代器
容器的适配器不支持迭代器;
所有的algorithms前两个参数都是一组iterators构成的[first,last)区间;
迭代器的适配器: back_insert_iterator
Front_insert_iterator
Insert_iterator
逆向迭代器1个,修饰除前进迭代器以外的迭代器,vector
输出流迭代器2个: ostream_iterator
输入流迭代器2个: istream_iterator
迭代器失效的原因: 底层存储发生变化,造成迭代器失效的函数有:reserve(), resize(), erase(), clear(), insert(), sort(), copy(), replace(), remove(), unique()以及求交、并、差集的泛型算法;
扩充迭代器功能的辅助函数有:
Advance()迭代器位置增加 p+n
Distance() p1-p2
Iter_swap() 元素交换