【C++初阶】模板

news2024/10/5 14:32:52

⭐博客主页:️CS semi主页
⭐欢迎关注:点赞收藏+留言
⭐系列专栏:C++初阶
⭐代码仓库:C++初阶
家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我创作最大的动力,欢迎友友们私信提问,家人们不要忘记点赞收藏+关注哦!!!

模板

  • 前言
  • 一、泛型编程
  • 二、函数模板
    • 1、函数模板概念
    • 2、函数模板格式
    • 3、函数模板的原理
    • 4、函数模板的实例化
      • (1)隐式实例化
      • (2)显式实例化
    • 5、模板参数的匹配原则
  • 三、类模板
    • 1、类模板的定义格式
    • 2、声明定义分离
    • 3、类模板实例化


前言

什么是模板,它说,用一套模式解决一切烦恼,它又说,只要拥有了我,不管你是函数还是类,都可以用一套阵容解决,那是在是太方便了,我们闲话不多说,直接来!


一、泛型编程

我们先来一个简单的Swap重载的函数,是需要调用不同类型的函数进行交换值的,如下图:
在这里插入图片描述
使用函数重载虽然可以实现,但是有一下几个不好的地方:

  1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函
  2. 代码的可维护性比较低,一个出错可能所有的重载均出错

我们日常生活中经常用的书本,大家的都各不相同,那怎么办呢,是不是如果现在有个模板就会舒服很多,我照着这个样子进行打印会很舒服,正所谓前人栽树后人乘凉,我们用本贾尼老爷子当初使用的模板,即我们所讲的泛型编程。
泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。

在这里插入图片描述


二、函数模板

1、函数模板概念

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

2、函数模板格式

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

在这里插入图片描述
在这里插入图片描述

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

3、函数模板的原理

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器。

在这里插入图片描述
编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。

4、函数模板的实例化

函数模板根据调用自己推导模板参数的类型实例化出对应的函数。
用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化

我们用下面的例子进行讲解:
在这里插入图片描述
我们如果想将两个不同类型的参数传到函数中怎么办,有的人会说那么我们就用两个函数模板,可是一个问题:返回值返回哪个呢?所以最后我们使用模板的两种实例化进行解决,也就是用一个实例化,只需要将实参进行转化即可呀!
在这里插入图片描述

(1)隐式实例化

含义:让编译器根据实参推演模板参数的实际类型。

在这里插入图片描述

(2)显式实例化

含义:在函数名后的<>中指定模板参数的实际类型。

在这里插入图片描述
如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。

我们经常使用的显示实例化模型如下:
有些函数不能自动推,只能显示实例化。
在这里插入图片描述
当然了,也可以有多个模板参数,如下所示:

Stack<int,double,char>

5、模板参数的匹配原则

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

// 专门处理int的加法函数
int Add(int left, int right)
{
	return left + right;
}
// 通用加法函数
template<class T>
T Add(T left, T right)
{
	return left + right;
}
void Test()
{
	Add(1, 2); // 与非模板函数匹配,编译器不需要特化
	Add<int>(1, 2); // 调用编译器特化的Add版本
}

2、对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板。

// 专门处理int的加法函数
int Add(int left, int right)
{
	return left + right;
}

// 通用加法函数
template<class T1, class T2>
T1 Add(T1 left, T2 right)
{
	return left + right;
}
void Test()
{
	Add(1, 2); // 与非函数模板类型完全匹配,不需要函数模板实例化
	Add(1, 2.0); // 模板函数可以生成更加匹配的版本,编译器根据实参生成更加匹配的Add函数
}

int main()
{
	Test();
	return 0;
}

3、模板函数不允许自动类型转换,但普通函数可以进行自动类型转换


三、类模板

1、类模板的定义格式

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

2、声明定义分离

我们之前在讲述的普通类只需要加一个类域即可将声明和定义分离开,而我们的类模板可以吗,那当然是不可以的,我们来进行讲解一下:
在这里插入图片描述
在这里插入图片描述
代码如下:

// 类模板
template < class T>
class Stack
{
public:
	Stack(size_t capacity = 3);
	void Push(const T & data);
	~Stack();
	
private:
	T * _array;
	int _capacity;
	int _size;
};


template < class T>
Stack<T>::Stack(size_t capacity)
{
	_array = new T[capacity];
	_capacity = capacity;
	_size = 0;
}

