一、实验目的
模板使类和函数可在编译时定义所需处理和返回的数据类型,一个模板并非一个实实在在的类或函数,仅仅是一个类和函数的描述。由于模板可以实现逻辑相同、数据类型不同的程序代码复制,所以使用模板机制可以减轻编程和维护的工作量和难度。模板一般分为模板函数和类模板。以所处理的数据类型的说明作为参数的类就叫类模板,或者模板类,而以所处理的数据类型的说明作为参数的函数,则称为函数模板。
本实验通过编写一些简单的程序,使学生掌握泛型编程,并能够基本运用模板的语法,培养理论联系实际的和自主学习的能力,提高程序设计水平。
二、实验内容
(一)
编写模板函数,它将一个包含5个T类型元素的数组作为参数,并返回数组的最小值。在一个程序中使用该函数,将T替换为一个包含5个int值的数组和一个包含5个double值的数组,以测试该函数。
(二)
定义一个模板类(BinaryOperation),包含构造函数BinaryOperation(T x,T y)以及方法add、sub、mul、div、operator(char op),通过调用operator,判断传入的op变量的值,,如果是‘+’,则进行加法,并输出结果,其他方法类似。
例:BinaryOperation bo = new BinaryOperation(1,1);
bo.operator(’+’);会输出结果2
bo.operator(’-’);会输出结果0
(一)
#include<iostream>
using namespace std;
template<typename T,int size> //模版声明,T类型参数, size数组大小
T min(T (&a)[size])
{
T min=a[0];
for(int i=1;i<size;i++)//找最小值
{
if(a[i]<min)
min=a[i];
}
return min;
}
int main()
{
double a[5]={1.2,2.3,-0.2,1.9,4.5};
int b[5]={1,2,3,4,5};
int c[4]={0,1,2,3};
cout<<min(a)<<endl;
cout<<min(b)<<endl;
cout<<min(c)<<endl;
return 0;
}
(二)
#include<iostream>
using namespace std;
template<class T1,class T2>
class BinaryOperation
{
public:
BinaryOperation(){}
BinaryOperation(T1 x,T2 y){
this->x=x;
this->y=y;
}
void Operator(char op){
if(op=='+')
add(x,y);
else if(op=='-')
sub(x,y);
else if(op=='*')
mul(x,y);
else if(op=='/')
div(x,y);
}
T1 getx(){return x;} //得到x值
T2 gety(){return y;} //得到y值
void setx(T1 x){this->x=x;} //设置x值
void sety(T2 y){this->y=y;} //设置y值
private:
T1 x;
T2 y;
void add(T1 x,T2 y){
cout<<x+y<<endl;
}
void sub(T1 x,T2 y){
cout<<x-y<<endl;
}
void mul(T1 x,T2 y){
cout<<x*y<<endl;
}
void div(T1 x,T2 y){
if(y==0)
cout<<"error!"<<endl;//分子不能为0
else
cout<<(double)x/(double)y<<endl;
}
};
int main()
{
BinaryOperation <int,int> bo1(1,4);
cout<<bo1.getx()<<" + "<<bo1.gety()<<" = ";
bo1.Operator('+');
cout<<bo1.getx()<<" - "<<bo1.gety()<<" = ";
bo1.Operator('-');
cout<<bo1.getx()<<" * "<<bo1.gety()<<" = ";
bo1.Operator('*');
cout<<bo1.getx()<<" / "<<bo1.gety()<<" = ";
bo1.Operator('/');
cout<<endl;
BinaryOperation <double,double> bo2(1.2,2.3);
cout<<bo2.getx()<<" + "<<bo2.gety()<<" = ";
bo2.Operator('+');
cout<<bo2.getx()<<" - "<<bo2.gety()<<" = ";
bo2.Operator('-');
cout<<bo2.getx()<<" * "<<bo2.gety()<<" = ";
bo2.Operator('*');
cout<<bo2.getx()<<" / "<<bo2.gety()<<" = ";
bo2.Operator('/');
cout<<endl;
BinaryOperation <double,int> bo3(0.3,0);
cout<<bo3.getx()<<" + "<<bo3.gety()<<" = ";
bo3.Operator('+');
cout<<bo3.getx()<<" - "<<bo3.gety()<<" = ";
bo3.Operator('-');
cout<<bo3.getx()<<" * "<<bo3.gety()<<" = ";
bo3.Operator('*');
cout<<bo3.getx()<<" / "<<bo3.gety()<<" = ";
bo3.Operator('/');
cout<<endl;
BinaryOperation <int,double> bo4(3,5.5);
cout<<bo4.getx()<<" + "<<bo4.gety()<<" = ";
bo4.Operator('+');
cout<<bo4.getx()<<" - "<<bo4.gety()<<" = ";
bo4.Operator('-');
cout<<bo4.getx()<<" * "<<bo4.gety()<<" = ";
bo4.Operator('*');
cout<<bo4.getx()<<" / "<<bo4.gety()<<" = ";
bo4.Operator('/');
cout<<endl;
return 0;
}