c++提供两种模板机制:
- 函数模板
- 类模板
概念:模板就是建立通用模具,提高代码复用性
函数模板的基本语法
函数模板的作用:
建立一个通用函数,其函数返回值类型和形参类型可以不具体规定, 用一个虚拟的类型来表示。
语法:
template//函数声名和定义
例:
#incldueusing namespace std; //交换函数 template void MySwap(T &a , C &b) { T c = a; a = (C)b; b = (T)c; } int main() { int a = 1; char b= 'P'; cout<(a,b) ------显示指定类型 MySawp(a,b); cout< 函数模板注意事项 1、自动类型推导,必须推导出一致的数据类型 2、(显示指定类型)模板必须要确定出T的数据类型普通函数和函数模板的区别1、普通函数可以发生自动类型转换(隐式类型转换) 2、函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换 3、如果利用显示指定类型的方式,可以发生隐式类型转换普通函数和函数模板的调用规则1、当函数模板和普通函数都可以实现(即同名-重载),优先调用普通函数 2、可以通过空模板参数列表来调用调用函数模板 `MySwap<>(a,b)---空模板 ` 3、函数模板可以发生重载 4、如果韩式模板可以发生跟好的匹配结果优先调用函数模板模板的局限性有些特定的数据类型,需要用具体化的方式做特殊实现
#include类模板 类模板的作用#include using namespace std; class Student { public: string name; int id; Student(string a, int b) { name = a; id = b; } }; template T Max_(T a, T b) { if (a > b) return a; else return b; } //函数模板重载,具体化操作 template<> Student Max_(Student a, Student b) { if (a.id > b.id) return a; else return b; } int main() { Student A("张三",189891334); Student B("李四",132814195); cout << Max_(A, B).id << endl; } 建立一个通用类,类中的数据成员类型可以不作制定,用一个虚拟的数据类型表示。语法template类模板和函数模板区别类 ·类模板没有自动推导数据类型 ·类模板的模板参数列表可以有默认参数类模板和普通类区别·普通类成员函数在一开始就创建 ·模板类成员函数在调用阶段才创建类模板对象作函数参数·指定传入类型 ·参数模板化 ·整个类模板化演示–类模板对象作函数参数#include类模板的继承#include using namespace std; //模板类 template class A { public: T name; TT id; A(T a, TT b) { name = a; id = b; } void Show_() { cout << "Name:" << name << endl; cout << "id:" << id << endl; } }; //指定传如类型 void Print_1(A a) { a.Show_(); } void test_1() { //类模板实例化对象 A AA("张三",0001); Print_1(AA); } //参数模板化 template void Print_2(A a) { a.Show_(); } void test_2() { A AA("李四", 0002); Print_2(AA); } //整个类模板化 template void Print_3(T a) { a.Show_(); } void test_3() { A AA("王五", 0003); Print_3(AA); } int main() { test_1(); test_2(); test_3(); } 类模板继承注意一下几点 ·当子类继承的父类是一个类模板时,子类在声明的时 候要指定出父类中T的类型 ·如果不指定,编译器无法给子类分配内存 ·如果像灵活的指定父类中的T类型,子类也需变成类模板类模板成员函数类外实现示例
#include类模板的分文件编写 问题#include using namespace std; //模板类 template class A { public: T name; TT id; A(T a, TT b) void Show_() }; //构造函数类外实现 template A ::A(T a,TT b) { name = a; id = b; } //成员函数类外实现 emplate void A ::Show_() { cout << "Name:" << name << endl; cout << "id:" << id << endl; } 类模板的成员函数的创建时机时调用阶段,会导致分文件编写时链接不到 模板类能否实例化创建特例,不仅仅需要模板的声明,而且还需要模板的定义,以及是否有模板的参数列表解决方案、--- cpp文件中直接包含他本身cpp文件C++中类模板分文件编写出现问题 解决方法:直接在main(使用他成员函数的文件)中包含.cpp 文件 ---将声明和文件放到同一个文件中,并将后缀改成.hpp,.hpp是约定后缀 ,并不强制类模板与友元--- 类内实现,直接写 --- 类外实现 先做函数模板声明,下方在做函数模板定义,在做友元。如果声明了函数模板,可以将实现写到后边,否则要将实现体写到类前边让编译器提前看见类外实现示例##include#include using namespace std; template class A; //因为他使用了A这个模板类,所以要让这个编译器知道这个模板类存在 template void Show_(A P) { cout << "Name:" << P.name << endl; cout << "id:" << P.id << endl; } //模板类 template class A { public: T name; TT id; A(T a, TT b) { name = a; id = b; } //加空模板参数列表<> //如果该友元函数类外实现,需要编译其提前知道这个函数存在(因为这个函数已经变成了函数模板) friend void Show_<>(A P); }; void Test_() { A AA("李四",111); Show_(AA); } int main() { Test_(); }



