函数模板和类模板

前言:各位老铁好,今天来分享函数模板和类模板的知识,这个算是一个小知识,但这个小知识非常重要,相信学C++的各位老铁一定听过STL这个名词,那么STL是什么呢?它与我们今天分享的这个函数模板和类模板有什么关系呢?

首先我们要明白STL全称是Standard Template Library,是c++的标准模板库,顾名思义,STL既然是一个模板库了,今天我们将的就是模板,所以我们可以知道今天分享的内容是为后面学习STL打基础的,好了,接下来进入正题了。

函数模板

1.概念:函数模板就表示一个函数家族,里面存着的模板适用于各种类型的参数,所以函数模板与函数的参数类型无关,函数模板会根据实参传过来的类型进行生成对应的函数类型版本。

2.语法格式:

template<class T>//这个是函数模板必须要写的开头
//class关键字可以换成typename关键字,但不能换成struct关键字
void Swap(T& left, T& right)
{T tmp = right;right = left;left = tmp;
}

这个就是一个交换函数的模板,你可以传任何类型的数据进行交换。
我们来看看能不能实现交换吧

template<class T>//这个是函数模板必须要写的开头
//class关键字可以换成typename关键字,但不能换成struct关键字
void Swap(T& left, T& right)
{T tmp = right;right = left;left = tmp;cout << left << " " << right;cout << endl;
}int main()
{int a = 0, b = 1;Swap(a, b);double c = 1.1, d = 2.2;Swap(c, d);string ch1 = "abc";string ch2 = "def";Swap(ch1, ch2);return 0;
}

在这里插入图片描述

3.函数模板的实例化

用不同类型的参数使用函数模板表示对函数模板的实例化,函数模板的实例化分为显示实例化和隐式实例化。

隐式实例化:让编译器通过实参来判断参数的类型,从而生成相对应得代码(上面得例子就是隐式实例化)

显示实例化:在调用时,在函数名后的<>中指定模板参数的实际类型

我们来看看下面这个代码

template<class T>//这个是函数模板必须要写的开头
//class关键字可以换成typename关键字,但不能换成struct关键字
void Swap(T& left, T& right)
{T tmp = right;right = left;left = tmp;cout << left << " " << right;cout << endl;
}int main()
{int a = 0;char b = 'a';Swap(a, b);return 0;
}

可以猜猜这个代码是正常运行还是报错,我们来看看结果吧
在这里插入图片描述
编译器直接报错了,这是为什么呢?我们可以看到a和b是不同类型的数据,现在我们要拿这两个不同类型的数据进行实例化,但我们可以发现,Swap的参数只有一个T类型,编译器不知道是实例化成int类型还是char类型 ,所以编译器直接就报错了,有的老铁会说编译器不是会自动从低类型转化为高类型吗?的确编译器在算术运算时会从低类型转化为高类型,但在模板函数里面,编译器一般不会进行隐式类型的转化,毕竟转化出了问题,编译器就要背锅了。

那么我们如何能解决这个问题呢?有两种方法,一是直接进行强制类型转化,二是使用显示实例化

**强制转化类型**
template<class T>
T ADD(const T& left, const T& right)
{return left + right;
}int main()
{int sum = 0;int a = 1;double b = 1.1;sum = ADD(a, (int)b);cout << sum << endl;return 0;
}

在这里插入图片描述

**显示实例化**
template<class T>
T ADD(const T& left, const T& right)
{return left + right;
}int main()
{int sum = 0;int a = 1;double b = 1.1;sum = ADD<int>(a, b);//这里表示将a和b都当成int类型,编译器会自动把b转化为int类型cout << sum << endl;return 0;
}

在这里插入图片描述

4.模板函数的匹配原则

1.一个非模板函数可以和一个同名的模板函数同时存在,且该模板函数还可以实例化为非模板函数

template<class T>
T ADD(const T& left, const T& right)
{return left + right;
}
int ADD(const int a, const int b)
{return a + b;
}int main()
{int sum = 0;int a = 1;double b = 1.1;sum = ADD(a, (int)b);//这里表示将a和b都当成int类型,编译器会自动把b转化为int类型cout << sum << endl;return 0;
}

在这里插入图片描述

对于同名模板函数和非模板函数,如果其他条件相同,编译器会优先调用非模板函数,这样毕竟效率高。

类模板

1.类模板定义:

template<class T>
class Vector//vector不是具体的类,而是一个可以生成任何类型的类的模具
{
public:Vector(size_t capacity = 10): _pData(new T[capacity]), _size(0), _capacity(capacity){}
private:T* _pData;size_t _size;size_t _capacity;
};

那么该如何在模板中实现在类中声明,在类外定义,其实也和非模板实现在类中声明,在类外定义差不多,

