模板初阶学习

news2025/2/22 20:22:46

✨前言✨

📘 博客主页:to Keep博客主页
🙆欢迎关注,👍点赞,📝留言评论
⏳首发时间:2023年11月21日
📨 博主码云地址:博主码云地址
📕参考书籍:《C++ Primer》《C++编程规范》
📢编程练习:牛客网+力扣网
由于博主目前也是处于一个学习的状态,如有讲的不对的地方,请一定联系我予以改正!!!

文章目录

  • 1 初识泛型编程
  • 2 函数模板
    • 2.1 概念
    • 2.2 原理
    • 2.3 函数模板的实例化
    • 2.4 模板参数的匹配原则
  • 3 类模板

1 初识泛型编程

我们之前学过一个交换的Swap函数,可以交换两个变量之间的值!但是我们后续在使用过程中就会发现,如果交换的两个变量的类型改变了,我们就必须要在写过一份!这样代码的复用率就太低了!那么我们在C++中为了解决这种代码复用率较低的问题。引用泛型编程这一概念!

泛型编程:编写一个与类型无关的通用代码!让编译器自己进行识别!这种是代码复用常见的手段!模板就是泛型编程的基础!

模板就可以简单理解为是通用的代码!以Swap函数为例:就是可以根据你传入的数据类型,编译器会生成对应类型的交换函数!模板可以分为:函数模板和类模板

2 函数模板

2.1 概念

函数模板的概念:函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本!

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

template表示这是一个模板,typename关键字是用来定义模板参数的关键字!也可以使用class关键字。但是不能用struct来代替class关键字!则我们可以写出Swap函数的模板:

template<typename T>

void Swap(T& x,T& y)
{
	T tmp = x;
	x = y;
	y = tmp;
}

int main()
{
	int a = 10;
	int b = 20;
	Swap(a,b);
	char x = '0';
	char y = '9';
	Swap(x, y);
	return 0;
}

2.2 原理

看起来我们使用的是同一份代码,但实际上我们用的不是同一份代码!在编译器编译阶段,编译器会根据传入的实参类型来推演生成我们所需要类型的Swap函数,比如说我们传入的实参是int类型那么此时编译器就会将模板参数换成int,从而调用!

2.3 函数模板的实例化

函数模板的实例化分为隐式实例化和显式实例化

上面我们所写的关于Swap函数,自己传入实参,由编译器自己进行识别推演的,我们称为隐式实例化!下面我们来介绍一下什么是显式实例化:

在函数名后的<>中指定模板参数类型

我们先来看这样一段代码:

template <typename P>
int ADD(P x,P y)
{
	return x + y;
}
int main()
{
	int a = 10;
	double b = 20.0;
	int ret = ADD(a, b);
	return 0;
}

在编译的时候就会出现报错,发现如下问题:
在这里插入图片描述这是因为在调用ADD函数时,编译器不知道是应该把int转换成double,还是把double转换成int!此时我们可以利用模板的显式实例化!

int ret = ADD<int>(a, b);

指明要将double转换成int类型!

2.4 模板参数的匹配原则

1️⃣一个非模板函数可以与一个同名的函数模板可以一起存在,并且该函数模板还是可以实例化生成同名非模板函数

int ADD(int a, int b)
{
	return a + b;
}
template <typename P>
int ADD(P x,P y)
{
	return x + y;
}
int main()
{
	int a = 10;
	int b = 20;
	ADD(a, b);//调用同名的非模板函数
	ADD<int>(10, 20);//编译器会调用特化的模板函数
	return 0;
}

2️⃣如果条件都相同,对于非模板函数与模板函数,会优先调用非模板函数,而不会从模板函数中在生成一个实例出来!如果模板函数能够产生一个更好匹配的函数,那么就会优先调用模板!

int ADD(int a, int b)
{
	return a + b;
}
template <typename P1,typename P2>
int ADD(P1 x, P2 y)
{
	return x + y;
}

int main()
{
	int a = 10;
	int b = 20;
	double c = 20.0;
	ADD(a, b);//优先调用非模板函数
	ADD(a, c);//优先调用模板函数

	return 0;
}

3️⃣模板函数不支持自动类型转换(隐式的类型转换,比如把double转换成int),普通函数支持自动类型转换!

3 类模板

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

之前我们在C语言中学过typedef关键字,我们只需要改变typedef后的数据类型,就可以更改类中所要存储的数据类型,代码如下:

typedef int Date;

class Stack {
private:
	Date* _a;
	int _capacity;
	int _top;
public:
	Stack(int capacity = 10){
		_a = new Date[capacity];
		_capacity = capacity;
		_top = 0;
	}
};

但是,这也是有局限性的,因为如果需要多个栈并且多个栈中的存储的数据类型不一样,我们也要多写几分类似的代码!类模板就可以很好的解决这个问题!

