【1++的C++初阶】之模板

news2024/11/28 7:07:48

👍作者主页:进击的1++
🤩 专栏链接:【1++的C++初阶】

文章目录

  • 一,浅谈模板
  • 二,函数模板
  • 三,类模板

一,浅谈模板

在前面的文章【【1++的C++初阶】之C++入门篇1】中我们对函数重载有了一定的认识,函数重载有一定的好处,但其也有一些不足之处,例如,代码复用率低;可维护性不好。而模板能解决这种情况。模板就像工厂里 的摸具一样,对一些构造基本相同的产品能够加快其生成速率,可维护性也增加,产品出问题,只需去调整摸具。同样的,在编程中叫做泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。

二,函数模板

什么叫函数模板?
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

函数模板的格式:
template<typename T1, typename T2,…,typename Tn>
返回值类型 函数名(参数列表){}
注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

看下面这段代码:

template<typename T1,typename T2>
void Swap(T1& a, T2& b)
{
	T1 tmp = a;
	a = b;
	b = tmp;	
}

void Test1()
{
	int a = 2;
	short b = 48;
	float c = 1;
	Swap(a, c);
	Swap(a, b);
	cout << a << endl << b << endl << c << endl;

}
int main()
{
	Test1();
	return 0;
}

运行结果:

在这里插入图片描述
在这段代码中我们可以非常明显的看出,模板解决了上述函数重载中的不足 。

函数模板的实质:函数模板并不是函数,是编译器用来产生特定具体类型函数的摸具。有了模板后我们以前写函数重载时的一些重复动作就都交给了编译器。
接下来,我们谈谈,编译器遇到函数模板后是怎么做的?
我们以上述代码为例,在编译阶段,对于模板函数编译器会根据我们传过去的实参类型而推导出并生成对应类型的函数。
使用函数模板的过程我们称为函数模板的实例化,实例化有两种,一种是隐式实例化,另一种是显式实例化。隐式实例化:根据实参推演出函数模板参数的类型。
以以下代码为例:

void Swap(T1& a, T2& b)
{
	T1 tmp = a;
	a = b;
	b = tmp;	
}

void Test1()
{
	int a = 2;
	short b = 48;
	float c = 1;
	Swap(a, c);
	Swap(a, b);
	cout << a << endl << b << endl << c << endl;

}

但隐式实例化需要注意一些东西!
再来看一段:

template <class T>
T Add(T a, T b)
{
	return a + b;
}

void Test2()
{
	int a = 1;
	int b = 2;
	float c = 3;
	short d = 4;
	Add(a, b);//成功运行
	Add(a, c);//报错,编译错误
}

在这段代码中,我们看到,编译器在通过实参推演的时候a将T推演为int,c将T推演为float,因此就会产生错误。解决这种错误有两种方法,一种是在传参时进行强制转换,保证其类型相同,另一种则时进行显式实例化。
代码如下:

T Add(T a, T b)
{
	return a + b;
}

void Test2()
{
	int a = 1;
	int b = 2;
	float c = 3;
	short d = 4;
	Add(a, b);//成功运行
	cout << Add<int>(a, c) << endl;//显式实例化
}

注意:模板函数不能够使用自动类型转换

三,类模板

类模板的格式;
template<class T1, class T2, …, class Tn>
class 类模板名
{
// 类内成员定义
};

来看代码:

template <class T>
class Vector
{
public:
	Vector()
	{
		_size = 0;
		_capacity = 4;
		_data = new T[4];
	}

	~Vector()
	{
		delete[] _data;
		_size = 0;
		_capacity = 0;
	}

	void push(T x)private:
	int _size;
	int _capacity;
	T* _data;
};

//注意:类模板中函数放在类外进行定义时,需要加模板参数列表
template <class T>
void Vector<T>::push(T x)
{
	delete[] _data;
	_size = 0;
	_capacity = 0;
}

void Test3()
{
	Vector<int> L2;
	L2.push(1);
	L2.push(2);
	Vector<float>L3;
	L3.push(3.0);
}

