【C++同步练习】模板初阶

🫧个人主页:小年糕是糕手

💫个人专栏:《C++》《C++同步练习》《数据结构》《C语言》

🎨你不能左右天气,但你可以改变心情;你不能改变过去,但你可以决定未来!



目录

一、函数模板

二、类模板


一、函数模板

知识回顾:

  1. 本质:参数化的函数蓝图,通过 "类型参数" 实现代码复用(区别于普通函数的固定类型)。
  2. 核心目的:编写通用逻辑,适配多种数据类型(如同一排序逻辑兼容 int、double 等)。
  3. 基本用法
    1. 定义template <typename T> 返回值 函数名(参数列表) { 通用逻辑; }(如template <typename T> T max(T a, T b) { return a > b ? a : b; });
    2. 调用场景 :直接传参自动推导类型(max(3,5)),或显式指定类型(max<double>(3.1, 5.2))。
  4. 规则
    1. 类型参数用typenameclass声明(二者等价);
    2. 编译时根据实际类型生成 "具体函数"(实例化),无运行时开销;
    3. 需保证通用逻辑对目标类型合法(如>运算符需支持);
    4. 可定义多个类型参数(如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

解析:

模板声明的核心规则是:每个模板参数前必须指定类型说明符(classtypename,二者等价) ,且声明需以 template<...> 开头。逐一分析:

  1. 1) 错误:缺少模板参数列表,语法不完整。
  2. 2) 错误:参数 T1、T2 前未加 class/typename
  3. 3) 错误:参数 T2 前未加 class/typename
  4. 4) 正确:每个参数前都加了 class,符合语法。
  5. 5) 错误:参数 T2 前未加 typename
  6. 6) 正确:每个参数前都加了 typename,符合语法。
  7. 7) 正确:classtypename 可混合使用,符合语法。
  8. 8) 错误:缺少 template 关键字,语法不完整。

二、类模板

知识回顾:

  1. 本质:参数化的类蓝图,用模板参数(类型 / 常量)定义通用类,实例化时指定具体类型,实现代码复用。
  2. 核心目的:编写与类型无关的通用类(如通用容器、算法类),避免重复编写同逻辑的不同类型类。
  3. 基本用法
    1. 定义template <typename T> class 类名 { T 成员; 函数(T 参数) { ... } };(如template <typename T> class MyArray { T* arr; };
    2. 实例化类名<具体类型> 对象;(如MyArray<int> arr;,编译器生成对应类型的类)
  4. 规则
    1. 模板仅在实例化时编译,未实例化的模板不会生成代码;
    2. 模板代码需写在头文件(或同时包含实现),避免链接错误;
    3. 支持多模板参数template <typename T, int N> class A { ... };);
    4. 可结合特化(全特化 / 偏特化),为特定类型定制实现。
      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:模板类是一个家族,编译器的处理会分别进行两次编译,其处理过程跟普通类不一样


相关推荐
纸人特工6 小时前
NuxtHub部署nuxt项目就是方便
前端
_默_6 小时前
前端常用依赖归纳【vueuse\lodash-es\dayjs\bignumber】
大数据·前端·elasticsearch
Spirited_Away6 小时前
修改请求头插件迁移manifest V3记录
前端·chrome
cindershade6 小时前
使用 SSE 单向推送实现 系统通知功能
前端
Mapmost6 小时前
【高斯泼溅】Mapmost分区训练,让大场景3DGS建模从此高效且高质
前端
进击的野人6 小时前
Vue生命周期详解:从创建到销毁的全过程
前端·vue.js·面试
鹏北海6 小时前
微前端实现方式:HTML Entry 与 JS Entry 的区别
前端·javascript·面试
永远不打烊6 小时前
c++11 之 智能指针
c++
用户4099322502126 小时前
Vue3的`:style`对象语法:单位、属性名、响应式,这些细节你都踩过坑吗?
前端·ai编程·trae