template <class T>
class Stack
{
private:
	T* _a;
	int _capacity;
	int _top;

public:
	Stack(int capacity = 4)
	{
		_a = new T[capacity];
		_top = 0;
		_capacity = capacity;
	}
};

类模板的实现原理和函数模板的原理是一样的,但是类模板是通过显示实例化,而不是让编译器自己进行推演!

int main()
{
	Stack<int> st1;//放int的栈
	Stack<double> st2;//放double的栈
	Stack<char> st3;//放char类型的栈

	return 0;
}

注意:通过类模板实例化的类不是和普通类一样,普通类的类名就是类型,实例化的类就是类名<数据类型>才是类型!
类模板中函数的声明与定义写法如下所示:

template <class T>
class Stack
{
private:
	T* _a;
	int _capacity;
	int _top;

public:
	Stack(int capacity = 4);
};

template <class T>
Stack<T>::Stack(int capacity = 4)//指定类型作用域
{
	_a = new T[capacity];
	_capacity = capacity;
	_top = 0;
}

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

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

相关文章

文心一言 VS 讯飞星火 VS chatgpt (140)-- 算法导论11.4 5题

五、用go语言&#xff0c;考虑一个装载因子为a的开放寻址散列表。找出一个非零的a值&#xff0c;使得一次不成功查找的探查期望数是一次成功查找的探查期望数的 2 倍。这两个探查期望数可以使用定理11.6 和定理 11.8 中给定的上界。 文心一言&#xff0c;代码正常运行&#xf…

LENOVO联想ThinkBook 16p G4 IRH(21J8)笔记本电脑原装出厂Windows11系统镜像

链接&#xff1a;https://pan.baidu.com/s/1q1vhzTA_VE4LnLvA-wVx7A?pwdvprc 提取码&#xff1a;vprc lenovo联想ThinkBook16P G4原厂Win11系统自带所有驱动、出厂主题壁纸、Office办公软件、联想电脑管家等预装程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&…

打造高效医患沟通:陪诊小程序开发技术指南

随着科技的不断发展&#xff0c;陪诊小程序作为医患沟通的新工具逐渐成为关注焦点。本文将带领你通过使用React和Node.js技术栈&#xff0c;构建一个功能强大且用户友好的陪诊小程序&#xff0c;实现医患互动的便捷和高效。 1. 准备工作 确保你的开发环境中已安装了Node.js和…

[SWPUCTF 2021 新生赛]非常简单的逻辑题 // %的逆向

代码解密题 flag xxxxxxxxxxxxxxxxxxxxx s wesyvbniazxchjko1973652048$-&*<> result for i in range(len(flag)):s1 ord(flag[i])//17s2 ord(flag[i])%17result s[(s1i)%34]s[-(s2i1)%34] print(result) # result v0b9n1nkajzj0c4jjo3oi1h1i937b395i5y5e0e…

练习题——【学习补档】库函数的模拟实现

各种库函数的模拟实现 一、模拟实现strlen1.地址-地址型2.递归型3.计数器型 二、模拟实现strcpy三、模拟实现strcmp四、模拟实现strcat五、模拟实现strstr 一、模拟实现strlen 模拟实现strlen有三种方法 1.地址-地址型 2.递归型 3.计数器型1.地址-地址型 // //1.地址-地址型 …

新茶饮进入“大逃杀”赛程

2023年&#xff0c;是新茶饮IPO的爆发年&#xff0c;也可能是淘汰赛的起始年。 10月18日&#xff0c;奈雪的茶披露了今年第三季度运营情況&#xff0c;数据显示&#xff0c;截至9月30日&#xff0c;奈雪的茶共经营1360家店。而自7月份开放加盟后&#xff0c;至今只发展了4家加…

区块链技术与应用 【全国职业院校技能大赛国赛题目解析】第五套智能合约安全漏洞测试

第五套题的智能合约安全漏洞测试题目 环境 : ubuntu20 Truffle v5.8.3 (core: 5.8.3) Ganache v7.8.0 Solidity v0.8.3 Node v18.16.0 Web3.js v1.8.2 前言 请在测试的时候开启ganache打开,并且在truffle的配置文件配好ganache,之前两个帖子忘说了/(ㄒoㄒ)/~~ truffle-con…

第四代可燃气体监测仪:可燃气体监测仪在燃气管网中的作用有哪些

燃气管网如同城市的血脉&#xff0c;纵横交错着覆盖在每一寸土地。然而如此复杂的管网&#xff0c;仅靠人工巡查难免有些力不从心。毕竟人工监测的范围有其局限性&#xff0c;难以做到全方位、全天候的紧密监测&#xff0c;难免会有疏忽和遗漏。如何将安全隐患消灭于萌芽状态&a…