类模板名字不是真正的类,而实例化的结果才是真正的类。

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

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

相关文章

Python-web开发学习笔记(3):Flask Demo,一个网站开发小案例

☕️ 推荐关注我的另一个专栏系列&#xff1a;大道至简&#xff0c;该系列收录了许多优质的人工智能算法博文&#xff0c;包括机器学习和自然语言处理等&#xff0c;持续更新中&#xff0c;欢迎各位关注~ 介绍完HTML标签&#xff0c;我们来搞一个简单的网站小案例&#xff0c;带…

一、CNNs网络架构-基础网络架构

目录 1.LeNet 2.AlexNet 2.1 激活函数&#xff1a;ReLU 2.2 随机失活&#xff1a;Droupout 2.3 数据扩充&#xff1a;Data augmentation 2.4 局部响应归一化&#xff1a;LRN 2.5 多GPU训练 2.6 论文 3.ZFNet 3.1 网络架构 3.2 反卷积 3.3 卷积可视化 3.4 ZFNet改…

6.4.6拓扑排序

用DAG&#xff08;有向无环图&#xff09;表示一个工程。顶点表示活动&#xff0c;有向边<Vi&#xff0c;Vj>表示活动Vi活动必须先与Vj活动进行。 所谓的拓扑排序&#xff1a;找到做事的先后顺序 以上根据拓扑排序的实现&#xff1a; 加入对有回路的图进行拓扑排序&#…

重磅,ChatGPT App 来了!(附保姆级教程)

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 日前&#xff0c;OpenAI宣布推出iOS移动版ChatGPT&#xff0c;为iPhone和iPad用户提供免费下载和使用机会。 总体而言&#xff0…

视频转换芯片MS7200概述 HDMI转数字RGB/YUV/HDMI RXReceive/替代IT66021FN

1. 基本介绍 MS7200 是一款 HDMI 接收芯片&#xff0c;兼容 HDMI1.4b 及 HDMI 1.4b 以下标准的视频 3D 传输格 式&#xff0c;最高分辨率可支持到 4K30Hz&#xff0c;最高采样率达到 300MHz。MS7200 支持 YUV 和 RGB 之 间的色彩空间转换&#xff0c;数字接口支持 YUV 及 RGB 格…

动态规划-完全平方数

动态规划-完全平方数 1 题目描述2 示例2.1 示例 1&#xff1a;2.2 示例 2&#xff1a;2.3 提示&#xff1a; 3 解题思路及方法3.1 解题思路3.1.1 确定状态3.1.2 转移方程3.1.3 初始条件和边界情况3.1.4 计算顺序 3.2 算法代码实现 跟着九章侯老师学习了动态规划专题之后根据学习…

联邦图神经网络:概述、技术和挑战

https://arxiv.org/pdf/2202.07256.pdf 摘要 图神经网络以其处理实际应用中广泛存在的图形数据的强大能力&#xff0c;受到了广泛的研究关注。然而&#xff0c;随着社会越来越关注数据隐私&#xff0c;GNN需要适应这种新常态。这导致了近年来联邦图神经网络&#xff08;FedGN…

一、阿里云oss

文章目录 一、阿里云oss1、开通“对象存储OSS”服务1.1创建Bucket1.2上传默认头像1.3获取用户acesskeys 2、使用SDK文档3、文件服务实现3.1搭建service-oss模块3.1.1 搭建service-oss模块3.1.2 修改配置3.1.3 启动类3.1.4配置网关 3.2 测试SDK3.3封装service接口3.4封装control…

【C++初阶】类和对象(下)构造函数(初始化列表) + explicit关键字 +static成员

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

如何下载旧版的Chrome

&#xff08;下面网址需要科学上网&#xff09; 1.获得浏览器版本号 访问 https://www.google.com 然后在搜索框中输入要搜索的浏览器版本号&#xff0c;例如 : site:chromereleases.googleblog.com 96.0。其中96.0是大版本号。 2.查询浏览器版本号的具体信息 访问 https://…

