模版初阶【C++】

news2024/11/25 3:28:11

请添加图片描述

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌟🌟 追风赶月莫停留 🌟🌟
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
🌟🌟 平芜尽处是春山🌟🌟
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅

🍋模版初阶

  • 🍑泛型编程
    • 🍍泛型编程的定义
    • 🍍泛型编程的由来
    • 🍍泛型编程的应用
  • 🍑函数模版
    • 🍍函数模版概念
    • 🍍函数模版原理
    • 🍍函数模版应用
    • 🍍模版参数的匹配原则
  • 🍑类模版
    • 🍍类模版的概念
    • 🍍类模版实例化

🍑泛型编程

🍍泛型编程的定义

在C++中,泛型编程是一种编程范式,它允许程序员编写与数据类型无关的代码。这样,你可以写出一段通用的代码,然后应用于多种数据类型,而不需要为每种数据类型都重新编写代码。泛型编程的核心概念是模板。

C++中有两种主要的模版:函数模版和类模版。

🍍泛型编程的由来

泛型编程的概念起源于对算法和数据结构通用性的追求。其最早的实践可以追溯到1970年代的CLU和Ada语言。在这些早期的语言中,程序员开始尝试编写不依赖于特定数据类型的通用算法。

随着时间的推移,泛型编程的概念逐渐发展并得到了更广泛的应用。1980年代,泛型编程开始被正式提出并应用于一些主流的编程语言中,如C++。C++引入了模板(template)机制,允许程序员编写可以处理多种数据类型的通用代码。

在1990年代,随着面向对象编程(OOP)的普及,泛型编程也开始被应用于面向对象的语言中,如Java。Java在J2SE 5.0(JDK 1.5)中引入了泛型技术,使得类和接口可以使用类型参数,进一步提高了代码的灵活性和重用性。

此后,泛型编程逐渐成为了现代编程语言中的一个重要特性,被广泛应用于数据结构、算法、框架等领域。它不仅提高了代码的重用性和灵活性,还增强了类型安全性,有助于减少运行时错误。

🍍泛型编程的应用

平常我们在解决一个算法时,需要构建一个函数来解决此算法,而这个函数我们需要写出通用的一个写法,不然没有什么意义,比如此函数可以解决参数为int型的,但解决不了类型为double型的,这就要你重新写一个函数可以解决类型为double的,这样就会很麻烦,比如:

int Add(int a, int b)
{
	return a+b;
}
float Add(float a, float b)
{
	return a+b;
}
double Add(double a, double b)
{
	return a+b;
}

上面三个加法函数只能解决自己类型的参数问题,算法相同,仅仅只是参数类型不同,这就很麻烦。
这就要提到我们今天的主角——模版,我们能不能通过给系统一个模版,然后编译器根据不同的类型来生成代码呢?
看下面分析,主要从函数模版和类模版介绍。

🍑函数模版

🍍函数模版概念

函数模板是C++泛型编程的一个重要组成部分,它允许程序员定义一种行为,该行为可以作用于多种不同的数据类型,而无需为每种数据类型都重新编写函数。函数模板通过引入类型参数(通常是使用typenameclass关键字声明的),来创建一种可以处理多种数据类型的函数。

函数模板的定义使用template关键字开始,后面紧跟一个尖括号==<>,其中包含了类型参数列表==。类型参数类似于函数参数,但它们是用于指定函数内部使用的数据类型的。

🍍函数模版原理

函数模版的原理是基于数据类型的参数化,关键是将一组算法相同,但所处理数据类型不同的重载函数。
如:
在这里插入图片描述

template<class T>
T Add(T a, T b)
{
	return a+b;
}

该用template修饰的Add()函数,就是一个加法函数的模版。

在编译器实际应用过程中并不是直接调用这个模版,而是间接通过模版构建一个关于此类型的加法函数,也就是上面那三个函数。

🍍函数模版应用

在这里插入图片描述

上图中,我们展示同类型参数传入的模版,如果两个参数是不同类型的该怎么写呢?
不同类型:

int Add(int a, float b)
{
	return a+b;
}

float Add(int a, float b)
{
	return a+b;
}
double (int a, double b)
{
	return a+b;
}

上面代码就是不同类型的参数,但实际返回还是看函数的类型,如第一个加法函数,虽然a是int类型,b是float类型,最后返回的确实int类型,因为此函数是int类型的。
那这个有没有模版呢?答案肯定是有的。

template<class T1, class T2>
T1 Add(T1 a, T2 b)
{
	return a+b;
}

上诉代码就是该类型模版的写法。
在这里插入图片描述
同样的道理,从图中我们可以看出,当需要用到此时函数时,并不是实际去调用这个函数,而是这个编译器可以根据你提供的这个模版,再根据你参数的类型自动生成这个类型的函数。

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

