【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:模板类是一个家族,编译器的处理会分别进行两次编译,其处理过程跟普通类不一样


相关推荐
_AaronWong9 小时前
Electron 实现仿豆包划词取词功能:从 AI 生成到落地踩坑记
前端·javascript·vue.js
cxxcode9 小时前
I/O 多路复用:从浏览器到 Linux 内核
前端
用户5433081441949 小时前
AI 时代,前端逆向的门槛已经低到离谱 — 以 Upwork 为例
前端
JarvanMo9 小时前
Flutter 版本的 material_ui 已经上架 pub.dev 啦!快来抢先体验吧。
前端
JohnYan9 小时前
工作笔记-CodeBuddy应用探索
javascript·ai编程·aiops
恋猫de小郭9 小时前
AI 可以让 WIFI 实现监控室内人体位置和姿态,无需摄像头?
前端·人工智能·ai编程
哀木9 小时前
给自己整一个 claude code,解锁编程新姿势
前端
程序员鱼皮10 小时前
GitHub 关注突破 2w,我总结了 10 个涨星涨粉技巧!
前端·后端·github
UrbanJazzerati10 小时前
Vue3 父子组件通信完全指南
前端·面试
是一碗螺丝粉10 小时前
5分钟上手LangChain.js:用DeepSeek给你的App加上AI能力
前端·人工智能·langchain