CANopenNode Master RPDO 配置

文章目录 CANopenNode 简介CANopenNode 主栈SDO ClientRPDORPDO 通讯参数RPDO 通信参数设置实例PDO 映射参数RPDO 映射参数设置实例 CANopenNode 简介 CANopenNode 是一个开源的免费的开源 CANopen 协议栈。 对象字典为任何变量提供清晰灵活的组织。可以直接或通过读/写函数…

电力系统的虚假数据注入攻击和MTD系统研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

代码随想录算法训练营第十五天|树的层序遍历 、226.翻转二叉树 、101.对称二叉树

层序遍历&#xff08;广度优先遍历&#xff09;&#xff1a; 遍历思路&#xff1a; 借用队列来实现。 若根节点不为空&#xff0c;则先将根节点放入队列&#xff0c; 随后&#xff0c;在while循环中&#xff0c;判断队列当前的size&#xff0c;队列的size就是树在该层中的节点…

ubuntu换镜像源(ubuntu换源)

ubuntu换镜像源&#xff08;ubuntu换源&#xff09; 文章目录 ubuntu换镜像源&#xff08;ubuntu换源&#xff09;1. 备份镜像源文件2. 根据不同 ubuntu 版本设置不同的镜像源2.1 focal 版本镜像源2.2 bionic 版本镜像源2.3 ubuntu 自带源&#xff1a; 参考文献 1. 备份镜像源文…

数据库连接 ---MySQL的总结(八)

数据库连接 —MySQL的总结&#xff08;八&#xff09; mysql使用在c编程之中使用&#xff0c;需要调用官方c库进行使用。 库的安装 库文件&#xff0c;安装mysql的c链接库 yum install mysql-server接口介绍 初始化 MYSQL *mysql mysql_init(nullptr);连接 mysql_real_conn…

“智汇新算力,众启Z力量”惠普发布全新一代Z系列工作站,共赢算力黄金时代

5月23日&#xff0c; “智汇新算力&#xff0c;众启Z力量”惠普Z系列新品发布会在上海盛大举行。本次发布会上&#xff0c;惠普Z 系列工作站焕新升级&#xff0c;以高算力、强稳定、强拓展的产品及解决方案&#xff0c;帮助各行业用户专注自身领域、驾驭复杂工作&#xff0c;从…

HNU-电路与电子学-小班2

第二次讨论 讨论题目&#xff1a; 1、电子秤的电桥电路可以分别用 1 个压控电阻、 2 个压控电阻、 3 个压控电阻、 4 个压控电阻实现吗&#xff1f;试写出每种实现的 U AB 输出表达式&#xff0c;并分析哪种实现电桥 电压的灵敏度&#xff08;SV/ △ R &#xff09;高。 …

【Python Tableau】零基础也能轻松掌握的学习路线与参考资料

一、学习路线 Python和Tableau都是当前市场上非常热门的数据分析和可视化工具。下面是Python Tableau的学习路线&#xff1a; 学习Python基础知识&#xff1a;Python是一门非常易学易用的编程语言&#xff0c;可以选择相应书籍进行学习&#xff0c;如《笨办法学Python》、《Py…

Node.js中Buffer的一些实现原理

1.前言 在ES6之前&#xff0c;JavaScript无法直接处理二进制数据&#xff0c;Node.js为了弥补这个不足引入了 Buffer&#xff0c;其是Node.js的核心模块之一&#xff0c;底层实现基于C。本文将从 Node.js v14.20.0 的源码分析 Buffer 的一些实现原理。 2.ArrayBuffer 在介绍…

Visual Studio插件DevExpress CodeRush v22.1- 支持C# 10

DevExpress CodeRush是一个强大的Visual Studio .NET 插件&#xff0c;它利用整合技术&#xff0c;通过促进开发者和团队效率来提升开发者体验。为Visual Studio IDE增压、消除重复的代码并提高代码质量&#xff0c;可以快速思考、自动化测试、可视化调试和重构。 CodeRush v2…