当我们知道这个模版的用法后,其实表面的工作由我们转到了编译器,编译器帮我们做了许多的工作。

🍍模版参数的匹配原则

关于这个模版参数的匹配原则,该程序中有该函数模版,但也有该类型的处理函数,那实际调用过程中,编译器会优先使用那个呢?接下来我直接用程序执行结果来给大家演示:

#include<iostream>
using namespace std;
int Add(int a, int b)
{
	cout << "没有使用类模版函数函数" << endl;
	return a+b;
}

template<class T>
T Add(T a, T b)
{
	cout << "使用了类模版函数" << endl;
	return a+b;
}

int main()
{
	int a = 2;
	int b = 8;
	int ret = Add(a, b);
	cout << ret << endl;
	return 0;
}

在这里插入图片描述
从上图中就可以看到结果了。

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

🍑类模版

🍍类模版的概念

类模板是一个参数化类型,它允许我们创建一个通用的类,其数据成员、成员函数的返回类型和形参类型不是具体指定的,而是用一个虚拟的类型或值来代替。这样,当我们实际使用类模板时,可以根据传入的类型或值参数来生成特定类型的类实例。

类模板的定义通常以关键字template开始,后面跟着模板参数列表,然后是类名。模板参数列表可以包含类型参数和非类型参数。类型参数通常使用typename或class关键字来修饰,表示不确定的类型;非类型参数则是具体的参数,如整数或字符等。

使用类模板有许多优点,包括提高代码的可重用性、效率和可维护性,减少代码冗余,以及提高代码的可读性和性能。通过类模板,我们可以轻松地创建支持各种数据类型的类,而不必为每个数据类型单独编写代码。

🍍类模版实例化

具体格式看下列代码:

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

上诉就是类模版的格式。

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

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

关于类模版后面用起来会非常方便,目前大家可能接触不多,等大家学到后面,就能理解了。

关于本本章知识点如果有不足或者遗漏,欢迎大家指正,谢谢!!!

请添加图片描述
请添加图片描述

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

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

相关文章

嵌入式Python基础1-2

