
🫧个人主页:小年糕是糕手
💫个人专栏:《C++》《C++同步练习》《数据结构》《C语言》
🎨你不能左右天气,但你可以改变心情;你不能改变过去,但你可以决定未来!

目录
一、函数模板
知识回顾:
- 本质:参数化的函数蓝图,通过 "类型参数" 实现代码复用(区别于普通函数的固定类型)。
- 核心目的:编写通用逻辑,适配多种数据类型(如同一排序逻辑兼容 int、double 等)。
- 基本用法 :
- 定义 :
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<...>开头。逐一分析:
- 1) 错误:缺少模板参数列表,语法不完整。
- 2) 错误:参数
T1、T2前未加class/typename。- 3) 错误:参数
T2前未加class/typename。- 4) 正确:每个参数前都加了
class,符合语法。- 5) 错误:参数
T2前未加typename。- 6) 正确:每个参数前都加了
typename,符合语法。- 7) 正确:
class和typename可混合使用,符合语法。- 8) 错误:缺少
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:模板类是一个家族,编译器的处理会分别进行两次编译,其处理过程跟普通类不一样
