1、为什么要使用模板?
比如我现在想要获得两个数中较大的一个,那就有个问题,这是什么数?int?double?float?
所以可能你需要用到函数重载
//函数1. int max(int x,int y); {return(x>y)?x:y ;} //函数2. float max( float x,float y){ return (x>y)? x:y ;} //函数3. double max(double x,double y) {return (c>y)? x:y ;}
这种写法显然不太方便,所以这时候就可以用到模板。
2、都有哪些模板?
有 1、模板函数 2、模板类
3、函数模板的使用
3.1、首先看一下函数模板的格式:
template <模板形参表> <返回值类型> <函数名>(模板函数形参表) { //函数定义体 }
template 显然就是定义模板的关键字了。
3.2套用这个格式,我们写一个模板函数
template <typename T> T const& max(T const &a, T const &b) { return a < b ? b : a; }
typename也可以用class替换,用这个关键字定义类型
3.3测试一下刚刚的函数
#include <iostream> using namespace std; template <typename T> T const& max(T const &a, T const &b) { return a < b ? b : a; } int main() { int a1 = 5 ,b1 = 15; double a2 = 5.5, b2 = 5.6; char a3 = 'a', b3 = 'd'; cout<<max(a1,b1)<<endl; cout<<max(a2,b2)<<endl; cout<<max(a3,b3)<<endl; return 0; }
输出结果:
15 5.6 d
4、类模板
4.1、类模板的格式
template<typename T> class 类名 { //… };
和刚才的函数模板类似,template也是模板关键字,要想使用 通用的数据类型的 类成员/返回值/参数,则需要在定义其数据类型时使用T
4.2学着这个格式写一个类
template<typename T> class Compute { public: Compute(T a,T b); T max(); T min(); T add(); T mul(); private: T a,b; };
其实和普通的类也没有什么区别,只不过是把一般的int char换成了T 用来代表所有的数据格式
4.3实现这个类并且测试
#include <iostream> using namespace std; //声明一个类模板,计算a b的一些相关值 template<typename T> class Compute { public: Compute(T a,T b); T max(); T min(); T add(); T mul(); private: T a,b; }; //构造函数 template<typename T> Compute<T>::Compute(T a,T b) { this->a = a; this->b = b; } //下面四个成员函数 template<typename T> T Compute<T>::max() { return a < b ? b : a; } template<typename T> T Compute<T>::min() { return a > b ? b : a; } template<typename T> T Compute<T>::add() { return a + b; } template<typename T> T Compute<T>::mul() { return a * b ; } int main() { //在使用类模板时,创建这个类的变量要声明创建的类型 Compute<int> test(1,2); cout<<test.add()<<endl; cout<<test.min()<<endl; cout<<test.max()<<endl; cout<<test.mul()<<endl; Compute<char> test2('a','b'); cout<<test2.add()<<endl; cout<<test2.min()<<endl; cout<<test2.max()<<endl; cout<<test2.mul()<<endl; return 0; }
输出结果:
3 1 2 2 a b "
和想象中的基本差不多,a*b应该也不会有值输出。
这里要特别注意构造函数成员函数的写法
和类模板的使用方法!
5、关于类模板的思考
在第一个例子中,我们定义的max() 并不是一个函数,只有当他使用的时候,也就是执行到max(a1,b1); 这句的时候,他才成为一个函数,这个过程就是函数模板的实例化
在第一个例子的第一句 max 中,编译器判断出此时的类型应该是int,所以生成了一个 int 版本的 max() 函数以供调用。
同样的道理,模板类也需要实例化,所以在声明一个模板类的变量的时候,需要指定一个数据类型。