C++之模板

目录

泛型编程

模板

函数模板

函数模板的实例化

隐式实例化 

显示实例化

类模板


我们知道STL(标准模板库)是C++学习的精华所在,在学习STL之前我们得先学习一个新的知识点-------模板。那么模板究竟是什么呢?围绕着这个问题,进入我们本期的内容。

泛型编程

在学习模板之前我们得先了解什么是泛型编程?

大家可以先想想生活中的一个场景,比如说临近过年了,我们一般在大年夜要吃饺子,要吃饺子,饺子皮必然是必不可少的,比如要包100个饺子,一般情况下我们就得擀上100个饺子皮,但是这样是很费时间的,有没有什么好得方法呢?有人就想到了用一个圆形的模具,使用了圆形的模具之后,生成饺子皮的效率就高了很多了。

当然,上面的场景只是生活中的场景,我们来看看C++中的场景,比如说现在我们要进行两个数的交换,我们一般会写一个交换函数。假设这两个数的类型为int,char,double。相关的代码如下:

void Swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}
void Swap(char& a, char& b)
{char tmp = a;a = b;b = tmp;
}
void Swap(double& a, double& b)
{double tmp = a;a = b;b = tmp;
}

我们发现上述三个交换函数就只有类型不同,其它的都是相同的,如果要交换的变量的类型很多时,难道我们也要写这么多的函数吗?有没有一种方法可以改变解决这种情景呢?在C语言中这种情景确实没有很好的解决办法,因为C语言是不支持泛型编程的,但是C++是支持泛型编程的,我们提出了模板这一概念,可以很好的解决这一情景带来的问题。

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。  

模板

模板分为函数模板和类模板。

注意:在函数中我们将函数括号中的参数称作形参,在函数模板这里我们将尖括号中的称作模板参数。

函数模板

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

注意:在函数中我们将函数括号中的参数称作形参,在函数模板这里我们将尖括号中的称作模板参数。 

 所以对于上面交换三种类型变量的函数我们可以用函数模板实现,代码如下:

template<class T>  
void Swap(T& a, T& b)
{T tmp = a;a = b;b = tmp;
}
int main()
{int a = 10, b = 20;double c = 10.1, d = 9.3;char ch1 = 'a', ch2 = 'b';Swap(a, b);Swap(c, d);Swap(ch1, ch2);return 0;
}

 运行截图:

通过函数模板,不难发现,不同类型的变量确实发生了交换。

但是大家思考一个问题。这三次交换,调用的是同一个函数吗?我们通过底层代码为大家展现:

 很明显,这三次调用不是同一函数,因为函数参数列表的参数类型不同,函数的地址也是不同的。这其中到底发生了什么?

其实,这里发生了函数模板的实例化。我们将实参传给形参之后,编译器会根据我们实参的类型生成对应的函数模板,这相比之前我们手动实现函数,提高了效率。

函数模板的实例化

所谓函数模板的实例化,就是再调用函数模板时,编译器通过传递的实参的类型推导对应类型的函数,然后将实参传递给所推导的函数的形参。这就是函数模板的实例化。

隐式实例化 

隐式实例化:就是我们在调用函数模板时,编译器会根据我们传递的实参的类型自动推导函数模板中的模板参数类型。

注意:隐式实例化时,我们不能让传递的实参为两种类型,因为函数模板中只有一个模板参数,当模板参数只有一个时,一次函数调用只能实例化一种类型,这是如果传递了两种类型,就会报错。

对于两个数求和的代码: 

template<class T>
T  Add(T a, T b)
{return a + b;
}
int main()
{int a = 10, b = 20;double c = 10.1, d = 9.3;Add(a, d);return 0;
}

错误示例如下:

我们用了int,double两个类型的实参去调用函数模板,这是不行的。

要解决这种错误有两种方法,一种是类型强制类型转换,一种是显示实例化,告诉编译器模板参数类型。

显示实例化

显示实例化:在函数名后的<>中指明模板参数类型。

在进行函数模板的调用时,我们直接告诉编译器模板参数的类型。具体代码如下:

template<class T>
T Add(T a, T b)
{return a + b;
}
int main()
{int a = 10, b = 20;double c = 10.1, d = 9.3;Add(a, d);Add<int>(a, d);  //告诉编译器,模板参数的类型return 0;
}

类模板

我们为什么要引入类模板呢?

