C++模板初阶

本期我们来学习C++的模板,我们本期只是简单学习,为后续做铺垫,未来会深入讲解

目录

函数模板

类模板


下面我们进入正题

我们之前学习了函数重载,有函数重载我们可以完成很多事情,比如交换两个变量

void Swap(int& left, int& right)
{
	int temp = left;
	left = right;
	right = temp;
}
void Swap(double& left, double& right)
{
	double temp = left;
	left = right;
	right = temp;
}
void Swap(char& left, char& right)
{
	char temp = left;
	left = right;
	right = temp;
}

但是有一个问题,我们写了这么多交换函数,代码的重复率是非常高的

如果加上我们的自定义类,就会有无穷的交换函数,那真要写起来可就太难了

所以就有了模板,模板有函数模板和类模板

函数模板

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定 类型版本。
函数模板的格式:
template<typename T1, typename T2,......,typename Tn>
返回值类型 函数名(参数列表){}

这里的tyeoename也可以改为class,但是C++设计者觉得直接用class不好,后来引入typename

比如我们写一个交换模板

template<typename T>
void Swap(T& x1, T& x2)
{
	T tmp = x1;
	x1 = x2;
	x2 = tmp;
}
typename T,这个T是模板参数,是类型,名字随意起,我们一般取名为T
我们来测试一下

 调用模板和普通函数是一样的

我们这里调用了两个Swap,调用的不是同一个函数,而是编译器生成的,我们来证明一下

我们可以看到两个call是不一样的

 这个过程就是模板的实例化,编译器根据传的参数不同,生成的函数也不同

 另外,我们从此以后不用写swap,C++库里是有的,我们可以直接用

 非常舒服

而且因为传的引用,指针也是可以交换的 

模板是可以传多个参数的,在上面的格式上我们也可以看到

既然模板类型可以做参数,也就可以做返回值

这里就是使用模板参数做返回值 

函数模板根据调用,自己推导模板参数的类型,实例化出对应的函数

模板参数可以用class和typename,但不可以用struct

 

我们说模板可以自动推导类型,但是有些情况它是推不出来的

 

比如这里,a给left,c给right,left要推成int,right要推成double,出现了冲突

 

我们可以用这种办法解决,让类型保持一致

或者这种办法,这种方法叫做显示实例化,这时候就不会通过传参推演,而是直接用指定类型实例化

 

多个参数也是同理

 

这是我们使用显示实例化的一个场景

另外,我们把const删掉,发现有些代码就编不过了

原因是类型转换会产生临时变量,临时变量具有常性,不能传给普通引用,要加const

类模板

这是我们之前写的栈,我们这里再次用它讲解知识

我们的栈现在只能存int类型,如果想存double类型的话,需要修改typedef  int DateType

不过修改后我们就无法存别的类型了,如果我们想同时有一个存int类型的栈,一个存double类型的栈,就需要把这段代码拷贝一份,然后修改一下,如果我们有无数类型,就要拷贝无数份

但是如果有一天我们发现栈有bug,那么我们拷贝的所有栈都需要修改,那太麻烦了

所以我们就需要类模板来解决这个问题

 

我们把所有的DateType换成T即可,而且这里我们使用new来申请空间,比malloc更方便

使用显示实例化

我们来看类模板的定义格式

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

类模板也是可以有多个参数的

 

多个参数时,使用加逗号即可,和函数模板是一样的 

类模板的声明和定义分离和普通类不一样的,我们目前先不要分离到不同文件,我们后续会讲为什么,我们先分离到同一个文件里

对于普通类,类名和类型是一样的,但对于类模板,类名和类型是不一样的

对于类模板,Stack<int>这种才是类型

 

类模板定义分离后,要加上template,而且这里的类名是Stack,类型是Stack<T>

再比如我们把push拿出来,也是一样的

以上即为本期全部内容,希望大家可以有所收获

如有错误,还请指正

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

tuple基本用法

