C 习题和解析(模板-02)

2008-02-23 05:34:33来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

题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




标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: C 习题和解析(重载-04)

下一篇: 对于c/c 中指针学习的两个绝好的例子

热门词条
热门标签