template: 模板 可以复用的东西
需求: int add(int ,int ) double add(double,double) add(flaot,) …等多个函数的重载
重载虽然可以实现,但是类型太多了需要写太多的方法此时我们可以使用到模板库
template< typename T> 声明T为一个通用类型,可以等于 int、 double、flaot …自定义…
T add(T a,T b )
{
T c;
return a+b;
}我们实现了 类型无关的代码 ------ 泛型编程:类型无关的编程
如何使用:
int a = add (4,5)
double b= add(2.5,4.8)
string c= add (“Coder”,“IT”)
过程:
编译器遇到 add,编译器获知了T的类型int
编译器会 迅速的生成一个函数
int add(int a,int b) {int c; return a+b;} 并调用该函数 int a=int add(5,6) ;
同理以上的函数也如此编译
如何实现自己的模板函数
1.实现一个 普通的函数-有指定类型
2.把需要改变类型的地方 替换为通用的类型T1 T2 T3…
声明T1 T2…为通用类型
注意: 当前 模板函数 是不完整的,
3.使用, 在使用的时候,要制定具体的类型定义:
template< typename T1,typename T2 >
T1 sub(T1 a,T2 b)
{
T1 c;
c=a-(T1)b;
return c;
}
使用:
int a = sub<int,double> (5,5.6);
double b = sub<double,int> (3.6, 5)我们使用最多的还是模板类
需求: 实现一个栈 template<typename T> class stack { public: int push(T val) { arr[pos]=val;pos++; return 0;} T pop() { pos--; return arr[pos]; } stack() { pos=0; } private: T arr[8]; int pos; }; 使用: stack<string> obj; //编译器遇到 stack<string> ,迅速的生成一个类 ,T被替换为具体类型 obj.push("zhou"); obj.push("wu"); obj.push("zheng");obj.push("wang"); cout<<obj.pop() << obj.pop()<<endl;;
例1: 实现一个 维护数组类, 可以装载任意类型的数据
#include<iostream> using namespace std; template<typename T> class stack { public: int push(T val) { arr[pos]=val;pos++; return 0;} T pop() { pos--; return arr[pos]; } stack() { pos=0; } private: T arr[8]; int pos; }; int main() { stack<string> obj; //编译器遇到 stack<string> ,迅速的生成一个类 ,T被替换为具体类型 obj.push("red"); obj.push("blue"); obj.push("yellow");obj.push("green"); cout<<obj.pop() << endl ; cout<<obj.pop() << endl; cout<<obj.pop() << endl; }
例2:重载[],实现 a=obj[1]; a=obj.[] (1) --> int operator[] (int pos)
#include<iostream>
using namespace std;
template <typename T>
class arr{
public:
void set_val(int pos,T val){ arr[pos]=val; } //arr[i]=8
T get_val(int pos){ return arr[pos];} // val=arr[i];
int get_cnt() { return 8;}
int &operator[] (int pos)
{
return arr[pos];
}
private:
T arr[8];
};
int main()
{
arr<int> obj;
obj.set_val(0,5);
obj.set_val(1,8);
obj.set_val(2,10);
cout<<obj.get_val(0)<<" "<<obj.get_val(1)<<" "<<obj.get_val(2)<<endl;
/*
高级要求:
重载[],实现 a=obj[1]; a=obj.operator[] (1) --> int operator[] (int pos)
当前是整数,非法
obj[1] = 55; --> obj.[](1) = 5; -->
*/
cout<<obj[0]<<" "<<obj[1]<<" "<<obj[2]<<endl;
obj[0]=44; obj[1]=55; obj[2]=66;
cout<<obj[0]<<" "<<obj[1]<<" "<<obj[2]<<endl;
return 0;
}