【C++】—通俗易懂的理解C++中的模板

news2024/12/23 22:09:14

在这里插入图片描述

文章目录

  • 前言:
  • 💞1.函数模板
    • 💞1.1 函数模板的概念
    • 💞1.2 函数模板的格式
    • 💞1.3 函数模板的原理
    • 💞1.4 函数模板的实例化
    • 💞1.5 模板参数的匹配原则
  • 💞2.类模板
    • 💞1.1 类模板的概念
    • 💞1.2 类模板的格式
    • 💞1.3 类模板的优点
  • 最后:

前言:

模板就相当于我们高中写作文时套用的作文模板,在大多数情况下是可以通用的。那么我们要是在编程中也想利用这种方式呢?那就不得不提起泛型编程——编写与类型无关的通用代码,是代码复用的一种体现。模板只是泛型编程的基础。模板又可以分为函数模板和类模板。

💞1.函数模板

💞1.1 函数模板的概念

  函数模板代表了一个函数的家族,这个函数不受类型的限制,比如可以传int类型也可以传double类型,在使用时被参数化,根据实参的类型而产生特定类型的函数。

💞1.2 函数模板的格式

template< typename T>
返回值类型 函数名(参数列表)
{}

template<typename T>
void Swap(T& left, T& right)
{
	T tmp = left;
	left = right;
	right = tnmp;
}

🎯注意:template是定义模板参数的关键字,也可以使用class但不能用struct代替class

💞1.3 函数模板的原理

函数模板并不是一个函数,而是编译器按使用方式而生成特定类型函数的一个摸具。
在这里插入图片描述
在编译阶段,编译器会根据传来的实参类型来生成出对应的类型函数以供使用。

💞1.4 函数模板的实例化

不同类型的参数使用模板时,称为函数模板的实例化,模板参数实例化又分为隐式实例化显式实例化

 🍒 隐式实例化:让编译器根据实参来推演出对应的函数类型

template<typename T>
T Add(T& a, T& b)
{
	return a + b;
}
int main()
{
	int x = 1; int y = 2;
	Add(x, y);  //隐式实例化

	double m = 2.0; double n = 3.0;
	Add(m,n); //隐式实例化

	//但不能像下面这样传,一个传int类型,一个传double类型,因为模板参数列表中只有一个T,编译器无法确定T为int还是double
	//Add(x,m);

	//如果非要传如何处理呢? 1.强制类型转化一下 2.使用显式实例化

	return 0;
}

 🍒 显式实例化:在函数名后加上指定类型

int main()
{
	int i = 10;
	double l = 30.0;

	Add<int>(i,l); //显式实例化

	return 0;
}

💞1.5 模板参数的匹配原则

1. 非模板函数和模板函数可以同时存在,模板函数可以被实例化成这个非模板函数,在调用时编译器会优先调用非模板函数

int Add(int left, int right)
{
	return left + right;
}

template<typename T>
T Add(T left, T right)
{
	return left + right;
}

int main()
{
	Add(1, 2);//调用非模板函数
	
	Add<int>(1,2);//调用编译器特化的Add版本

	return 0;
}

2.对于非模板函数和能实例化出同类型的模板函数,编译器会优先调用非模板函数,不会从模板函数产生一个实例。如果模板函数可以产生一个更匹配的函数,那么将选择模板函数。

//非模板函数int加法函数
int Add(int left, int right)
{
	return left + right;
}
//通用的加法函数
template<typename T1,typename T2>
T1 Add(T1 left, T2 right)
{
	return left + right;
}

int main()
{
	Add(1,2); //与非模板函数匹配,不需要函数模板实例化

	Add(1,2.0);//模板函数可以生成更加匹配的函数,编译器会根据实参生成更加匹配的Add函数。

	return 0;
}

3. 模板函数不支持自动类型转换,但普通函数可以进行自动类型转换

💞2.类模板

💞1.1 类模板的概念

  类模板允许程序员编写与类型无关的代码,通过使用类模板,就可以生成特定类型的类,而无需为每种类型都编写特定的代码。

💞1.2 类模板的格式

template < typename T>
class 类模板名
{
 类中成员定义
};

//类模板
template<class T>
class Point 
{
public:
	T x, y;
	Point(T a,T b)
		:x(a)
		,y(b)
	{}

