【C++】---模板初阶(超详练气篇)
个人主页:平行线也会相交💪
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【C++之路】💌
本专栏旨在记录C++的学习路线,望对大家有所帮助🙇
希望我们一起努力、成长,共同进步。🍓
目录
- 一、 泛型编程
- 二、 函数模板
- 2.1函数模板示例化
- 2.2函数模板实例化的两种方式
- 三、类模板
- 3.1类模板的实例化
- 3.2类模板的声明和定义分离
一、 泛型编程
泛型编程,好家伙,名字倒是挺吓人,其实并没有啥可怕的,我们通过变换函数来引入泛型编程,请看:
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;
}
上述代码中,我们可以对int类型、double类型、char类型进行交换,在未来,我们如果对更多类型的变量进行交换应该怎么呢?
这个是问题刚好可以利用泛型参数来解决,请看;
//模板
//函数模板+类
template<typename T>
void Swap(T& x1, T& x2)
{T tmp = x1;x1 = x2;x2 = tmp;
}
int main()
{int a = 10, b = 20;double c = 1.1, d = 2.2;Swap(a, b);Swap(c, d);return 0;
}
模板参数定义的是函数的参数类型。
另外一点,Swap(a, b);和Swap(c, d);调用的并不是同1个函数
,我们观察一下汇编代码来看一下:
如果我们想要交换两个指针,也是可以的,请看:
int* p1 = &a;int* p2 = &b;swap
,如下图我们可以看到也可以交换指针:
二、 函数模板
模板概念:
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
2.1函数模板示例化
函数模板格式:
//返回值类型 函数名(参数列表){}
template<typename T>
void Swap( T& left, T& right)
{T temp = left;left = right;right = temp;
}
上述代码是交换函数的一个代码,那我们调用的时候并不是调用的那个模板,编译器调用的其实是函数模板实例化生成的具体函数。
编译器通过模板生成具体函数的过程称之为函数模板的实例化。请看图:
在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。
template<typename T>
void Swap(T& x1, T& x2)
{T tmp = x1;x1 = x2;x2 = tmp;
}
下面举多个参数类型的例子,请看:
template<typename T1,typename T2>
T1 Func(const T1& x, const T2& y)
{cout << x << " " << y << endl;return x;
}
//T1 T2可以是任意类型,比如自定义类型或者内置类型
//函数模板实例化生成具体函数
//函数模板根据调用会自己推导模板参数的类型,实例化出对应的函数
int main()
{Func(1, 2);Func(1.1, 2.2);return 0;
}
注意:template<typename T1>
中的typename
可以换成class
,但是不可以换成struct
。
2.2函数模板实例化的两种方式
函数模板的实例化的两种方式,分为:隐式实例化和显式实例化。
。
请注意看T Add(const T& left, const T& right)
中为什么要加const
,这里涉及到权限的问题。举个例子:cout << Add(a1, (int)d1) << endl;(隐式类型转换)
, cout << Add<double>(a1, d1) << endl; (显式类型转换)
无论是显式类型的转换还是显式类型的转换,类型的转换会产生临时变量,临时变量具有常属性,常属性不能传给普通的引用(因为权限被放大了),所以要加上const
。
我能不能这样写呢?请看:
现在我们应该怎么解决呢?首先这里解决方法有两种。
方式一(两者之间只能听其中一个的话),实参传递的时候推演T的类型:
方式二(显式实例化):
上述的显式示例化其实并不是这样完的,下面来看一下必须要用到显式示例化的场景。
三、类模板
3.1类模板的实例化
类模板的定义格式:
template<class T1, class T2, ..., class Tn>
class 类模板名
{// 类内成员定义
};
类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类
。
template<class T>
class Stack
{
public:Stack(size_t capacity = 10){/*_array = (T*)malloc(capacity * sizeof(T));if (nullptr == _array){perror("malloc申请空间失败");return;}*/_array = new T[capacity];_size = 0;_capacity = capacity;}void Push(const T& data){// CheckCapacity();_array[_size] = data;_size++;}~Stack(){if (_array){free(_array);_array = nullptr;_capacity = 0;_size = 0;}}
private:T* _array;size_t _size;size_t _capacity;
};
int main()
{Stack<int> s1;//s1存int类型Stack<double> s2;//s2存double类型Stack<char> s3;//s3存char类型return 0;
}
3.2类模板的声明和定义分离
对于普通类而言,类名就是类型。
对于类模板而言,类名是类名,类型是类型,二者是不一样的。
请看下面举例:
template<class T>
class Stack
{
public:Stack(size_t capacity = 10);void Push(const T& data);~Stack();
private:T* _array;size_t _size;size_t _capacity;
};template<class T>
Stack<T>::Stack(size_t capacity)
{/*_array = (T*)malloc(capacity * sizeof(T));if (nullptr == _array){perror("malloc申请空间失败");return;}*/_array = new T[capacity];_size = 0;_capacity = capacity;
}template<class T>
void Stack<T>:: Push(const T& data)
{// CheckCapacity();_array[_size] = data;_size++;
}template<class T>
Stack<T>::~Stack()
{if (_array){free(_array);_array = nullptr;_capacity = 0;_size = 0;}
}
对于上述代码而言,Stack是类名,Stack<T>是类型,但是如果类模板实例化时候,类名就是具体的Stack<int>或者Stack<char>等
。
关于类模板的声明和定义分离的讲解,在模板进阶那一部分进行更深一步的讲解。
好了,以上就是【C++】模板初阶内容的讲解,就到这里啦!
再见啦,友友们!!!
相关文章:
【C++】---模板初阶(超详练气篇)
个人主页:平行线也会相交💪 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C之路】💌 本专栏旨在记录C的学习路线,望对大家有所帮助🙇 希望我们一起努力、成长&…...
windows系统典型漏洞分析
内存结构 缓冲区溢出漏洞 缓冲区溢出漏洞就是在向缓冲区写入数据时,由于没有做边界检查,导致写入缓冲区的数据超过预先分配的边界,从而使溢出数据覆盖在合法数据上而引起系统异常的一种现象。 ESP、EPB ESP:扩展栈指针(…...
WPF开发txt阅读器:需求分析和文件读写
文章目录 需求分析读取文本文件保存文本文件 需求分析 尽管现在比较主流的阅读格式已经是epub, modi之类的,但txt的使用范围要远比前两者广泛,所以做一个txt阅读器还是有必要的。 但是对于书籍阅读而言,纯文本不包含目录信息,这…...
C++服务器框架开发9——日志系统LogFormatter_4/各个类的关系梳理/std::function/std::get
该专栏记录了在学习一个开发项目的过程中遇到的疑惑和问题。 其教学视频见:[C高级教程]从零开始开发服务器框架(sylar) 上一篇:C服务器框架开发8——日志系统LogFormatter_3/override/宏定义优化switchcase结构 C服务器框架开发9——日志系统LogFormatt…...
arm平台上的MNN编译与运行
0.成果物 直接获取成果物见:https://download.csdn.net/download/u012824853/87867665 以下为编译、运行过程 1.编译准备 在GitHub - alibaba/MNN: MNN is a blazing fast, lightweight deep learning framework, battle-tested by business-critical use cases …...
python 编译安装指定版本 for linux
python环境是linux中必备的,部分发行版会自带python,有时候需要安装手动安装 注意:如果需要多个版本并存,建议使用conda环境,如果自己配置多版本,需要用多个软链接 conda环境,可以参考&#x…...
在Linux系统下基于Docker搭建Redis集群
创建镜像 #部署Redis集群,该集群有3个节点; --cluster-enabled yes允许启用集群; docker create --name redis-node--01 --net host -v /data/redis-data/node1:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file redis-node--01.conf --port 6379…...
牛客网刷题Day5
1.内容中可以使用哪个元素来表示 <article> 标签外的内容? A aside B cite C article D class 正确答案:A 解析:<aside> 标签定义 <article> 标签外的内容,aside 的内容应该与附近的内容相关 2. 以下的HTML代码…...
Vue.js 中的动态组件是什么?如何使用动态组件?
Vue.js 中的动态组件是什么?如何使用动态组件? Vue.js是一种流行的前端框架,它提供了一种称为“动态组件”的技术,使得我们可以动态地切换组件的内容和结构。在本文中,我们将深入探讨Vue.js中的动态组件,包…...
2023年京东618预售数据:传统滋补成预售黑马,预售额超27亿
这一期主要分享一下此次京东618预售期间的一个黑马行业——传统滋补。不管是从预售量和预售额来看,传统滋补品类的成绩都是此次大促中的佼佼者。 究其原因,近几年养生滋补也掀起了一股“国潮风”。在小红书、抖音等社交平台上,关于“健康养生…...
【Linux系统基础快速入门详解】Linux 常用文件过滤编辑命令原理详解和每个命令使用场景以及实例
Linux 文件过滤编辑命令:echo,printf,cat,tee,特殊符号: {a..z},seq序列,rename 文件过滤编辑命令:echo:将字符串输出到终端或文件中。常用于输出环境变量,或者在shell脚本中输出一些提示信息。例如:echo $PATH,输出环境变量PATH的值。printf:格式化输出字符串到终端或文…...
05WEB系统的通信原理图
WEB系统的通信原理 名称作用URL统一资源定位符, 例如:http://www.baidu.com域名在https://www.baidu.com/这个网址中www.baidu.com 是一个域名IP地址计算机在网络当中的一个身份证号, 在同一个网络当中IP地址是唯一的, 有了IP地址两台计算机直接才能建立连接通信端口号一个计算…...
降低试错成本,低代码或成企业数字化转型突破口
近年来,随着市场竞争和宏观环境的双重驱动,数字化已经成为企业提升竞争性和保持可持续发展的重要手段,大多数企业意识到数字化转型的重要性,纷纷入局。 作为数据驱动业务创新的一个新方法,但行业成功的案例并不多&…...
串口助手(串口发送接收数据, 定时, 清空, hex显示)
文章目录 前言一、串口接收数据1. 默认接收,换行,hex显示2. 清空接收区数据3. 保存接受区数据 二、串口发送数据1. 默认发送2. 定时发送 三、串口助手优化1. 设置组合框当前内容。2. 未检测到串口,弹出警告。3. 载入文件 总结 前言 这篇文章…...
bp神经网络
%% 2.读取数据(两个文件) datareadmatrix(C:\Users\Administrator\Desktop\synthetic_01.csv); file_lengthlength(data); for i1:file_length %用for循环去导入第二个csv文件 namedata(i); pathstrcat(C:\Users\Administrator\Desktop\ydata.…...
strace交叉编译后对特定文件的写流程进行监控和过滤
交叉编译 为了支持strace对pid进行解析,因系统默认支持的strace版本较低,需要使用较新的版本对strace进行交叉编译,这里使用了github上的 https://github.com/strace/strace/releases 发布的strace v5.19版本,2022-08-12发布。lo…...
初识网络之TCP网络套接字
目录 一、TCP常用网络接口 1. 监听服务器 2. 接收链接 3. 发起连接 二、实现一个简单的tcp程序 1. 日志函数 2. 服务端文件 2.1 .hpp文件 2.2 .cpp文件 3. 客户端文件 3.1 .hpp文件 3.2 .cpp文件 4. 程序测试 三、实现支持多个用户并发访问的tcp程序 1. 当前程序…...
自然语言处理从入门到应用——自然语言处理的基本问题:文本分类(Text Classification, Text Categorization)
分类目录:《自然语言处理从入门到应用》总目录 文本分类(Text Classification, Text Categorization)是最简单也是最基础的自然语言处理问题。即针对一段文本输入,输出该文本所属的类别,其中,类别是事先定义…...
【论文】——Robust High-Resolution Video Matting with Temporal Guidance浅读
视频matting 时序监督 摘要 我们介绍了一种稳健、实时、高分辨率的人类视频抠图方法,该方法取得了新的最先进性能。我们的方法比以前的方法轻得多,可以在Nvidia GTX 1080Ti GPU上以76 FPS处理4K,以104 FPS处理HD。与大多数现有的逐帧作为独…...
第四章、用户体验五要素之范围层解析(本文作用是通俗讲解,让你更容易理解)
把用户需求和产品目标转换成特定的产品时应该提供给用户什么样的内容或者功能就变成了范围层。 范围层就是定义需求。如果不能很好的定义需求,那么你的软件永远都是测试待发布版本。如果产品只是负责人脑海中的一个不定型印象,那将是灾难性的。 1、产品负…...
计算机毕业论文内容参考|基于python的农业温室智能管理系统的设计与实现
文章目录 导文文章重点前言课题内容相关技术与方法介绍技术分析技术设计技术设计技术实现方面系统测试和优化总结与展望本文总结后续工作展望导文 计算机毕业论文内容参考|基于python的农业温室智能管理系统的设计与实现 文章重点 前言 本文介绍了一种基于Python的农业温室智…...
Java 进阶 -- 流
Java I/O, NIO, and NIO.2 BaseStream<T, S extends BaseStream<T, S>> extends AutoCloseable 流(streams)的基本接口,流是支持顺序和并行聚合操作的元素序列。下面的例子演示了一个使用流类型stream和IntStream的聚合操作,计算红色小部件…...
硬件 TCP/IP 协议栈
目录 全硬件的TCP/IP 协议栈简介以太网接入单片机方案以太网接口芯片CH395Q 简介以太网接口芯片CH395Q 命令简介以太网接口芯片CH395Q 寄存器配置与使用移植CH395Q 源码 TCP_Client 实验TCPClient 配置流程TCPClient 实验硬件设计程序设计下载验证 WebServer 实验WebServer 简介…...
word恢复和粘贴按钮变灰色,不可用怎么办?
如果 Word 中的恢复和粘贴按钮变成灰色,可能是由于以下原因之一: 1. 文档处于只读模式。 2. 与 Office 相关的某些组件已损坏或缺失。 3. Word 的文件权限被配置为只读。 以下是一些可能的解决方法: 1. 检查文档是否处于只读模式。 如果是…...
【unity技巧】Physics2D Raycast、Overlapcircle、OverlapBox检测的用法
文章目录 分析检测地面1. 使用Raycast1.1 介绍1.3 场景窗口可视化1.4 完整实例代码1.4 存在问题1.4.1 问题11.4.2 问题2 2. 使用Overlapcircle2.1 介绍2.2 场景窗口可视化2.3 完整实例代码2.4 存在问题 3. 使用OverlapBox3.1 介绍3.2 场景窗口可视化3.3 完整实例代码3.4 注意事…...
一、kafka入门
Kafka入门 为什么要用消息中间件? 异步处理 场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种1.串行的方式;2.并行方式。 串行方式:将注册信息写入数据库成功后,发送注册邮件ÿ…...
公司新来一00后,真让人崩溃...
2022年已经结束结束了,最近内卷严重,各种跳槽裁员,相信很多小伙伴也在准备今年的金九银十的面试计划。 在此展示一套学习笔记 / 面试手册,年后跳槽的朋友可以好好刷一刷,还是挺有必要的,它几乎涵盖了所有的…...
(1Gb)S28HS01GTGZBHA030/ S28HS01GTGZBHV033/ S28HS01GTGZBHA033 FLASH - NOR闪存器件
产品简介: Infineon 带有HyperBus™的S26HSxT以及S26HLxT Semper™闪存是一种高性能、安全可靠的NOR闪存解决方案。 这些组件集成了关键的安全功能,用于汽车、工业、通信等行业的各种应用。S26HSxT和S26HLxT Semper闪存采用HyperBus接口,符…...
苹果服务端通知v2处理(AppStore Server Notifications V2)
苹果服务端通知v2处理 关键词: App Store Server Notifications V2、Python源码、苹果订阅、JWS、x5c、JSON WEB TOKEN 背景 最近要接入苹果订阅功能,调研后发现订阅生命周期内的状态变更是通过苹果服务端通知返回的(什么时候普通内购也能加上减少掉单的概率)&am…...
matlab 道路点云路缘石边界提取
目录 一、功能概述1、算法概述2、主要函数3、参考文献二、代码实现三、结果展示四、参考链接一、功能概述 1、算法概述 1、对于扫描线上的每个点,该函数计算这三个特征。 高差特征——计算一个点周围的标准偏差和高度最大差。路缘石点的标准偏差和高度差必须分别在指定的Heig…...
做婚恋网站代理商挣钱吗/信息推广
When he heard the bomb whistling down,Gaer chucked himself down on the floor with his hands over his head.盖尔听到炸弹呼啸落地的声音,立即用双手抱住头趴在地上。The bare concrete floor was cold on my feet.光秃秃的水泥地板使我两脚发冷。There werent enough cha…...
凡客诚品 v官网/seo黑帽教程视频
3.linux程序设计基础—vi使用 (24页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!19.9 积分Haubo Training Center Linux开发基础-VI使用 张勇涛 Vi简介 ? Vi是“Visual interface”的简称 ? Unix…...
自己可以做网站服务器吗/关键词优化排名
数据结构与算法的JavaScript描述——图和图算法 说明:以下部分均为《数据结构与算法的JavaScript描述》学习内容及笔记 1、构建图 function Graph(v){this.verticesv;this.edges0;this.adj[];for(var i0;i<this.vertices;i){this.adj[i][];this.adj[i].push(&…...
北京微信网站制作/2020年十大关键词
概述 需要开发一款工具,要使用的到json的解析和一个良好的日志系统。 寻找新的开源库我选择了 https://www.libhunt.com/网站,找到了三方库。 日志: sqdlog json: json 导入模式 选择了git的submodule。 [submodule "lib/…...
深圳需要做网站的公司有哪些/四川seo整站优化
本文实例讲述了Java实现简易HashMap功能。分享给大家供大家参考,具体如下:创建节点类节点类含有的属性:键值对(value,key)以及指向下一节点的next;这些属性的get以及set方法代码如下:/*** 节点类* author H…...
心悦做宠物的网站/seo有些什么关键词
14.1 组件开发基础 CDD 基础 CDD(Component-Driven Development) 自上而下从组件级别开始,到页面级别结束 先从相对完的的设计中抽象出来组件,先隔离开发组件然后再开发页面 CDD的好处 组件在最大程度被重用并行开发 对单个…...