嵌入式Python基础1-2 条件语句 if elif else 随机数random eval while循环 for循环 水仙花数 循环else list 列表常用方法 增删改查 加排序 append remove pop index() 升序sort(&#xff09;降序 sort(reverseTrue) 反转 reverse&#xff08;&#xff09;…

[Collection与数据结构] PriorityQueue与堆

1. 优先级队列 1.1 概念 前面介绍过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该中场景下&#xff0c;使用队列显然…

持续更新。。。

1、JAVA面试指南 https://javaguide.cn/ 简历优化&#xff1a;突出与应聘职位相关的项目经验、技术栈、技能证书和专业成就。确保简历中的技术关键词与JD&#xff08;Job Description&#xff09;相符。 自我评估&#xff1a;对照目标职位要求&#xff0c;梳理自身Java技能树&…

mac安装nvm管理node(手残流,git下载)

1. 准备 首先电脑里得有brew、git、vscode&#xff0c;看这里安装brew、git&#xff0c;看这里安装vscode。 我本人比较low&#xff0c;mac命令也记不熟&#xff0c;本篇就是git下载nvm&#xff0c;vscode看配置&#xff0c;省心不动脑子就可以了。 2. 清理node 如果mac里没…

Xshell正版免费使用(学生党)

话不多说&#xff0c;上链接 https://www.xshell.com/zh/free-for-home-school/

Introducing Meta Llama 3: The most capable openly available LLM to date

要点 今天&#xff0c;我们推出 Meta Llama 3&#xff0c;这是我们最先进的开源大型语言模型的下一代。Llama 3型号将很快在AWS&#xff0c;Databricks&#xff0c;Google Cloud&#xff0c;Hugging Face&#xff0c;Kaggle&#xff0c;IBM WatsonX&#xff0c;Microsoft Azur…

Linux学习:文件描述符fd

目录 1. 引子2. C语言文件接口2.1 文件的打开与关闭的操作2.2 文件写入读取操作2.3 当前路径 3. 文件I/O操作与系统调用3.1 程序默认打开的文件流3.2 操作系统访问文件的系统调用接口3.2.1 文件打开与关闭操作3.2.2 写入与读取操作 4. 什么是文件描述符fd4.1 进程与文件的关系4…

【笔记】Telephony SIM SPN及运营商名称显示数据来源介绍

来源介绍 网络名称显示 来源及优先级&#xff08;高到低&#xff09; SourceCommentEnhanced Operator Name String(Eons) 名称信息存放&#xff1a; EF_PNN(PLMN Network Name, fid: 6FC5) &#xff1a;LAC和EF_PNN中的Record Identifier EF_OPL(Operator PLMN List, fid: 6FC…

RBA认证是什么?RBA认证的流程是怎么样的

RBA认证&#xff0c;即“责任商业联盟”认证&#xff0c;英文全称是Responsible Business Alliance。这是一个为电子行业或以电子为主要组成部分的行业及其供应链制定的社会责任审核标准。该标准旨在确保工作环境的安全、工人受到尊重并富有尊严、商业营运合乎环保性质并遵守道…

【AI】如何让局域网PC能够访问langchain框架的AI服务

【背景】 在单位内部成功运行了langchain服务&#xff0c;但是发现本地可以用默认8000端口访问&#xff0c;但是局域网内其它机器却无法访问服务页面。 【分析】 首先查看项目文件夹中的server.py。由于这个server.py的存在&#xff0c;我一开始以为langchain整套框架的服务…

哪些因素影响了PCB电路板切割精度?

PCB电路板切割是电子制造过程中一个至关重要的环节&#xff0c;其精度对后续工序的质量和效率具有决定性影响。因此&#xff0c;了解影响PCB电路板切割精度的原因&#xff0c;对于提高电子产品的质量和生产效率具有重要意义。 1. PCB分板机稳定性 PCB分板机的性能直接影响到切…

中国AIGC最值得关注企业产品榜单揭晓!首份应用全景图谱发布

组委会 发自 凹非寺 量子位 | 公众号 QbitAI “你好&#xff0c;新应用&#xff01;” 站在大模型落地元年&#xff0c;是时候喊出这句话了。 从软件APP、智能终端乃至具身智能等等&#xff0c;AIGC开始席卷一切。 大模型玩家、互联网巨头、终端厂商、垂直场景玩家纷纷入场…

web测试基础知识

目录 web系统的基础 web概念(worldwideweb) 网络结构 发展 架构 B/S C/S P2P 工作原理 静态页面 动态页面 web客户端技术 浏览器的核心--渲染引擎 web服务器端技术 web服务器 应用服务器 集群环境 数据库 案例-URL 协议类型 主机名 端口 IP地址 分类 …

Ubuntu 安装 Harbor

一、安装 docker 原文参考传送门 1st 卸载系统自带的 docker 应用 for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done 2nd 设置Docker 的apt源 # Add Dockers official GPG key: sudo…

翻译《The Old New Thing》 - Some reasons not to do anything scary in your DllMain

Some reasons not to do anything scary in your DllMain - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20040127-00/?p40873 Raymond Chen 2004年01月27日 简介 这篇文章讨论了为什么不应该在DLL的DllMain函数中执行复杂的操作 正文 众所…

SAP DMS创建文档根目录操作简介

前面我们已经对DMS的后台进行了系统的配置,本文开始我们对DMS的前台操作进行说明 1、CV01N创建文档 注意:EDIPUBLICROOTFOLDER为根目录的凭证号,不允许更改。 输入好后回车。进入下图所示: 点击文档浏览器,进入下一屏如下图: 注意:点击创建新的私人文件夹按创建是创…

使用CSS3 + Vue3 + js-tool-big-box工具,实现炫酷五一倒计时动效

时间过得真是飞速&#xff0c;很快又要到一年一度的五一劳动节啦&#xff0c;今年五天假&#xff0c;做好准备了吗&#xff1f;今天我们用CSS3 Vue3 一个前端工具库 js-tool-big-box来实现一个炫酷的五一倒计时动效吧。 目录 1 先制作一个CSS3样式 2 Vue3功能提前准备 3…

基于DEAP数据集的四种机器学习方法的情绪分类

在机器学习领域&#xff0c;KNN&#xff08;K-Nearest Neighbors&#xff09;、SVM&#xff08;Support Vector Machine&#xff09;、决策树&#xff08;Decision Tree&#xff09;和随机森林&#xff08;Random Forest&#xff09;是常见且广泛应用的算法。 介绍 1. KNN&am…

windows本地提权--令牌窃取烂土豆UAC

免责声明:本文仅做技术交流与学习,请知法守法,不要乱搞破坏等等... 目录 一.令牌窃取 操作: 1-生成-->上传后门后,让msf上线 2-执行命令 二.烂土豆(MS16-075) 操作: 1-先让MSF上线 2-上传烂土豆 3-执行命令 三.UAC(用户账户控制) 1-MSF模块提权 2-UACME 项目(yy…

Kafak详解(1)

简介 消息队列 为什么要有消息队列 图-1 消息队列的使用 消息队列 1)消息Message&#xff1a;网络中的两台计算机或者两个通讯设备之间传递的数据。例如说&#xff1a;文本、音乐、视频等内容。 2)队列Queue&#xff1a;一种特殊的线性表(数据元素首尾相接)&#xff0c;特…