一道有关类模板的C++题目谁能帮我解释一下

9、 设计一个类模板template <class T> class Data,用于对T类型的数组进行求所有元素的和。
using namespace std;
template <class T> class Data
{
private:
T* set;
int n;
public:
T sum();
Data(T* a,int b)
{
set=a;
n=b;
}
};
template <class T> T Data<T>::sum()
{
int i;
T s=0;
for(i=0;i<n;i++)
{
s=s+set[i];
}
return s;
}
void main( )
{

int a[5]={1,2,3,4,5};
double b[6]={1.2,2.3,3.4,4.5,5.6,6.7};
Data<int> arr1(a,5);
cout<<arr1.sum()<<endl;
Data<double> arr2(b,6);
cout<<arr2.sum()<<endl;
}

类模板我还是没搞清楚什么意思
谁能帮我说说谢谢了。。
代码最好也都注释一下
越详细越好。。
谢谢。。

为什么要用模板?
答:可以使类的构造更具有灵活性。当然,模板也是C++的特色之一。
例如,我们设计了一个世博会统计游客数量的类,其中,我们引用了一个未知类型的成员变量T,我们又定义了2个类,男游客和女游客。那么我们可以分别使得T为这两种类型,而进行分别统计。

using namespace std;
template <class T> class Data //声明模板类
{
private:
T* set; //需要统计的内容列表
int n; //需要统计的内容列表长度
public:
T sum(); //求和函数
Data(T* a,int b)//构造函数
{
set=a;
n=b;
}
};

//说明是模板类 返回值类型 类名称 函数名
// || || || ||
template <class T> T Data<T>::sum() //求和函数实现
{
int i; //循环变量
T s=0; //和变量
for(i=0;i<n;i++) //求和
{
s=s+set[i]; //set[i]表示第i个元素的值,它的类型为T
}
return s; //返回求和结果,注意类型为T
}
void main( )
{
//主函数,正说明了模板类的作用:对不同类型成员变量的兼容性(int和double)
int a[5]={1,2,3,4,5}; //整形数组
double b[6]={1.2,2.3,3.4,4.5,5.6,6.7}; //浮点型数组
Data<int> arr1(a,5); //声明Data<int>类对象 arr1
cout<<arr1.sum()<<endl; //求和输出
Data<double> arr2(b,6); //声明Data<double>类对象arr2
cout<<arr2.sum()<<endl; //求和输出
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-07-09
1。模板是以一种完全通用的方法来设计函数或类而不必预先说明将被使用的每个对象的类型。
2。通过模板可以产生类或函数的集合,使它们操作不同的数据类型,从而避免需要为每一种数据类型产生一个单独的类或函数。
例如,设计一个求两参数最大值的函数,不使用模板时,需要定义四个函数:
int max(int a,int b){return(a>b)?a,b;}
long max(long a,long b){return(a>b)?a,b;}
double max(double a,double b){return(a>b)?a,b;}
char max(char a,char b){return(a>b)?a,b;}
若使用模板,则只定义一个函数:
Template<class T>
T max(type a,type b)
{return(a>b)?a,b;}

类模板说明:
template <类型形参表>
class <类名>
{ //类说明体 };
template <类型形参表>
<返回类型> <类名> <类型名表>::<成员函数1>(形参表)
{ //成员函数定义体 }
template <类型形参表>
<返回类型> <类名> <类型名表>::<成员函数2>(形参表)
{ //成员函数定义体 }

template <类型形参表>
<返回类型> <类名> <类型名表>::<成员函数n>(形参表)
{ //成员函数定义体 }
第2个回答  2010-07-09
其实 模板就是一种偷懒的方法,设置一种类型后,在实际用的时候,再传入真正的变量类型,它解决了重载代码重写的重复性劳动,你理解的时候,可以将T都理解成int型或其他类型,理解各个函数的功能作用后,,当实际调用的时候,指定具体类型,它会进行类型替换,然后,就没什么难度了。这个代码很简单,不用注释,只是注意下 模板使用 的一些语法就行了。
第3个回答  2010-07-09
#include "stdafx.h"
using namespace std;
//类Data,T它可以是任何类型,但不知道具体用什么类型,用T代替,其他人想用函数时,具体告诉T是什么类型就好了
template <class T> class Data
{
private:
T* set;
int n;
public:
T sum();
Data(T* a,int b) //Data类构造函数
{
set=a;
n=b;
}
};
template <class T> T Data<T>::sum() //类Data的成员函数,T可为任意类型
{
int i;
T s=0;
for(i=0;i<n;i++)
{
s=s+set[i]; //求类成员变量set数组各个元素之和
}
return s;
}

int main(int argc, char* argv[])
{
int a[5]={1,2,3,4,5};
double b[6]={1.2,2.3,3.4,4.5,5.6,6.7};
//定义对象,同时Data<int> 让T是int型
Data<int> arr1(a,5);
cout<<arr1.sum()<<endl;
//定义Data类的对象,告诉T是double型
Data<double> arr2(b,6);
cout<<arr2.sum()<<endl;

return 0;
}本回答被提问者采纳
第4个回答  2010-07-10
模板是一个泛型,其实学模板,刚开始,最笨也是最有效的方法就是,你用一个具体的类型(比如符合你的程序要求的内置类型int、doule等)代替模板的那个type,即具体-->泛型的推演,这样你就很容易看得懂程序了
相似回答