这里是Joe自己的c++学习笔记,如果能帮助到你,那我受宠若惊!
可以提高代码可重用性(对于不同类型的数据)
函数模板
template<模板参数表>
类型名 函数名(参数表)
{
函数的定义
}
template<typename T>
T abs(T x){//T 表示可以为任意参数类型
return x>0?x:-x;
}
函数模板中函数体的定义方式与定义普通函数类似。、
类模板
把类定义为一种模式,使得类中的某些数据成员、成员函数的参数、返回值或者局部变量取到任意的类型。
类成员的声明方法与普通类的定义几乎相同。
类模板声明形式:
template<模板参数表>
class 类名
{
类成员声明
}
在类模板之外定义成员函数:
template<模板参数表>
类型名 类名<模板参数标识符列表>::函数名(参数表)
注:一个类模板生命自身并不是一个类,而是说明了一个类的家族,只有在被其他代码引用时,模板才根据引用的需要生成具体的类。
#include<iostream>
#include<cstdlib>
using namespace std;
struct Student{
int id;
float gpa;
};
template<class T>//类模板:实现任意数据类型的存取
class Store{
private:
T item;//item用于存放任意数据类型
bool value;
public:
Store();//无参数默认的构造函数
T &getElem();
void putElem(const T &x);
};
template<class T>
Store<T>::Store():value(false){}
template<class T>
T &Store<T>::getElem(){
if(!value){
exit(1);
}
return item;
}
template<class T>
void Store<T>::putElem(const T &x){
value=ture;
item=x;
}
int main(){
Store<int>s1,s2;//初始化item为int类型
s1.putElem(3);
s2.putElem(-7);
cout<<s1.getElem()<<" "<<s2.getElem()<<endl;
Student g={1001.23};
Store<Student>s3;//初始化item为结构体Student类型
s3.putElem(g);
cout<<s3.getElem().id<<endl;
return 0;
}