在我们学习栈时,我们学习栈一般是数组栈,栈的每个元素是有具体的类型的,但是如果我们想让栈的元素的类型灵活的变化,按照之前C语言的方式实现栈的话,我们可能得实现多个只有元素类型不同的栈(每次都用typedef定义不同的数据结构),会导致代码冗余,当然这只是针对相对空间较小栈,如果我们后期学习了一个相对空间很大的数据结构,如果再次碰到了这种情景,如果还是这样进行实现,就会导致大量资源的浪费,所以针对这种情况,C++的大佬们发明了类模板。我们依然以栈这个数据结构作为讲解,栈的类模板代码如下:

template<class T>
class Stack
{
public:Stack(int capacity=4):_top(0), _capacity(capacity){_a = new T[capacity];}~Stack(){delete[] _a;_a = nullptr;_capacity = _top = 0;}
private:T* _a;int _Top;int _capacity;
};int main()
{Stack<int> st1;Stack<double> st2;Stack<int*> st3;return 0;
}

注意:在之前我们类类型就是类名,但是在有了类模板之后,类类型就不再是类名了,此时也不能进行类模板的隐式实例化,只能进行类模板的显示实例化,所以此时的类类型就是类名<模板参数类型> 。此时我们创建对象不能再次使用类名创建对象,必须使用类名<模板参数类型> 创建对象

以上便是我们本期模板的所有内容,模板是学习STL的基础,小伙伴们一定要掌握模板的相关内容。

本期内容到此结束^_^

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

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

相关文章

绘图示例---QT手动调用绘图事件,按钮控制图片

效果&#xff1a; 点击 “移动” 图片向右移动20&#xff0c;点击 “西理win嘛” 图片每秒向右移动20 QQ录屏20231212164128 下面时代码详解&#xff1a; 注意使用UI和代码实现按钮的不同 UI: ui->pushButton->setGeometry(windowWidth-105, windowHeight-25, 100, 20);…

【思考】只有实对称矩阵才能正交对角化吗?【矩阵的合同】

1&#xff1a;命题改写&#xff08;A可以正交对角化&#xff09; 2&#xff1a;左乘Q右乘Q逆&#xff08;Q转置&#xff09; 3&#xff1a;取转置 4&#xff1a;得证 总结 可以看到&#xff0c;矩阵如果可以正交对角化&#xff0c;那么一定是实对称矩阵。 另外&#xff0c;这…

【期末复习向】长江后浪推前浪之ChatGPT概述

参考文章&#xff1a;GPT系列模型技术路径演进-CSDN博客 这篇文章讲了之前称霸NLP领域的预训练模型bert&#xff0c;它是基于预训练理念&#xff0c;采用完形填空和下一句预测任务2个预训练任务完成特征的提取。当时很多的特定领域的NLP任务&#xff08;如情感分类&#xff0c…

LLM之Agent(六)| 使用AutoGen、LangChian、RAG以及函数调用构建超级对话系统

本文我们将尝试AutoGen集成函数调用功能。函数调用最早出现在Open AI API中&#xff0c;它允许用户调用外部API来增强系统的整体功能和效率。例如&#xff0c;在对话过程中根据需要调用天气API。 函数调用和Agent有各种组合&#xff0c;在这里我们将通过函数调用调用RAG检索增强…

【SpringBoot】配置文件

配置文件官网 1. 配置方式 application.propertiesapplication.yml / application.yaml 2. 自定义配置信息 将实体类中的本应该写死的信息写在属性配置文件中。 可以使用 Value("${键名}") 获取&#xff0c;也可以使用 ConfigurationProperties(prefix"前…

访谈型软文写作方式,媒介盒子告诉你

访谈型软文一般用于维护企业形象&#xff0c;分享品牌故事。但是许多企业在写访谈型软文时经常容易跑偏或者写来写去没有逻辑&#xff0c;今天媒介盒子就来和大家分享访谈型软文的写作方式&#xff0c;看完这四点&#xff0c;小白也能写好访谈型软文&#xff01; 一、 访谈对象…

C++_构造函数与析构函数

目录 1、构造函数的写法 1.2 构造函数优化写法 2、默认构造函数与默认成员函数 2.1 默认成员函数对不同类型的处理 3、对内置类型的补丁 4、析构函数 4.1 析构函数的写法 5、默认析构函数 6、初始化列表 6.1 初始化列表的写法 6.2 初始化列表的作用 6.3 回顾与总结 …

【Proteus仿真】【51单片机】电子门铃设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使共阴数码管&#xff0c;按键、无源蜂鸣器等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管默认显示第一种门铃音调&#xff0c;可通过K1键切…

flutter的SingleChildScrollView控件详解

文章目录 SingleChildScrollView的介绍和使用场景详细介绍 SingleChildScrollView的介绍和使用场景 SingleChildScrollView 是 Flutter 中的一个小部件&#xff0c;用于创建一个可滚动的单个子部件。它通常用于处理内容超出屏幕可见区域的情况&#xff0c;允许用户通过滚动来查…