	T distanceFromOrigin()
	{
		return std::sqrt(x * x + y * y);
	}
};

Print类模板中有两个变量xy,它们都是类型T.构造函数接受两个参数来初始化xydistanceFromOrigin计算并返回点到原点的距离。

要使用类模板,我们需要指定模板参数的类型,并且创建该类型的对象。例如:

int main()
{
	Point<int> a(3, 4);
	cout << a.distanceFromOrigin() << endl;

	Point<double> b(2.5,3.5);
	cout << b.distanceFromOrigin() << endl;

	return 0;
}

💞1.3 类模板的优点

&emsp;类模板的好处是提高了类型的安全性,减少了代码的重复量。通过使用类模板,我们可以编写与类型无关的代码,并在需要时生成特定的类。

最后:

以上就是对c++模板的介绍,如有错误望各位大胆指出,如果这篇文章帮助到了你,记得关注,点赞,收藏, 欲知下篇如何,关注我,请尽请期待

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2216577.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

简单介绍$listeners

$listeners 它可以获取父组件传递过来的所有自定义函数&#xff0c;如下&#xff1a; // 父组件 <template><div class"a"><Child abab"handleAbab" acac"handleAcac"/></div> </template><script> impor…

【v5.3.0】修复订单批量发货提示 isPicUpload is not defined

使用订单批量发货的时候&#xff0c;没有反应&#xff0c;控制台提示 ReferenceError: isPicUpload is not defined 修改文件src/pages/order/orderList/components/tableList.vue 把isPicUpload改成isFileUpload&#xff0c;然后重新打包admin后台上传即可

音频分割:长语音音频 分割为 短语音音频 - python 实现

在做语音任务时&#xff0c;有是会用到的语音音频是长音频&#xff0c;这就需要我们将长音频分割为短音频。 该示例将声音的音量和静默时间结合作为语音的分割条件。 使用音量和静默时间结合的分割条件&#xff0c;能够比较好的进行自然断句&#xff0c;不会话语没有说完就切断…

【C++11】包装器:深入解析与实现技巧

C 包装器&#xff1a;深入解析与实现技巧 个人主页 C专栏 目录 引言包装器的定义与用途C 包装器的常见应用场景实现包装器的技巧使用 RAII 实现资源管理案例分析&#xff1a;智能指针模板包装器的应用包装器与设计模式性能优化更多应用案例总结 引言 C 是一门灵活且强大的语…

2024软考网络工程师笔记 - 第3章.广域通信网

文章目录 广域网物理层特性1️⃣公共交换电话网 PSTN2️⃣本地回路3️⃣机械特性4️⃣电气特性 &#x1f551;流量与差错控制1️⃣流量与差错控制2️⃣流量控制——亭等协议3️⃣流控机制——滑动窗口协议4️⃣差错控制5️⃣差错控制——停等协议6️⃣差错控制——选择重发ARQ协…

STARnak, LTR 模型笔记

未完成. 1. 简述 CIKM 23 的一篇论文, 任务为 Learning To Rank, 输入为 候选集合, 输出为 有序列表, 用于 top-n 推荐场景. 思考: 它是要替代 ctr 预估么?它跟 mind 这种召回, 有啥大的不一样么? 2. 网络结构 u u u: 将用户(或 query) 记为 u H q d X , d Y , . . . H…

SpringBoot3 + MyBatisPlus 快速整合

一、前言 MyBatis 最佳搭档&#xff0c;只做增强不做改变&#xff0c;为简化开发、提高效率而生。 这个发展到目前阶段已经很成熟了&#xff0c;社区也比较活跃&#xff0c;可以放心使用。官网地址&#xff1a;https://baomidou.com 二、快速开始 引入依赖 这里我引入了核心…

3.Three.js程序基本框架结构和API说明

Three.js程序基本框架结构和API说明 1.基本框架结构代码 一个基本的Three.js程序&#xff0c;基本都需要设置场景、渲染器、相机、灯光等等通用操作&#xff0c;因而我们可以把Three.js基本程序框架进行整理&#xff0c;如下。其中&#xff0c;我们可以用Three.js提供的Orbit…

深度解析计数排序:原理、特性与应用

