
目录一、模板的概述二、函数模板1、关键字template说明2、注意点三、类模板1、定义2、函数模板作为类模板的友元3、普通函数作为类模板的友元四、类模板的继承1、类模板 派生出 普通类2、类模板 派生出 类模板3、类模板头文件 和源文件不可分离五、设计数组类模板六、C中类型转换1、上行、下行转换2、static_cast静态类型转换3、dynamic_cast静态类型转换4、const_cast常量转换1常量之间可直接 const属性转换1将const修饰的指针或引用 转换成 非const2将非const修饰的指针或引用 转换成 const5、重新解释转换(reinterpret_cast) 最不安全一、模板的概述c面向对象编程思想封装、继承、多态c泛型编程思想模板模板的分类函数模板、类模板函数模板类模板将功能相同类型不同的函数类的类型抽象成虚拟的类型(函数类型和形参类型不具体指定)。不必定义多个函数当调用函数类实例化对 象的时候编译器自动将虚拟的类型 具体化。二、函数模板1、关键字template说明函数模板 会编译两次第一次对函数模板 代码本身编译第二次函数调用处 将T的类型具体化替换后的代码进行编译函数模板目标模板是为了实现泛型可以减轻编程的工作量增强函数的重用性。2、注意点1函数模板 和 普通函数 都识别同名时优先选择 普通函数。2函数模板 和 普通同名函数 都存在时强制使用函数模板3有函数模板 自动类型推导时一般不会对其函数参数 进行 自动类型转换普通函数会自动类型转换。4函数模板可以重载5模板的局限性当函数模板 推导出 T为数组、结构体或其他自定义类型数据 可能导致运算符 不识别。解决办法1运算符重载解决办法2具体化函数模板三、类模板1、定义有两个或多个类其功能是相同的仅仅是数据类型不同。类模板用于实现类所需数据的类型参数化。类模板 将类中类型 抽象成虚拟类型类模板 的成员函数 在类外实现2、函数模板作为类模板的友元3、普通函数作为类模板的友元四、类模板的继承1、类模板 派生出 普通类2、类模板 派生出 类模板3、类模板头文件 和源文件不可分离类模板存储在.hpp头文件和源文件结合中data.hpp#ifndef DATA_H #define DATA_H #includeiostream using namespace std; templateclass T1,class T2 class Data { private: T1 a; T2 b; public: Data(); Data(T1 a,T2 b); void showData(void); }; templateclass T1, class T2 DataT1, T2::Data() { cout无参构造endl; } templateclass T1, class T2 DataT1,T2::Data(T1 a, T2 b) { this-aa; this-bb; } templateclass T1, class T2 void DataT1,T2::showData(void) { couta bendl; } #endif // DATA_H主测试程序main.cpp#include iostream #includedata.hpp using namespace std; int main(int argc, char *argv[]) { Dataint,char ob(10,A); ob.showData(); return 0; }五、设计数组类模板六、C中类型转换1、上行、下行转换2、static_cast静态类型转换类型转换(cast)是将一种数据类型转换成另一种数据类型。static_cast静态类型转换用于类层次结构中基类父类和派生类子类之间指针或引用的转换。基本类型支持int num static_castint(3.14);//3.14转成int类型ok定义三个无数据类如下class Base{}; class Son:public Base{}; class Other{};上行转换支持 安全Base *p static_cast(new Son);下行转换支持 不安全Son *p2 static_cast(new Base);不相关类型转换不支持Base *p3 static_cast(new Other);//err报错3、dynamic_cast静态类型转换dynamic_cast主要用于类层次间的上行转换和下行转换。在类层次间进行上行转换时dynamic_cast 和static_cast的效果是一样的;在进行下行转换时dynamic_cast具有类型检查的功能比.static_cast更安全。基本类型不支持int num static_castint(3.14);//err上行转换支持Base *p static_cast(new Son);下行转换不支持 不安全Son *p2 static_cast(new Base); //err不相关类型转换不支持Base *p3 static_cast(new Other);//err4、const_cast常量转换该运算符用来修改类型的const属性。1常量之间可直接 const属性转换const int num110; int data1num1; int num210; const int data2num2;1将const修饰的指针或引用 转换成 非constconst int *p1; int *p2 const_castint *(p1); const int ob 10; int ob1 const_castint (ob);2将非const修饰的指针或引用 转换成 constint *p3; const *p4 const_castint *(p3);//或const *p4 p3 int data 10; const int ob2 const_castconst int (data);//或const int ob2 data;5、重新解释转换(reinterpret_cast) 最不安全除基本类型不可强转其他均可强制类型转换。