5.3 Linux DNS 服务

1、概念介绍 DNS&#xff08;Domain Name System&#xff09;域名系统&#xff0c;是互联网的一项核心服务&#xff0c;可以作为域名和IP地址相互映射的一个分布式数据库&#xff0c;提供域名与IP地址的解析服务&#xff0c;能够使人们更加方便的使用域名访问互联网而不是记住…

Vue3-11- 【v-for】循环数组

v-for的基本介绍 v-for 是一个指令&#xff0c; 它是用来在 html 模板中实现循环的。它可以循环 普通的数组、也可以直接循环一个范围值&#xff0c;也可以循环对象的每个属性。v-for 的语法介绍 <div v-for"(item,index) in arrayName" : key"index"…

有哪些好用的运维管理软件?哪个工单管理系统的操作简单一些?

运维管理软件可以帮助企业更有效地管理公司内外的事务&#xff0c;比如现在不少公司就引入了工单管理系统来处理后勤和售后的事务。那么&#xff0c;有哪些好用的运维管理软件&#xff1f;哪个的操作简单一些呢&#xff1f;   随着技术的发展和成熟&#xff0c;现在的工单管理…

vue_域名部署无法访问后端

前言 目前部署的比较另类&#xff0c;因为服务器为windows&#xff0c;目前还不是很会nginx&#xff0c;所以现在就只能在服务器上安装nodejs&#xff0c;然后直接使用npm run dev命令行的方式运行项目 遇到的坑 使用ip访问前端的时候&#xff0c;就可以访问&#xff0c;但是…

压缩照片怎么压缩?半分钟解决!

有时候我们在平台上传照片的时候&#xff0c;会有图片大小限制&#xff0c;想要将照片压缩到限制的大小范围内&#xff0c;可以使用专业的图片压缩软件、图片处理软件或者在线网站压缩&#xff0c;下面给大家分享三个方法&#xff0c;压缩照片的同时还能保持图片清晰度哦&#…

Windows10安装Node.js环境

Windows10安装Node.js环境 文章目录 1.下载安装包2.安装配置2.1安装2.2 配置全局的安装路径和缓存路径2.3配置环境变量2.4配置镜像源2.5包管理工具 3.查看版本4.编译跑项目5.总结 1.下载安装包 官方下载网址如下&#xff1a; https://nodejs.org/enInstaller表示是安装程序&a…

【回眸】Tessy 单元测试软件使用指南(三)怎么打桩和指针测试

目录 前言 Tessy 如何进行打桩操作 普通桩 高级桩 手写桩 Tessy单元测试之指针相关测试注意事项 有类型的指针&#xff08;非函数指针&#xff09;&#xff1a; 有类型的函数指针&#xff1a; void 类型的指针&#xff1a; 结语 前言 进行单元测试之后&#xff0c;但凡…

LED透镜粘接UV胶是一种特殊的UV固化胶

LED透镜粘接UV胶是一种特殊的UV固化胶&#xff0c;用于固定和粘合LED透镜。 它具有以下特点&#xff1a; 1. 高透明度&#xff1a;LED透镜粘接UV胶具有高透明度&#xff0c;可以确保光线的透过性&#xff0c;不影响LED的亮度和效果。 2. 快速固化&#xff1a;经过UV紫外线照射…

HTTP 404错误:页面未找到,如何解决

在互联网上浏览时&#xff0c;偶尔会遇到“HTTP 404错误&#xff1a;页面未找到”的提示。这通常意味着用户尝试访问的网页不存在或无法找到。本文将探讨HTTP 404错误的原因以及如何解决这个问题。 一、HTTP 404错误的原因 HTTP 404错误可能是由多种原因引起的。以下是一些常…

SQL进阶理论篇(五):什么是Hash索引

文章目录 简介MySQL中的Hash索引与B树的区别总结参考文献 简介 hash&#xff0c;即哈希&#xff0c;也被称为是散列函数。 Hash在数据库中的应用&#xff0c;可以帮助我们大幅度提升检索数据的效率。 大名鼎鼎的MD5其实就是Hash函数的一种变体。 Hash算法&#xff0c;是通过…

富文本 unpkg.com地址无法访问可替代方案

一、背景&#xff1a; 项目中使用的 wangEditor富文本&#xff0c;使用的地址为&#xff1a;https://unpkg.com &#xff0c;但无法访问&#xff0c;富文本加载不出来&#xff0c;一直转圈圈 二、解决方案&#xff1a; 2.1、方案一 &#xff1a; 将项目中 https://unpkg.co…