知识回顾:
template <typename T> 返回值 函数名(参数列表) { 通用逻辑; }(如template <typename T> T max(T a, T b) { return a > b ? a : b; });max(3,5)),或显式指定类型(max<double>(3.1, 5.2))。typename或class声明(二者等价);>运算符需支持);template <typename T1, typename T2> void print(T1 a, T2 b))。1、在下列对fun的调用中,错误的是() template <class T> T fun(T x,T y){ return x*x+y*y; } A.fun(1, 2) B.fun(1.0, 2) C.fun(2.0, 1.0) D.fun<float>(1, 2.0) 答案:B 解析: A:通过参数推导,T为int,不存在二义性,调用正确 B:由于参数类型不一样,模板不支持类型转换,推导参数会产生二义性,编译错误 C:通过参数推导,T为float,不存在二义性,调用正确 D:通过类型实例化函数,调用正确
2、下列的模板声明中,其中哪几个是正确的() 1)template 2)template<T1,T2> 3)template<class T1,T2> 4)template<class T1,class T2> 5)template<typename T1,T2> 6)template<typename T1,typename T2> 7)template<class T1,typename T2> 8)<typename T1,class T2> 答案:4、6、7 解析: 模板声明的核心规则是:每个模板参数前必须指定类型说明符(
class或typename,二者等价),且声明需以template<...>开头。逐一分析:
T1、T2 前未加 class/typename。T2 前未加 class/typename。class,符合语法。T2 前未加 typename。typename,符合语法。class 和 typename 可混合使用,符合语法。template 关键字,语法不完整。知识回顾:
template <typename T> class 类名 { T 成员; 函数(T 参数) { ... } };(如template <typename T> class MyArray { T* arr; };)类名<具体类型> 对象;(如MyArray<int> arr;,编译器生成对应类型的类)template <typename T, int N> class A { ... };);1、下面有关C++中为什么用模板类的原因,描述错误的是() A.可用来创建动态增长和减小的数据结构 B.它是类型无关的,因此具有很高的可复用性 C.它运行时检查数据类型,保证了类型安全 D.它是平台无关的,可移植性 答案:C 解析: A:模板可以具有非类型参数,用于指定大小,可以根据指定的大小创建动态结构 B:模板最重要的一点就是类型无关,提高了代码复用性 C:模板运行时不检查数据类型,也不保证类型安全,相当于类型的宏替换,故错误 D:只要支持模板语法,模板的代码就是可移植的
2、下列关于模板的说法正确的是() A.模板的实参在任何时候都可以省略 B.类模板与模板类所指的是同一概念 C.类模板的参数必须是虚拟类型的 D.类模板中的成员函数全是函数模板 答案:D 解析: A:模板实参并非任何时候都可省略,例如类模板实例化时(如
MyTemplate<int> obj;)必须显式指定实参;仅在函数模板的实参可由形参推导时(如template <typename T> T add(T a, T b) { return a+b; }调用add(1,2))可省略。 B:类模板是参数化的类蓝图(未实例化的通用定义),模板类是类模板实例化后的具体类,二者并非同一概念。 C:类模板的参数不仅可以是虚拟类型(typename T),还可以是常量参数(如template <typename T, int N> class MyArray { ... };中的int N)。 D:类模板中的成员函数会随类模板的实例化而生成对应类型的函数,本质上属于函数模板(依赖类模板的参数类型)。3、下列描述错误的是() A.编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础 B.函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具 C.模板分为函数模板和类模板 D. 模板类跟普通类以一样的,编译器对它的处理时一样的 答案:D 解析: A:模板是代码复用的重要手段 B:函数模板不是一个具体函数,而是一个函数家族 C:目前涉及到的模板就两类,函数模板与类模板 D:模板类是一个家族,编译器的处理会分别进行两次编译,其处理过程跟普通类不一样