template<class T>
class Vector//vector不是具体的类,而是一个可以生成任何类型的类的模具
{
public:Vector(size_t capacity = 10): _pData(new T[capacity]), _size(0), _capacity(capacity){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();
private:T* _pData;size_t _size;size_t _capacity;
};//注意在类外定义时需要加模板参数列表
template<class T>
Vector<T>::~Vector()//Vector<T>才是类型
{if (_pData)delete[] _pData;_size = _capacity = 0;
}

2.类的实例化:

template<class T>
class Vector//vector不是具体的类,而是一个可以生成任何类型的类的模具
{
public:Vector(size_t capacity = 10): _pData(new T[capacity]), _size(0), _capacity(capacity){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();
private:T* _pData;size_t _size;size_t _capacity;
};//注意在类外定义时需要加模板参数列表
template<class T>
Vector<T>::~Vector()//Vector<T>才是类型
{if (_pData)delete[] _pData;_size = _capacity = 0;
}int main()
{//类模板实例化(只有实例化了才创建出一个真正的类)Vector<int> a;//Vector<int>才是类的类型,Vector只是类名return 0;
}

总结:

今天和大家分享的两个小知识,函数的模板和类的模板,它们有着共同点也有不同点,希望各位老铁看了这篇文章能有所收获。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Milvus Cloud向量数据库指南》——图像数据:ResNet50与图像及视频搜索的深度解析

图像数据:ResNet50与图像及视频搜索的深度解析 在当今信息爆炸的时代,图像和视频作为最直观、最富表现力的媒体形式之一,其搜索与检索技术显得尤为重要。无论是科研探索、艺术创作还是日常娱乐,人们越来越依赖于高效的图像和视频搜索工具来快速定位所需内容。其中,ResNet…

高频JMeter软件测试面试题

近期&#xff0c;有很多粉丝在催更关于Jmeter的面试题&#xff0c;索性抽空整理了一波&#xff0c;以下是一些高频JMeter面试题&#xff0c;拿走不谢~ 一、JMeter的工作原理 JMeter就像一群将请求发送到目标服务器的用户一样&#xff0c;它收集来自目标服务器的响应以及其他统计…

光伏气象站:绿色能源时代的守护者

光伏气象站&#xff0c;顾名思义&#xff0c;是结合了光伏发电技术与气象监测功能的创新设备。 它不仅能够利用太阳能自发电&#xff0c;实现绿色能源自给自足&#xff0c;还能精准监测并记录温度、湿度、风速、风向等关键气象参数。这些数据对于评估光伏系统的发电效率、优化电…

Java后端初开-->架构师学习路线!无偿分享!让你少走弯路

由于平台篇幅原因&#xff0c;很多java面试资料内容展示不了&#xff0c;需要的java面试宝典的伙伴们转发文章关注后&#xff0c;扫描下方二维码免费获取:

WebSocket 协议与 HTTP 协议、定时轮询技术、长轮询技术

目录 1 为什么需要 WebSocket&#xff1f;2 WebSocket2.1 采用 TCP 全双工2.2 建立 WebSocket 连接2.3 WebSocket 帧 3 WebSocket 解决的问题3.1 HTTP 存在的问题3.2 Ajax 轮询存在的问题3.3 长轮询存在的问题3.4 WebSocket 的改进 参考资料&#xff1a; 为什么有 h…

【调试笔记-20240731-Linux-Wordpress 添加 wp-weixin 插件支持微信用户扫码注册登录】

调试笔记-系列文章目录 调试笔记-20240731-Linux-Wordpress 添加 wp-weixin 插件支持微信用户扫码注册登录 文章目录 调试笔记-系列文章目录调试笔记-20240731-Linux-Wordpress 添加 wp-weixin 插件支持微信用户扫码注册登录 前言一、调试环境操作系统&#xff1a;Windows 10 …

有趣的PHP小游戏——猜数字

猜数字 这个游戏会随机生成一个1到100之间的数字&#xff0c;然后你需要猜测这个数字是什么。每次你输入一个数字后&#xff0c;程序会告诉你这个数字是“高了”还是“低了”&#xff0c;直到你猜对为止&#xff01; 使用指南&#xff1a; 代码如下&#xff0c;保存到一个p…

排序算法:快速排序,golang实现

目录 前言 快速排序 代码示例 1. 算法包 2. 快速排序代码 3. 模拟程序 4. 运行程序 5. 从大到小排序 快速排序的思想 快速排序的实现逻辑 1. 选择基准值 (Pivot) 2. 分区操作 (Partition) 3. 递归排序 循环次数测试 假如 10 条数据进行排序 假如 20 条数据进行…

DC-7靶机通关

今天咱们来学习第七个靶机&#xff01;&#xff01;&#xff01; 1实验环境 攻击机&#xff1a;kali2023.2 靶机&#xff1a;DC-7 2.1主机发现 2.2端口扫描 依旧是开了两个端口&#xff0c;一个 22 一个 80 &#xff01;&#xff01;&#xff01; 3.1查看对方网页 在这里我…

2024年必备技能:小红书笔记评论自动采集,零基础也能学会的方法

摘要&#xff1a; 面对信息爆炸的2024年&#xff0c;小红书作为热门社交平台&#xff0c;其笔记评论成为市场洞察的金矿。本文将手把手教你&#xff0c;即便编程零基础&#xff0c;也能轻松学会利用Python自动化采集小红书笔记评论&#xff0c;解锁营销新策略&#xff0c;提升…

redis的集群(高可用)

redis集群的三种模式&#xff1a; 主从复制 奇数 三台 一主两从 哨兵模式 3 一主两从 cluster集群 六台 主从复制&#xff1a;和mysql的主从复制类似&#xff0c;主可以写&#xff0c;写入主的数据通过RDB方式把数据同步到从服务器&#xff0c;从不能更新到主&#xff0c;也…

【卫星载荷之QF项目-001】Vivado 2018.3安装

1.简介 Vivado 是 FPGA 厂商赛灵思公司&#xff08;Xilinx&#xff09;于 2012 年起发布的集成设计环境。Vivado2018.3 是 2018 年 Xilinx 推出的 Vivado 最后一个版本&#xff0c;相对稳定。 2.软件下载 网上自己去官网即可获取安装资源包。 3.软件安装 解压缩安装包&…

通配符/泛域名https证书申请流程

通配符证书也叫泛域名证书&#xff0c;是一种SSL/TLS证书&#xff0c;用于同时保护一个域名及其所有二级子域名的安全&#xff0c;如果企业拥有众多子域名&#xff0c;那么通配符证书是一个非常合适的选择。市面上通配符证书很多&#xff0c;但是收费不一&#xff0c;从哪里申请…

开放式耳机有哪些比较推荐的?开放式耳机五款精品推荐

看到这篇文章的小伙伴&#xff0c;没错&#xff0c;这篇文章就是为了告诉你如何去挑选一款适合自己的开放式耳机&#xff0c;作为一个开放式耳机的测评师&#xff0c;这几年开放式耳机的产品是越来越多&#xff0c;我们的选择也是越来越多元&#xff0c;所以在我们面对这么多选…

Java 应用性能优化

一、性能调优涉及哪些方面 Java 编程性能调优。包括数据类型&#xff0c;集合容器&#xff0c;网络通信。 多线程性能调优。包括线程安全&#xff0c;同步锁的问题&#xff0c;多线程的性能问题。 JVM 性能监控及调优。包括Java对象的创建和回收&#xff0c;内存分配。 设计…

CRC的手算过程——MODBUS

软件计算结果&#xff1a; 原理参考下面的文章&#xff1a; https://www.cnblogs.com/esestt/archive/2007/08/09/848856.html https://blog.csdn.net/weixin_44256803/article/details/105805628 https://blog.csdn.net/d_leo/article/details/73572373 手算过程如下&#x…

LeetCode面试150——122买卖股票的最佳时机II

题目难度&#xff1a;中等 默认优化目标&#xff1a;最小化平均时间复杂度。 Python默认为Python3。 目录 1 题目描述 2 题目解析 3 算法原理及题目解析 3.1 动态规划 3.2 贪心算法 参考文献 1 题目描述 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支…

如何做OLED屏幕安装方案

制定OLED屏幕安装方案时&#xff0c;需要综合考虑多个方面&#xff0c;包括安装环境、屏幕尺寸、支架选择、电源与信号连接、调试与测试等。以下是一个详细的OLED屏幕安装方案&#xff1a; 一、前期准备 确定安装位置&#xff1a; 根据使用需求和环境条件&#xff0c;选择一个…

装修新选择:探索浦东地区口碑排名前五的大平层装修公司!

在繁华的浦东中寻找一个安静的港湾&#xff0c;大平层无疑是许多成功人士的首选。宽敞的空间、自由的布局设计&#xff0c;以及优雅的生活氛围&#xff0c;都是大平层备受青睐的理由。以下为您探索的浦东地区口碑排名前五的大平层装修公司&#xff1a; 1.即住空间装饰 即住空…

MoE:混合专家模型介绍(一)

MoE&#xff1a;混合专家模型介绍&#xff08;一&#xff09; 本文是对混合专家模型 (MoE) 详解重点摘要与归纳&#xff0c;有兴趣的小伙伴可以点击链接阅读原文。 混合专家模型 (MoEs)特点 与稠密模型相比&#xff0c;预训练速度更快与具有相同参数数量的模型相比&#xff…