c++ 函数模板 类模板

来源:互联网 发布:城市智能交通大数据 编辑:程序博客网 时间:2024/03/28 22:13

一、函数模板

两个参数

void outputArray(const T*array,int count)
{
for(int i=0;i<count;i++)
{
cout<<array[i]<<" ";
}
}
int main()
{
const int A_COUNT=8,B_COUNT=20;
double a[A_COUNT]={1.1,2.2,3.3,4.4,5.5,6.6};
char b[B_COUNT]="welcome!";
outputArray(b,B_COUNT);
cout<<endl;
outputArray(a,A_COUNT);
}

一个参数

template <typename T>
T abs(T x)
{
return x<0?-x:x;
}
int main()
{
int a=-3;
cout<<abs(a)<<endl;
double b=-4.9;
cout<<abs(b)<<endl;
}
函数模板的实例化:函数参数类型确定后,编译器以函数模板为样板生成一次函数。
如:
int abs(int x)
{
return x<0?-x:x;
}

函数模板与函数区别:

1、函数模板编译时不产生目标代码,实例化才产生

2、函数指针指向模板实例,而不指向模板本身。

3、多个源文件引用函数模板时,应当连同函数体一起放在头文件,而不像普通函数那样只把头文件的声明放在头文件。


二、类模板

struct Student{int id;float gpa;};template <class T>//类模板:实现对任意类型的数据进行存取class Store{private:T item;//存放任意类型数据bool haveValue;//标记是否已存入public:Store();//默认构造T &getElem();//提取数据函数void putElem(const T &x);//存入数据函数};//成员函数实现template<class T>Store<T>::Store():haveValue(false){}//构造函数template<class T>T &Store<T>::getElem(){if(!haveValue){cout<<"No item present"<<endl;exit(1);}return item;}//存入数据函数实现template<class T>void Store<T>::putElem(const T&x){haveValue=true;item=x;}int main(){Store<int>s1,s2;//定义两个Store<int>对象,数据成员item为int类型s1.putElem(3);s2.putElem(-7);cout<<s1.getElem()<<" "<<s2.getElem()<<endl;Student g={1000,23};Store<Student>s3;s3.putElem(g);cout<<"the student id is"<<s3.getElem().id<<endl;Store<double>d;cout<<"Retrieving object d..."<<endl;cout<<d.getElem()<<endl;}


0 0