目录 &#x1f4af;引言 &#x1f4af;计数排序的原理 ⭐核心概念 ⭐工作流程 1.确定计数范围 2.统计元素出现次数 3.计算累计计数 4.放置元素到正确位置 &#x1f4af;计数排序的实现 ⭐代码示例&#xff08;以 C 为例&#xff09; ⭐时间复杂度分析 ⭐稳定性分析…

【在Linux世界中追寻伟大的One Piece】Jsoncpp|序列化

目录 1 -> Jsoncpp 1.1 -> 特性 1.2 -> 安装 2 -> 序列化 3 -> 反序列化 4 -> Json::Value 1 -> Jsoncpp Jsoncpp是一个用于处理JSON数据的C库。它提供了将JSON数据序列化为字符串以及从字符串反序列化为C数据结构的功能。Jsoncpp是开源的&#xf…

CSS选择器及背景属性介绍

1.复合选择器 &#xff08;1&#xff09;后代选择器 &#xff08;2&#xff09;子代选择器 &#xff08;3&#xff09;并集选择器 &#xff08;4&#xff09;交集选择器 2.伪类选择器 即鼠标所悬停的内容变色 扩展&#xff1a;伪类选择器关于超链接 3.CSS三大特性 &#xff…

路由表来源(基于华为模拟器eNSP)

概叙 在交换网络中&#xff0c;若要实现不同网段之间的通信&#xff0c;需要依靠三层设备&#xff08;路由器、三层交换机等&#xff09;&#xff0c;而路由器只知道其直连网段的路由条目&#xff0c;对于非直连的网段&#xff0c;在默认情况下&#xff0c;路由器是不可达的&a…

心理咨询评估|基于springBoot的学生心理咨询评估系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 使用旧方法对学生心理咨询评估信息进行系统化管理已经不再让人们信…

Metasploit渗透测试之社会工程学工具SET

概述 社会工程师工具包&#xff08;SET&#xff09;是一个开源渗透测试框架&#xff0c;专门设计用于对人为因素执行高级攻击&#xff0c;并迅速成为渗透测试人员武器库中的标准工具。SET是TrustedSec&#xff0c;LLC的产品&#xff0c;TrustedSec&#xff0c;LLC是一家位于俄…

深入理解Qt中的QTableView、Model与Delegate机制

文章目录 显示效果QTableViewModel(模型)Delegate(委托)ITEM控件主函数调用项目下载在Qt中,视图(View)、模型(Model)和委托(Delegate)机制是一种非常强大的架构,它们实现了MVC(模型-视图-控制器)设计模式。这种架构分离了数据存储(模型)、数据展示(视图)和数据操作(委托),使…

安装指定node.js 版本 精简版流程

首先 我们本机上是否安装有node 如果有 需要先卸载 卸载完成后 使用命令查看是否卸载干净 打开WinR 输入cmd 然后输入如下名: where node 如果没有目录显示 说明node 很干净 本机没有相关安装 在输入命令: where npm 如果有相关目录 需要删除掉 要不然 后续安装的…

阿里云数据库导出 | 数据管理(兼容数据库备份)

文章目录 1、数据库导出2、操作步骤3、DMS - Data Management Service 1、数据库导出 2、操作步骤 3、DMS - Data Management Service

MySQL 【日期】函数大全(五)

目录 1、QUARTER() 返回一个指定日期所在季度值。 2、SEC_TO_TIME() 将指定的秒数转为一个格式为 HH:MM:SS 的时间值。 3、SECOND() 提取并返回时间的秒部分。 4、STR_TO_DATE() 将指定的字符串根据指定日期格式转为日期/时间。 5、SUBDATE() 在指定的日期/时间上减去指定…

127-4通道 12bit 125Msps 直流耦合 AD FMC 子卡

一、板卡概述: FMC 高速 AD 模块 FL9627 为 4 路 125MSPS&#xff0c; 12 位的模拟信号转数字信号模块。 FMC 模块的 AD 转换采用了 2 片 ADI 公司的 AD9627 芯片&#xff0c;每个 AD9627 芯片支持 2 路 AD 输入转换&#xff0c;所以 2 片 AD9627 芯片一共支持 4 路的 AD 输入…