[C++基础]-初识模板

news2024/12/22 9:18:10

前言

作者:小蜗牛向前冲

名言:我可以接受失败,但我不能接受放弃

 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。

目录

一、泛型编程

二、函数模板

1、函数模的概念

2、函数模板的示例化 

3、模板参数的匹配原则

3、类模板 

1、类模板的定义

2、类模板的实例化 


 本期学习目标,了解什么是泛型编程,学会使用函数模板和类模板。

一、泛型编程

什么是泛型编程呢?

百度是怎么说的:

 也就是说对于C++来说,泛型编程的出现是为了切合C++中的模板,那什么是模板呢?这个先不急这了解,下面我们先看一段代码:
 

//整形交换
void Swap(int& left, int& right)
{
	int tmp = left;
	left = right;
	right = tmp;
}

//浮点型交换
void Swap(double& left, double& right)
{
	int tmp = left;
	left = right;
	right = tmp;
}

//字符型交换
void Swap(char& left, char& right)
{
	int tmp = left;
	left = right;
	right = tmp;
}

这里我们写了一个交换函数,虽然交换函数里面的内容都是相同的,但是由于我们传的参数类型的不同,这就导致我们要写三个不同参数类型的函数(C++被函数重载所支持)。

这里我们使用函数重载虽然能够实现,但是有几个不好的地方:

1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数

2. 代码的可维护性比较低,一个出错可能所有的重载均出错

于是C++就提出了一个叫模板的东西,我们很以理解为我们要去拓印不同颜色的图画, 图画的内容是相同的,就是颜色不同,这时我们往往只要一个拓印的模板,想要拓印出不同颜色的图画,就用不同颜色的墨汁就可以了。

那么泛型编程和模板的关系:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。

二、函数模板

1、函数模的概念

既然C++提出了一个叫模板的概念,那么函数模板就可以认为是一个函数家族,该模板中的内容于类型无关,根据实参产生相应的特定类型。

函数模板的时候语法:

template<typename T1, typename T2,......,typename Tn>

返回值类型 函数名(参数列表){}

注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

2、函数模板的示例化 

用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化显式实例化

隐式实例化:让编译器根据实参推演模板参数的实际类型

下面我们用函数模板去实现交换函数:

template<typename T>
void Swap(T& left, T& right)
{
	T tmp = left;
	left = right;
	right = tmp;
}

 这里我们用写了一个函数模板,就实现了整形和浮点型的交换,但是我们在思考一个问题,模板能够让一个整形和浮点型进行交换吗?

这里我们让a和c进行交换:

 这里我们发现函数报错了,说函数的参数指向不明确,因为参数T不可能一会是整形,一会是浮点型,那么我们还有什么方法解决这个问题吗?

其实我们也可以在对于模板的时候使用都参数,定义出T1和T2,这样就能让T1指向整形,T2指向浮点型了。

显式实例化 :在函数名后的<>中指定模板参数的实际类型

下面我们继续写一个加法函数模板:

template<typename T>

T Add(const T& left, const T& right)
{
	return left + right;
}

int main()
{
	int a = 10;
	double b = 20.2;
	cout << Add<int>(a, b) << endl;
	return 0;
}

这里我们在函数名后的<>中指定模板参数的实际类型,这样函数就不会因为参数类型指定不明确而报错了。

 这里为什么会可以呢,其实是如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。

 这里为什么会报错了,不就是因为隐式类型无法转换。那我们为什么Add函数就可以转换成功而Swap函数就会报错。

其实是Add的形参用const的修饰了,形参是实参的一份临时拷贝,在拷贝实参的过程中会生成一个临时变量(临时变量具有常性),这里用const修饰就不会出现引用权限发大的现象(常变量赋值给常变量)。而Swap没有用const修饰(因为要进行二者的交换),这就会导致(将一个非常变量赋值给一个常变量导致引用权限的放大)。

3、模板参数的匹配原则

  • 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数
  • 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模 板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板
  • 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换

这里我们简单理解一下为什么说模板函数不允许自动类型的转换,如果要转化也是通过编译器强制进行的,如果转换不成功也会报错。 

3、类模板 

1、类模板的定义

对于类模板的其实也是和函数模板的定义也是差不多的,也是用关键字emplate来定义的。

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

2、类模板的实例化 

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<> 中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