template < class T>
void Stack<T>::Push(const T & data)
{
	_array[_size] = data;
	_size++;
}

template<class T>
Stack<T>::~Stack()
{
	if (_array)
	{
		free(_array);
		_array = nullptr;
		_capacity = 0;
		_size = 0;
	}
}

// 普通类,类名和类型是一样
// 类模板,类名和类型不一样
// 类名:Stack
// 类型:Stack<T>

int main()
{
	Stack<int> s1;    // int
	Stack<double> s2; // double
	Stack<char> s3;   // char
	
	return 0;
}

3、类模板实例化

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


家人们不要忘记点赞收藏+关注哦!!!

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

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

相关文章

Java应用程序性能调优的秘诀:掌握JVM自带的命令行工具

Java 自带了多个 JVM 调优工具&#xff0c;以下是其中一些常用的工具&#xff1a; 1&#xff09;jps&#xff08;JVM Process Status Tool&#xff09;&#xff1a; 用于显示当前系统中所有正在运行的 Java 进程的 PID 和相关信息。 2&#xff09;jstat&#xff08;JVM Stati…

常用的表格检测识别方法-表格区域检测方法(上)

常用的表格检测识别方法 表格检测识别一般分为三个子任务&#xff1a;表格区域检测、表格结构识别和表格内容识别。本章将围绕这三个表格识别子任务&#xff0c;从传统方法、深度学习方法等方面&#xff0c;综述该领域国内国外的发展历史和最新进展&#xff0c;并提供几个先进…

ERP、SCM与CRM系统的关系和区别是什么?

在当今数字化时代&#xff0c;企业管理系统扮演着至关重要的角色&#xff0c;而ERP、SCM和CRM系统是其中三个核心组成部分。 虽然它们都在企业管理中发挥着关键作用&#xff0c;但它们各自的功能和应用领域存在一些区别。 我们先来看看&#xff0c;ERP、SCM与CRM系统分别是啥…

张驰咨询:突破瓶颈降低成本-精益生产咨询的实践策略

在现代企业运营中&#xff0c;提高效率、优化流程是实现成功的关键因素之一。为了帮助企业在这方面取得突破性的进展&#xff0c;精益生产咨询成为了一种备受推崇的方法。本文将介绍精益生产咨询的基本原理、优势以及如何将其应用于企业实践中。 精益生产咨询是一种源于丰田生…

软考- 受限双端队列出队顺序--后面有历年真题

前提&#xff1a;栈和队列 栈&#xff1a; 先进后出 队列&#xff1a;先进先出 对于元素1&#xff0c;2&#xff0c;3&#xff0c;4按照顺序进出栈和队列时&#xff1a; 对于入栈&#xff0c;出栈时&#xff1a; 可以进一个元素&#xff0c;出一个元素&#xff1a; 能得…

基于MATLAB的车牌识别系统+GUI界面的毕业设计(完整源码+课题报告+说明文档+数据)

文章目录 1. 前言2. 实现步骤1&#xff09;颜色信息提取2&#xff09;倾斜校正3&#xff09;字符分割4&#xff09;字体识别5&#xff09;语音播报6&#xff09;存储数据 3. 效果展示4. 总结5. 完整源码下载 1. 前言 近年来,随着交通现代化的发展要求,汽车牌照自动识别技术已经…

网络安全实验——web安全

目录 实验目的 实验原理 实验内容 实验1 1. 地址栏中执行脚本 2. 对DOM技术的利用 实验2 1.jump1 2.jump2 3.get 4.xss 5.注册bss 6.盗取cookie 7.分析cookie 实验3 一.搭建IIS服务器 二.身份验证和权限设置 三.IP地址和域名限制 四.安全通信 五. 单点登录 …

《终身成长》笔记四——如何面对失败

目录 经典摘录 秉性 一个英雄具备的所有特质 ​编辑 什么是成功 什么是失败 掌控成功 领导力与固定型思维模式 成长型思维模式领导者的行为 害羞 经典摘录 秉性 天才们&#xff0c;因为自己拥有的优势而得意忘形&#xff0c;不去学习如何努力奋斗以及如何面对挫折。…

Win10系统开机使用一段时间会变成蓝屏怎么办?

