AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > C++

C++习题与解析-模板

51自学网 http://www.51zixue.net

题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

 
 

上一篇:C++习题与解析-重载  下一篇:C++习题与解析-继承和派生