元组简介 C11 标准新引入了一种类模板&#xff0c;命名为 tuple&#xff08;中文可直译为元组&#xff09;。tuple 最大的特点是&#xff1a;实例化的对象可以存储任意数量、任意类型的数据。 tuple 的应用场景很广泛&#xff0c;例如当需要存储多个不同类型的元素时&#xf…

高压功率放大器在木结构的螺栓连接松动检测系统中的应用

实验名称&#xff1a;功率放大器在面向木结构的螺栓连接松动检测系统中的应用 实验设备&#xff1a; 计算机、压电传感器PZT、D型数显扭矩扳手、NIELVISII&#xff0b;数据采集卡、ATA-2021H功率放大器等。 实验过程&#xff1a; 设计了一种基于压电时间反演法的木材连接螺栓松…

Menards EDI对接流程

Menards是一家美国的家居建材零售商&#xff0c;成立于1962年&#xff0c;总部位于美国威斯康星州的伊甸谷市。该公司经营各种家居建材产品&#xff0c;包括木材、地板、墙纸、厨房卫浴用品等&#xff0c;并拥有超过300家门店&#xff0c;分布在美国中西部和北部地区。Menards的…

Beats:如何在 Docker 容器中运行 Filebeat

今天在这篇博客中&#xff0c;我们将学习如何在容器环境中运行 Filebeat。 为了快速了解 Filebeat 是做什么用的&#xff1a; Filebeat用于转发和集中日志数据它重量轻&#xff0c;小型化&#xff0c;使用的资源更少它作为代理安装在你的服务器上它监视来自指定位置的日志文件…

[CTF/网络安全] 攻防世界 weak_auth 解题详析

[CTF/网络安全] 攻防世界 weak_auth 解题详析 弱认证弱认证绕过方法姿势Burp Suite 爆破 总结 题目描述&#xff1a;小宁写了一个登陆验证页面&#xff0c;随手就设了一个密码。 弱认证 weak_auth翻译&#xff1a;弱认证 这个术语通常用来描述一种较弱的安全认证方法或机制&am…

UVC调用过程部分细节分析

UVC调用过程部分细节分析 文章目录 UVC调用过程部分细节分析概括分析UVC驱动调用过程1.open:ioctl 2.VIDIOC_QUERYCAP3.VIDIOC_ENUM_FMT4.VIDIOC_G_FMT5.VIDIOC_TRY_FMT6.VIDIOC_S_FMT /7.VIDIOC_REQBUFS8.VIDIOC_QUERYBUF9.mmap10.VIDIOC_QBUF11.VIDIOC_STREAMON12.poll13.VID…

[CTF/网络安全] 攻防世界 backup 解题详析

[CTF/网络安全] 攻防世界 backup 解题详析 PHP备份文件名备份文件漏洞成因备份文件名常用后缀姿势总结 题目描述&#xff1a;X老师忘记删除备份文件&#xff0c;他派小宁同学去把备份文件找出来,一起来帮小宁同学吧&#xff01; PHP备份文件名 PHP 脚本文件的备份文件名&#…

MATLAB 之 其他形式的二维图形

文章目录 一、对函数自适应采样的绘图函数二、其他坐标系下的二维曲线图1. 对数坐标函数2. 极坐标图 三、其他特殊二维图像1. 条形类图形2. 面积类图形3. 散点类图形4. 矢量类图形 二维图线除采用直角坐标系外&#xff0c;还可采用对数坐标或极坐标。除了绘制二维曲线外&#x…

Anaconda安装与Python环境搭建

这篇文章介绍了如何安装Anaconda&#xff0c;及Python环境如何配置&#xff0c;你是否还在为难以寻找一篇讲述全面的环境配置博客而苦恼&#xff0c;稍安勿躁&#xff0c;你找对啦&#xff0c;照着本篇文章做下去&#xff0c;你就会发现没那么难呢&#xff01; Anaconda安装 …

Python系列模块之标准库OS详解

感谢点赞和关注 &#xff0c;每天进步一点点&#xff01;加油&#xff01; 目录 ​一、模块 1.1 模块的定义 1.2 模块的分类 1.3 模块的基本导入语法 二、Python中的包 三、标准库之os模块 实战&#xff1a; 钉钉告警应用 一、模块 1.1 模块的定义 Python 模块(Module)&a…

