news 2026/4/29 5:27:03

C++超详细介绍模板

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++超详细介绍模板

定义

函数模板不是一个实在的函数,编译器不能为其生成可执行代码。定义函数模板后只是一个对函数功能框架的描述,当它具体执行时,将根据传递的实际参数决定其功能。

一个程序一般是经过预处理——>编译——>汇编——>链接。但是因为程序无法知道模板的具体类型(int,double),所以无法进行预处理,也就不能生成可执行代码。

例子

下面我们来看一个例子

我们在学习c语言的时候,当我们需要交换两个数,我们是这样做的

交换整数

1

2

3

4

5

6

voidSwap(int& x,int& y)

{

inttmp = x;

x = y;

y = tmp;

}

交换小数

1

2

3

4

5

6

voidSwap (double& xrdouble& y)

{

doubletmp = x;

x = y;

y = tmp;

}

我们可以看出,只要类型做了变化,我们就需要重新写一个几乎不变的代码,这是非常不方便的。

那么我们像活字印刷术一样做一个模板出来让编译器根据自行推导类型呢?

于是模板就出现了。

对于上面的情况,我们模板是这样处理的。

格式

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

template<classT>

voidSwap(T & x, T & y)

{

T tmp = x;

x = y;

y = tmp;

}

template<classT>

voidSwap(T& x, T& y)

{

T tmp = x;

x = y;

y = tmp;

}

intmain()

{

inta = 3;

intb = 2;

Swap(a, b);

cout << a << endl<< b << endl;

return0;

}

template <class 类型参数1, class类型参数2, ...>
返回值类型 模板名(形参表)
{
函数体
}

意识就是说,我们在这里用template定义了一个模板”T”,当我们使用Swap的时候,计算机根据我们a,b(都是int)的类型,推出T应当是int 型。

实际上这个

1

voidSwap(T & x, T & y)

变成了

1

voidSwap (int& x,int& y)

但是需要注意,只有当a,b都是同类型的时候,计算机才能自动推到,如果是不同类型,我们将b换为double类型

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

template<classT>

voidSwap(T & x, T & y)

{

T tmp = x;

x = y;

y = tmp;

}

template<classT>

voidSwap(T& x, T& y)

{

T tmp = x;

x = y;

y = tmp;

}

intmain()

{

inta = 3;

doubleb = 2.5;

Swap(a, b);

cout << a << endl<< b << endl;

return0;

}

就会出现:

因为两个数一个int一个double,计算机就不知道给这个T赋int 还是double,这个时候有两种处理方法

处理方法

第一种隐式实例化:让编译器根据实参推演模板参数的实际类型

1

2

3

4

5

6

7

8

9

10

11

12

13

#include<iostream>

usingnamespacestd;

template<classT>

T Add(constT& left,constT& right)

{

returnleft + right;

}

intmain()

{

inta1 = 10, a2 = 20;

doubled1 = 10.0, d2 = 20.5;

Add<int>(a1, d2);//在这个地方前面加<int>,计算机就会默认T为int型

}

第二种显式实例化:在函数名后的<>中指定模板参数的实际类型

1

2

3

4

5

6

7

8

9

10

11

12

13

#include<iostream>

usingnamespacestd;

template<classT>

T Add(constT& left,constT& right)

{

returnleft + right;

}

intmain()

{

inta1 = 10, a2 = 20;

doubled1 = 10.0, d2 = 20.5;

Add(a1,(int) d2);//此处d2原本是double型,但是我们强制转换为int之后,两者的类型都相同,计算机就能自动推导了

}

到此这篇关于C++超详细介绍模板的文章就介绍到这了

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 5:26:43

Vector授权狗驱动安装保姆级教程(Win10/Win11兼容模式避坑指南)

Vector授权狗驱动安装全攻略&#xff1a;Win10/Win11兼容性深度解决方案 当你在全新Windows 11工作站上首次尝试配置Vector开发环境时&#xff0c;那个红色的"License Error"弹窗可能比任何系统警告都令人窒息。作为汽车电子领域的事实标准工具链&#xff0c;Vector系…

作者头像 李华
网站建设 2026/4/29 5:25:27

AI驱动的计算酶设计:从静态结构到动态功能优化

1. 酶设计新纪元的开启蛋白质工程领域正在经历一场由人工智能驱动的革命。作为一名长期从事计算酶设计的研究者&#xff0c;我见证了从传统理性设计到现代AI辅助设计的范式转变。酶作为生物催化剂&#xff0c;其设计难点不仅在于静态结构的精确建模&#xff0c;更在于动态催化过…

作者头像 李华
网站建设 2026/4/29 5:23:48

终极免费在线法线贴图生成器:NormalMap-Online完整使用指南

终极免费在线法线贴图生成器&#xff1a;NormalMap-Online完整使用指南 【免费下载链接】NormalMap-Online NormalMap Generator Online 项目地址: https://gitcode.com/gh_mirrors/no/NormalMap-Online 你是否在为3D项目寻找高质量的法线贴图生成工具&#xff1f;Norma…

作者头像 李华
网站建设 2026/4/29 5:21:24

C++深入分析讲解类的知识点

知识点引入C语言中 数据 和 方法 是独立&#xff1a;12345678910111213141516171819202122232425262728293031//c语言的思想:数据 方法 分开//人typedef struct{char name[32];int age;}Person;//动物typedef struct{char name[32];int age;int type;}Dog;void PersonEat(Pers…

作者头像 李华
网站建设 2026/4/29 5:20:39

网盘直链下载助手:八大网盘免费获取真实下载链接的终极指南

网盘直链下载助手&#xff1a;八大网盘免费获取真实下载链接的终极指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 /…

作者头像 李华