/ Date类名,Date<int>才是类型
Date<int> s1;
Date<double> s2;

下面我们用类模板实现一个数组:

#define N 10
template<class T>
class arr
{
public:
	//重载[]
	T& operator[](size_t i)
	{
		assert(i < N);
		return _a[i];
	}
private:
	T _a[N];
};

这样的数组有什么用呢?

其实对于这个数组来说,如果一但越界就会检测出来(assert的断言了),而在C语言中的数组是抽查是否存在越界的情况。

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

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

相关文章

【正点原子STM32连载】第五十五章 T9拼音输入法实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

1&#xff09;实验平台&#xff1a;正点原子MiniPro H750开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id677017430560 3&#xff09;全套实验源码手册视频下载地址&#xff1a;http://www.openedv.com/thread-336836-1-1.html 4&#xff…

deepwalknode2vec 代码实战

提示&#xff1a;笔记内容来自于B站up主同济子豪兄 文章目录1. Embedding嵌入的艺术2. deepwalk2.1. 什么是图嵌入&#xff1f;2.2. deepwalk的步骤1、生成graph&#xff1b;2、利用random walk生成多个路径&#xff1b;3、训练表示向量的学习&#xff1b;4、为了解决分类个数过…

航拍遥感数据集

一、Roundabout Aerial Images for Vehicle Detection 本数据集是从无人机拍摄的西班牙环形交叉口航空图像数据集&#xff0c;使用PASCAL VOC XML文件进行注释&#xff0c;指出车辆在其中的位置。此外&#xff0c;还附带一个CSV文件&#xff0c;其中包含与捕获的环形交叉口的位…

深度学习 神经网络(2)前向传播

深度学习 神经网络&#xff08;2&#xff09;前向传播一、前言二、神经网络结构三、前向传播四、参考资料一、前言 前面介绍了《感知器》&#xff0c;类似于单个神经元细胞&#xff0c;现在我们用多个感知器组合成更加复杂的神经网络。本文介绍了多层神经网络通过前向传播方法…

超市营业额数据分析

文章目录1&#xff1a;查看单日交易额最小的3天的交易数据&#xff0c;并查看这3天是周几1.1&#xff1a;导入模块1.2&#xff1a;数据处理1.3&#xff1a;输出结果完整代码2&#xff1a;把所有员工的工号前面增加一位数字&#xff0c;增加的数字和原工号最后一位相同&#xff…

FBAR滤波器的工作原理及制备方法

近年来&#xff0c;随着无线通信技术朝着高频率和高速度方向迅猛发展&#xff0c;以及电子元器件朝着微型化和低功耗的方向发展&#xff0c;基于薄膜体声波谐振器&#xff08;Film Bulk Acoustic Resonator&#xff0c;FBAR&#xff09;的滤波器的研究与开发越来越受到人们的关…

酒楼拓客营销流程,酒楼宣传推广方案

随著网络时代的发展&#xff0c;许多行业受到了大大的冲击&#xff0c;其中也涵盖酒楼&#xff0c;在目前的情况下&#xff0c;对于酒楼来说&#xff0c;无论是互联网还是线下&#xff0c;引流都是最重要的。那么酒楼如何做好营销推广工作&#xff0c;从而提升业绩&#xff1f;…

乘风而起!企业级应用软件市场迅猛发展,有哪些机会可以把握?

数字化转型战略的深入&#xff0c;使我国企业级软件市场得到了迅速的发展&#xff0c;据统计&#xff0c;2021年我国企业级应用软件市场规模超过了600亿元&#xff0c;其中商业智能&#xff08;BI&#xff09;市场规模超过了50亿元。 得益于中国企业对于数据系统的本地化部署需…

Hadoop3 - MapReduce DB 操作

一、MapReduce DB 操作 对于本专栏的前面几篇文章的操作&#xff0c;基本都是读取本地或 HDFS 中的文件&#xff0c;如果有的数据是存在 DB 中的我们要怎么处理呢&#xff1f; Hadoop 为我们提供了 DBInputFormat 和 DBOutputFormat 两个类。顾名思义 DBInputFormat 负责从数…

MODBUS通信浮点数存储解析常用算法