目标检测数据预处理——部件截图,按一定比例进行外扩

本片是截图的篇的升级版本&#xff0c;简单版本的截图请参考根据目标框外扩一定比例进行截图&#xff08;连带标签&#xff09;。 对目标框&#xff08;类别名称&#xff09;进行分类&#xff0c;将同一类的目标框进行截图并分类保存在不同的文件夹中。 在本篇当中&#xff0c;…

Flink有状态计算的状态容错

状态容错 State Fault Tolerance 首先来说一说状态容错。Flink 支持有状态的计算&#xff0c;可以把数据流的结果一直维持在内存&#xff08;或 disk&#xff09;中&#xff0c;比如累加一个点击数&#xff0c;如果某一时刻计算程序挂掉了&#xff0c;如何保证下次重启的时候&…

一文了解customRef 自定义ref使用

概念 按照文档中的说明&#xff1a;customRef 可以用来创建一个自定义的 ref&#xff0c;并对其依赖项跟踪和更新触发进行显式控制。它需要一个工厂函数&#xff0c;该函数接收 track 和trigger函数作为参数&#xff0c;并且应该返回一个带有 get 和 set 的对象。 其实大致意思…

5.2 标准IO:文件的打开、关闭及代码实现

目录 标准IO 文件的打开 标准I/O-fopen-mode参数 ​编辑 标准I/O-fopen-示例 标准I/O-fopen-新建文件权限 标准I/O-处理错误信息 标准I/O-错误信息处理-示例1 标准I/O-错误信息处理-示例2 文件的关闭 标准IO 文件的打开 打开就是占用资源 下列函数可用于打开一个…

历经70+场面试,我发现了大厂面试的套路都是···

今年的金三银四刚刚过去&#xff0c;我又想起了我在去年春招时面试了50余家&#xff0c;加上暑期实习面试了20余家&#xff0c;加起来也面试了70余场的面试场景了。 基本把国内有名的互联网公司都面了一遍&#xff0c;不敢说自己的面试经验很丰富&#xff0c;但也是不差的。 …

Kali-linux使用社会工程学工具包(SET)

社会工程学工具包&#xff08;SET&#xff09;是一个开源的、Python驱动的社会工程学渗透测试工具。这套工具包由David Kenned设计&#xff0c;而且已经成为业界部署实施社会工程学攻击的标准。SET利用人们的好奇心、信任、贪婪及一些愚蠢的错误&#xff0c;攻击人们自身存在的…

HNU-计算机系统-Challenge

Challenge 计科210X wolf 202108010XXX 本题是从属于第七次讨论课的个人题,听说做了有加分?我来试试。 下面是相关报告。 题目: C 语言的初学者第一个编写的 C 代码一般是如下所示的“ #include <stdio.h> int main() {printf("Hello, World!");

项目管理:有效的沟通对项目的成功至关重要

为实施有效的沟通&#xff0c;需要建立沟通管理计划同时理解什么是沟通&#xff0c;沟通的对象是谁&#xff0c;沟通的目标是什么&#xff0c;难度在哪里&#xff0c;并选择合适的沟通方式。 项目沟通是确保项目团队的相关信息能及时、正确地产生、收集、发布、储存和最终处理…

Java多线程异常处理

文章目录 一. 线程中出现异常的处理1. 线程出现异常的默认行为2. setUncaoughtExceptionHandler()方法处理异常3. setDefaultUncaoughtExceptionHandler()方法进行异常处理 二. 线程组内出现异常 一. 线程中出现异常的处理 1. 线程出现异常的默认行为 当单线程中初出现异常时…

LOTO示波器如何测试阻抗的频响曲线

LOTO示波器如何测试阻抗的频响曲线 模块的输入输出端口&#xff0c;在电路分析上&#xff0c;一般简单表征为电阻来进行计算和分析。但多数情况下&#xff0c;这些端口并不是纯电阻的特性&#xff0c;更精确一些&#xff0c;它可能是电阻电容以及电感的组合&#xff0c;表现为非…