Win10系统开机使用一段时间会变成蓝屏怎么办&#xff1f;最近有用户在使用电脑的时候遇到了一个问题&#xff0c;当自己开机使用了一段时间之后&#xff0c;电脑就会变成蓝屏无法操作&#xff0c;导致自己的使用中断了。如果经常出现这样的问题&#xff0c;那么就需要去进行电脑…

图解LeetCode——141. 环形链表

一、题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&a…

使用jsDelivr和GitHub,上传本地静态资源到免费CDN

目标&#xff1a;将本地图片资源上传到免费CDN&#xff0c;以便随时使用&#xff01;其他静态资源亦可&#xff0c;例如&#xff1a;js、css、pdf、word、excel 等等 ①在github上创建新仓库&#xff1a;resources&#xff0c;用于存放要上传到 CDN 的静态资源&#xff1a; ②上…

成都欢蓬信息:抖音电商去年GMV增速超80%

在今年的抖音电商生态大会上&#xff0c;抖音电商交出了年度“成绩单”。 5月16日&#xff0c;抖音电商总裁魏雯雯披露&#xff0c;近一年抖音电商GMV&#xff08;成交额&#xff09;增幅超80%。其中&#xff0c;商城GMV同比增长277%&#xff0c;电商搜索GMV同比增长159%&#…

NAVICAT 自动备份数据库到本地

1:设置备份文件存储路径地址 右键数据库连接 ——》编辑连接——》高级 2:选择要备份的数据库 点击 备份——》新建备份——》对象选择 ——》保存 输入文件名称 ——》确定 备份 下出现 保存的备份文件 3:设置自动备份 点击 自动运行——》新建批处理作业 点击 新建…

家电回收APP小程序开发 上门回收旧物管理专家

家用电器使我们日常生活中必不可少的用品&#xff0c;随着使用年限的增加&#xff0c;可能会出现老化问题&#xff0c;人们买了新的之后&#xff0c;废旧电器的处理也成为一大难题。笨重不易移动&#xff0c;扔了可惜&#xff0c;放置占地&#xff0c;该怎么办呢&#xff1f;废…

【Linux下】 线程同步 生产者与消费者模型

文章目录 【Linux下】 线程同步 生产者与消费者模型线程同步同步概念与竞态条件条件变量条件变量本质 操作条件变量初始化和销毁条件变量等待唤醒 通过条件变量实现的简单线程同步例子为什么pthread_cond_wait需要互斥锁条件变量使用规范 生产者与消费者模型生活中的生产者与消…

jQuery学习记录--jQuery语法,选择器,事件及hide(),show(), toggle()

jQuery学习记录–jQuery语法&#xff0c;选择器&#xff0c;事件及hide&#xff08;&#xff09;&#xff0c;show()&#xff0c;toggle() jQuery 简介 jQuery 是一个 JavaScript 库。jQuery 极大地简化了 JavaScript 编程。 jQuery 库包含以下功能&#xff1a; HTML 元素选…

AMBER分子动力学模拟之结果分析(构象分析)-- HIV蛋白酶-抑制剂复合物(6)

AMBER分子动力学模拟之结果分析(构象分析)-- HIV蛋白酶-抑制剂复合物(6) RMSD RMSF b-facto计算 RMSD RMSD measures the deviation of a target set of coordinates (i.e. a structure) to a reference set of coordinates, with R M S D 0.0 \mathrm{RMSD}0.0 RMSD0.0 i…

【分享】又找到几个免费使用gpt4的方法!

哈喽&#xff0c;大家好&#xff0c;我是木易巷~ GPT-4是OpenAI推出的最新人工智能语言模型&#xff0c;拥有惊人的1750亿个参数&#xff0c;是目前最大、最强大的语言模型之一&#xff0c;能够根据给定的文本或关键词生成高质量的文本&#xff0c;可以处理多模态数据&#xf…

nodejs进阶(3)—路由处理

1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回。 url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) 接收参数&#xff1a; urlStr url字符串 parseQueryString 为true时将使用查询模…

基于Vue框架的思源新闻发布平台设计与实现(论文+源码)_kaic

摘 要 经过针对全校随机抽取的100名学生进行的研究发现&#xff0c;有约69&#xff05;的学生&#xff0c;并不关心思源新闻&#xff0c;一些学生表示思源每天发生的大小事与他们无关。这项调查突显了需要提供一个能激发学生对思源校园新闻感兴趣的平台。因此本文为思源学院全…