MODBUS通信相关的基础知识,各种PLC通信程序的写法。可以参看专栏的其它文章这里不赘述。MODBUS通信时,数据帧都是以字节为单位发送和接收的,接收到的字节,如何存放和解析。就需要我们具备数据处理类的知识了,这里需要大家简单了解下有关数据结构的基础知识,这方面比较薄弱…

AcWing 蓝桥杯AB组辅导课 05、树状数组与线段树

文章目录前言一、树状数组1.1、树状数组知识点1.2、树状数组代码模板模板题&#xff1a;AcWing 1264. 动态求连续区间和例题例题1、AcWing 1265. 数星星【中等&#xff0c;信息学奥赛一本通】习题习题1&#xff1a;1215. 小朋友排队【中等&#xff0c;蓝桥杯】二、 线段树知识点…

27.5 Java集合之Set学习(基本概念,存储原理,性能测试)

文章目录1.Set接口1.1 Set的特性是什么&#xff1f;2.具体实现2.1 HashSet2.1.1 存储原理2.1.2 性能测试2.2 TreeSet2.2.1 存储原理2.2.2 性能测试2.3 EnumSet&#xff08;了解即可&#xff09;2.3.1 存储原理2.4 LinkedHashSet2.4.1 存储原理2.4.2 性能测试2.4.3 代码地址1.Se…

【Gitee】上传本地项目到 Gitee 仓库(入门篇)

本文主要介绍上传本地项目到 Gitee 仓库的过程&#xff0c;可以说是一个比较傻瓜的教材吧&#xff0c;从0开始&#xff0c;祝大家都能一次成功~~~ 一、前期准备 1. 配置 Gitte 创建 Gitte 账号&#xff0c;绑定好邮箱&#xff0c;并创建一个空仓库 。创建账号绑定邮箱过程这部…

【信号检测】基于小波变换的信号趋势检测和分离研究附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

双十一好物推荐:2022年好用的数码好物分享

一年一度的双十一尽在眼前&#xff0c;因为双十一的优惠力度是一年中最大的一次&#xff0c;所以许多人都想着直接一年屯一次&#xff0c;一次屯一年的理念&#xff0c;那么作为资深剁手党的我来说&#xff0c;对比于选购双十一好物来说我还是比较有心得的&#xff0c;下面让我…

机器视觉之工业摄像机知识点(一)

本文主要记录一些基础的工业摄像机的一些简要知识点。我也是根据我觉得比较重要的来记录。作为一位算法工程师&#xff0c;其实是有两条路来走&#xff0c;即技术专家以及技术经理。这两个实际是不同的职业方向。如果你不擅于与外部沟通交流&#xff0c;并且具备非常强的科研和…

基于OpenHarmony的ArkUI框架进阶对于高性能容器类和持久化和原子化的运用

文章目录高性能容器类Badge原子化服务代码简析表达式持久化高性能容器类 顾名思义&#xff0c;容器类是一个存储类&#xff0c;用于存储各种数据类型的元素&#xff0c;并提供一系列处理数据元素的方法。ArkUI开发框架提供了两种类型的容器类&#xff0c;线性和非线性。这些容…

【机器学习】求矩阵的-1/2次方的方法

目录 一、背景描述 二、D^(-1/2)的理论基础 三、代码实现 四、总结 一、背景描述 今天在看如下论文的时候&#xff1a; 态势感知图卷积网络在电力系统连锁故障中的应用-机器学习文档类资源-CSDN文库https://download.csdn.net/download/mzy20010420/86745616?spm1001.20…

Rust之常用集合(一):向量(vector)

开发环境 Windows 10Rust 1.64.0VS Code 1.72.2 项目工程 这里继续沿用上次工程rust-demo 常用集合 Rust的标准库包括许多非常有用的数据结构&#xff0c;称为集合。大多数其他数据类型表示一个特定的值&#xff0c;但是集合可以包含多个值。与内置数组和元组类型不同&…

2022年数维杯数学建模A题银行效率评价与破产成因分析求解全过程文档及程序

2022年数维杯数学建模 A题 银行效率评价与破产成因分析 原题再现&#xff1a; 银行在国家经济社会发展过程中扮演者重要的决策&#xff0c;银行的破产会对企业和个人造成众多不利的影响。相比国内的银行&#xff0c;国际银行的倒闭频次更高&#xff0c;因此国际银行倒闭原因的…