一、名词解析
函数模板:一个带类属参数的函数。
类模板:一个带类属参数的类。
模板函数 :通过参数实例化可以再构造出具体的函数。
模板类:通过参数实例化可以再构造出具体的类。
二、填空题
(1)C++支持两种模板,一种是 函数模板 ,另一种是 类模板 。
(2)关键字 template 是定义模板的关键字。
(3)<模板参数>中包含一个或多个用逗号分开的模板参数项,每一项由保留字 class 或者 typename 开始。
(4)重载函数模板便于定义 类属参数 或者函数参数的类型、个数不相同所进行的 类似 操作。
(5)函数模板实例化时, 没有 普通传值参数的类型转换机制。
(6)STL提供的容器是常用数据结构的 类模板 。
(7)STL容器类库包含7种基本容器。他们可以分成两组: 顺序容器 和 关联容器 。
(8)STL迭代器主要包括5种基本类别: 输入迭代器 、 输出迭代器 、前向迭代器 、 双向迭代器 、 随机访问迭代器 。
三、选择题(至少选一个,可以多选)
(1)关于函数模板,描述错误的是(A)
A、函数模板必须由程序员实例化为可执行的模板函数
B、模板函数的实例化有编辑器实现
C、一个类定义中,只要有一个函数模板,则这个类是类模板
D、类模板的成员函数都是函数模板,类模板实例化后,成员函数也随之实例化
(2)下列模板说明中,正确的是(AC)
A、template<typename T1,typename T2>
B、template<class T1,T2>
C、template(class T1,class T2)
D、template(typename T1 ,T2)
(3)假设有函数模板定义如下:
template <typename T>
Max(T a,T b, T&c)
{c=a+b;}
下列选项正确的是(AB)
A、float x ,y ;float z;
Max(x ,y ,z);
B、int x,y,z;
Max(x,y,z);
C、int x,y;float z;
Max(x,y,z);
D、float x; double y ,z;
Max(x,y,z);
(4)建立类模板对象的实例化过程为(C)
A、基类 ——>派生类 B、构造函数——>对象 C、模板类——>对象 D、模板类——>模板函数
(5)下面(ABD)是标准模板库中的主要组件。
A、容器 B、迭代器 C、文件 D、算法
四、判断题
(1)一个模板函数能够被相同函数名的另外模板函数重载。 (对 )
(2)作为模板类型参数的关键字class,特别含义是“任何用户定义类的类型”。 ( 错)
(3)在类模板<模板参数表>中,必须至少有一个类参数。 ( 对)
(4)在类模板<模板参数表>中,可以使用函数类型参数,该参数与普通函数参数的用法和功效完全相同。 ( 错)
(5)迭代器就是我们平常所用的指针。 ( 错)
五、程序设计题
(1)用函数模板实现求整数、实现平方根的程序。
编写程序如下:
//xt7_1.cpp
#include <iostream>
#include <cmath>
using namespace std;
template <typename T>
T kaifang(T a)
{
T c;
c=sqrt(a);
return c;
}
int main( )
{
int x=kaifang(4);
cout<<"整数4的平方根为:"<<x<<endl;
double y=kaifang(1.96);
cout<<"实数1.96的平方根为:" <<y<<endl;
return 0;
}
(2)设计一个类模板,然后将该类模板实例化为整数型和字符型类。利用类模板的成员函数为其数据成员赋值,并显示所赋给的值。
编写程序如下:
//xt7_2.cpp
#include <iostream>
using namespace std;
template <typename numtype>
class Classtemple
{
public:
void setdata(numtype x, numtype y)
{
a=x;b=y;
}
void dispdata()
{
cout<<"first number is "<<a<<endl;
cout<<"second number is "<<b<<endl;
}
private:
numtype a,b;
};
int main( )
{
Classtemple<int> intobj;
intobj.setdata(23,24);
cout<<"整数类的两个数据成员为:"<<endl;
intobj.dispdata();
Classtemple<char> charobj;
charobj.setdata('3','4');
cout<<"字符类的两个数据成员为:"<<endl;
charobj.dispdata();
return 0;
}