WPF TextBox实现placeholder

WPF里TextBox没有placeholder&#xff0c;需要自己实现&#xff0c;本篇博客介绍WPF TextBox实现placeholder&#xff0c;效果如下&#xff1a; 实现技巧是在 TextBox 控件的 Style 中使用触发器&#xff08;Triggers&#xff09;来显示和隐藏placeholder文本。xmal代码如下&am…

基于Cortex®-M4F的TM4C123GH6NMRT7R 32位MCU,LM74900QRGERQ1、LM74930QRGERQ1汽车类理想二极管

一、TM4C123GH6NMRT7R IC MCU 32BIT 256KB FLASH 157BGA Tiva™C系列微控制器为设计人员提供了基于ARMCortex™-M的高性能架构&#xff0c;该架构具有广泛的集成功能以及强大的软件和开发工具生态系统。以性能和灵活性为目标&#xff0c;Tiva™C系列架构提供了一个具有FPU的80…

京东商品详情数据接口【京东API接口开发系列】,监控京东价格走势,接口代码示例,可高并发批量获取

京东开放平台提供了API接口来访问京东商品详情。通过这个接口&#xff0c;您可以获取到商品的详细信息&#xff0c;如商品名称、价格、库存量、描述等。 以下是使用京东商品详情API接口的一般步骤&#xff1a; 注册并获取API权限&#xff1a;您需要在京东开放平台上注册并获取…

初级测试工程师必看的功能测试六点要义

前言 根据一份报告&#xff0c;应用程序崩溃导致71&#xff05;的卸载。迫使用户卸载应用程序的其他原因是页面响应时间&#xff0c;混乱的UI&#xff0c;电池消耗等。这表明功能测试和非功能测试对于交付用户友好型应用程序的重要性。 一、测试基础的重要性 作为一名测试新…

js实现全选按钮

目录 html代码 css代码 js代码 完整代码 html代码 先把整体结构样式写出来 <table><thead><tr><th class"allCheck"><input type"checkbox" name"" id"checkAll" /><span class"all"&…

VCP-DCV VMware vSphere,即将开课~想了解点击查看

VCP-DCV VMware vSphere 本周开课~ 想报名的必须提前预约啦 &#x1f447;&#x1f447;&#x1f447; 课程介绍 本课程重点讲授如何安装、配置和管理VMware vSphere 8.0&#xff08;包括VMware ESXi™ 8.0和VMware vCenter Server™ 8.0&#xff09; 本课程将帮助您做好…

「编程学习书籍总结」提升个人能力从读书开始

✍️作者简介&#xff1a;码农小北&#xff08;专注于Java、Android、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a; 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN &#x1f514;如果文章对您有一定的帮助请&#x1f449;关注✨、…

音视频开发是不是C++开发中最难的细分方向?

音视频开发是不是C开发中最难的细分方向&#xff1f; 是不是最难不敢说(毕竟数据库、Office、 大型游戏可能更难)&#xff0c;但确实也已经很难 了。至少对我 这种主要搞web前端的人来说&#xff0c;真的有那种力不从心的感觉。最近很多小伙伴找我&#xff0c;说想要一些音视频…

设计模式系列:三、责任链设计模式

一、概述 责任链模式是一种行为设计模式&#xff0c;它允许多个对象处理一个请求&#xff0c;从而避免了请求的发送者和接收者之间的耦合关系。 优点是把任务划分为一个一个的节点&#xff0c;然后按照节点之间的业务要求、顺序&#xff0c;把一个个节点串联起来&#xff0c;…

Vulnhub 解决虚拟机网络问题

前言&#xff1a; 有的时候&#xff0c;我们从vulnhub官网下载ovf文件导入到虚拟机后&#xff0c;使用扫描器扫描存活的时候发现扫不到靶机的IP&#xff0c;这是因为虚拟机的网卡配置有问题。我们需要进安全模式修改一些配置。 1. 在虚拟机开机的时候按一下上下键&#xff0c;让…

全国的科技创新情况数据分享,涵盖2020-2022年三年情况

随着国家对科技创新的重视和大力支持&#xff0c;全国的科技创新情况越来越受到关注。 我们根据中国城市统计年鉴的这方面指标&#xff0c;分析汇总得出全国科技创新情况数据&#xff0c;需要说明的是&#xff0c;由于统计年鉴指标调整&#xff0c;每一年的数据并非字段相同&a…

Ubuntu Server download

前言 Ubuntu——公共云、数据中心和边缘上最受欢迎的 Linux 发行版。自成立以来&#xff0c;Ubuntu 一直在获得市场份额&#xff0c;截至今天已接近 50%。 Ubuntu Server download VersionUbuntu Server 其它主机型号版本Ubuntu AMD历史版下载百度云Ubuntu Server all Ubuntu…