C++习题与解析(模板-02)

本文通过四个题目详细解析了C++中的函数模板、类模板的使用,包括绝对值函数、重载运算符+、求最小值函数模板以及自定义数组类模板Array<T>的实现,展示了模板在处理不同类型数据时的灵活性。

题1.分析以下程序的执行结果
#include<iostream.h>
template <class T>
T abs(T x)
{
return (x>0?x:-x);
}
void main()
{
cout<<abs(-3)<<","<<abs(-2.6)<<endl;
}
解:
abs()是一个函数模板,它返回参数的绝对值。在调用时自动联编相应的abs()函数。
所以输出为:3,2.6

----------------------------------------------

題2.分析以下程序的执行结果
#include<iostream.h>
template<class T>
class Sample
{
T n;
public:
Sample(){}
Sample(T i){n=i;}
Sample<T>&operator+(consta Sample<T>&);
void disp(){cout<<"n="<<n<<endl;}
};
template<class T>
Sample<T>&Sample<T>::operator+(const Sample<T>&s)
{
static Sample<T> temp;
temp.n=n+s.n;
return temp;
}
void main()
{
Sample<int>s1(10),s2(20),s3;
s3=s1+s2;
s3.disp();
}
解:
Sample为一个类模板,产生一个模板类Sample<int>,并建立它的三个对象,调用重载运算符+实现s1与s2的加法运算,将结果赋给s3。
所以输出为:n=30

----------------------------------------------------

题3.编写一个函数模板,它返回两个值中的较小者,同时要求能正确处理字符串。
解:
这里设计一个函数模板template<class T> T min(T a,T b),可以处理int、float和char 等数据类型,为了能正确处理字符串,添加一个重载函数专门处理字符串比较,即char *min(char *a,char *b)。
本题程序如下:
#include<iostream.h>
#include<string.h>
template<class T>
T min(T a,T b)
{
return (a<b?a:b);
}
char *min(char *a,char *b)
{
return (strcmp(a,b)<0?a:b);
}
void main()
{
double a=3.56,b=8.23;
char s1[]="Hello",s2[]="Good";
cout<<"输出结果:"<<endl;
cout<<" "<<a<<","<<b<<"中较小者:"<<min(a,b)<<endl;
cout<<" "<<s1<<","<<s2<<"中较小者:"<<min(s1,s2)<<endl;
}
输出结果:
3.56,8.23中较小者:3.56
Hello,Good中较小者:Good

----------------------------------------------------

题4.设计一个数组类模板Array<T>,其中包含重载下标运算符函数,并由此产生模板类Array<int>和Array<char>,使用一些测试数据对其进行测试。
解:
本题程序如下:
#include<iostream.h>
#include<iomanip.h>
template <class T>
class Array
{
T *elems;
int size;
public:
Array(int s); // 构造函数
~Array();
T& operator[](int); // 重载下标运算符
void operator=(T); // 重载等号运算符
};
template <class T>
Array<T>::Array(int s)
{
size=s;
elems=new T[size];
for(int i=0;i<size;i++)
elems[i]=0;
}
template<class T>
Array<T>::~Array()
{
delete elems;
}
template<class T>
T& Array<T>::operator[](int index)
{
return elems[index];
}
template<class T>
void Array<T>::operator=(T temp)
{
for(int i=0;i<size;i++)
elems[i]=temp;
}
void main()
{
int i,n=10;
Array<int> arr1(n); // 产生整型模板类及其对象arr1
Array<char> arr2(n); // 产生字符型模板类及其对象arr2
for(i=0;i<n;i++)
{
arr1[i]='a'+i; // 调用重载运算符
arr2[i]='a'+i;
}
cout<<" ASCII码 字符"<<endl;
for(i=0;i<n;i++)
cout<<setw(8)<<arr1[i]<<setw(8)<<arr2[i]<<endl;
}
本程序的执行结果如下:
ASCII码 字符
97 a
98 b
99 c
100 d
101 e
102 f
103 g
104 h
105 i
106 j
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值