C++模版初阶讲解

news2025/1/17 6:14:58

今日为大家分享C++的模版,这里先把模版的初阶讲解一下,以后再讲解模版进阶!

前言:模版的引入

在我们进行学习的编程中,常常会有许多函数的功能相同,有些不同点可能就是其中的数据类型不同!如果我们统统进行函数重载的话,其实也能解决问题,例如,实现两个数的交换!

void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}


void Swap(double& left, double& right)
{
double temp = left;
left = right;
right = temp;
}


void Swap(char& left, char& right)
{
char temp = left;
left = right;
right = temp;
}

.....

但是函数重载也存在许多问题!

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

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


那么是否有一种更好的方法来解决这种问题呢?答案是肯定的,最好的解决方法就是引用模版!

一、模版的分类!

1.函数模版

1.定义

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


2.函数模版格式

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

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

 例如实现一个交换两个数的模版!


3.函数模版的原理

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

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

4.函数模版的实例化

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

隐式实例化:

根据我们传入的形参的类型,编译器自动推演出并生成对应类型的函数!

显式实例化:

我们在调用模版时,直接对模版的类型进行显式调用!

例如在上述函数模版中,我们在swap后面加上“<>”,显式的调用整形的模版! 当我们不加的话,编译器会自动根据形参类型来生成最合适的函数!


5.模版参数的匹配原则

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

其中对于1,编译器会优先调用现有的Add函数,而不是让编译器去实例化一个模版函数!对于2来言,因为没有相对于的函数,只能使用模版来实例化一个更匹配的函数!所以其会调用模版来实例化一个Add(double,double)类型的函数!其中调用那个函数,可以通过打断点调试来观察!

通过上面例子可以看出,当存在匹配的函数后,编译器便不会再进行模版的实例化,只有当没有对于的函数存在时,编译器才会进行模版的实例化,生成一个更合适的函数!

其实也可以这样理解:编译器也会偷懒,只要有合适的函数,他便不自己生成,而使用存在的,只有当没有合适的函数时,他才会进行生成!


2.类模版

1.类模版的定义格式

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

假设定义一个vector类模版!

与函数模版类似,只不过下面变成了class+类名而已!其实都大差不差!

在这里需要注意:1.Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具。
 2.当在类外进行定义函数时,需要加上模版参数列表!


2.模版的实例化

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

// Vector类名,Vector<int>才是类型

Vectorv<double>v1;

Vector<int >v2;

总结:

函数模版可以大大减少我们的工作量,让我们增加更多的时间去思考,而不是将大量的时间花费在重复的代码中!


至此,关于模版的初阶讲解以及完毕了,初阶的讲解主要是让大家能简单认识模版的格式以及简单的使用!但是模版的学习并没有结束,以后还会进行模版的进阶进行讲解! 

希望读完本篇文章,可以让读者对模版有一定的认识!如果有收获,希望大家留下免费的小心心哦!

 

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

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

相关文章

Jmeter连接Mysql数据库

一.下载mysql数据驱动 https://dev.mysql.com/downloads/connector/j/ 二、在Jmeter测试计划中添加驱动包 三、jmeter添加配置元件&#xff1a;JDBC Connection Configuration 四、Jmeter发送JDBC请求 五、提取mysql查询结果

工业交换机的应用场景

在选择工业交换机的时候&#xff0c;很多人会疑惑自己的场景是否适用工业交换机&#xff0c;工业交换机广泛应用于以下场景&#xff0c;大家可以参考了解 1. 工业自动化&#xff1a;工业交换机用于连接各种工业设备&#xff0c;如PLC&#xff08;可编程逻辑控制器&#xff09;、…

【探索C++】三大特性以及类和对象(包括类的特殊函数成员)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

遇到的问题总结

1、在实验室服务器里运行新项目的时候遇到 conda activate pytorch3_7(我的环境名字) conda install -c anaconda tensorboard (失败 一直堵在"Solving environment" &#xff09; pip install tensorboard

VS使用Visual Assist添加代码说明信息

写代码时&#xff0c;我们一般需要在代码的最前面添加一些说明信息&#xff0c;作者的联系方式等等。一些高级的 IDE 工具提供修改代码模板的功能&#xff0c;这样就能够在创建新代码时自动加上版权信息。Visual Studio 虽然没有提供这样的操作界面&#xff0c;但是我们可以通过…

Cron表达式每周三周五18点执行

Cron表达式每周三周五18点执行 0 0 18 ? * WED,FRI验证正确性&#xff1a;

C# Winform编程(5)菜单栏和工具栏

菜单和菜单组件 添加菜单编辑菜单菜单栏和工具栏 添加菜单 将MenuStrip控件拖拽到Form窗体顶部添加菜单 编辑菜单 添加菜单项&#xff0c;编辑菜单属性等功能。 右键单击已添加的菜单项可以弹出右键菜单&#xff1a; 可以设置菜单图标&#xff0c;使能菜单&#xff0c;显示…

[Python中常用的回归模型算法大全:从线性回归到XGBoost]

文章目录 概要保序回归&#xff1a;理论与实践多项式回归&#xff1a;探索数据曲线关系多输出回归的示例 概要 在数据科学和机器学习领域&#xff0c;回归分析是一项关键任务&#xff0c;用于预测连续型变量的数值。除了传统的线性回归模型外&#xff0c;Python提供了丰富多样…

每周电子W4——电路与电路模型

文章目录 每周电子W4——电路与电路模型电路电路模型电流和电压的参考方向电流的参考方向电压的参考方向 电功率 每周电子W4——电路与电路模型 电路 实际电路&#xff1a;由电工设备和电气器件按预期目的连接构成的电流的通路。 为完成某种预期的目的而设计、安装、运行的&a…

latex:表格水平宽度调整

解决方案 结果如下&#xff1a; 源代码如下&#xff1a; \documentclass{article} % \usepackage[utf8]{ctex} \usepackage{multirow} \usepackage{graphicx} \usepackage{booktabs} \usepackage{caption}\begin{document}\captionsetup{font{large}}\begin{table}[] \centeri…

数据结构 - 7(Map和Set 15000字详解)

一&#xff1a; 二叉搜索树 1.1 二叉搜索树的概念 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所…

萝卜刀真的太危险了,于是我用Cocos做了一个

点击上方亿元程序员关注和★星标 引言 大家好&#xff0c;我是亿元程序员&#xff0c;一位有着8年游戏行业经验的主程。 昨天&#xff0c;我女儿和我说想买一把萝卜刀&#xff0c;众所周知&#xff0c;萝卜刀在潜意识当中是存在一定的危险的&#xff0c;所以我果断拒绝了&…

Elasticsearch介绍及插件head和kibana下载

目录标题 一、Elasticsearch介绍二、Elasticsearch下载三、Elasticsearch-head四、Elasticsearch-kibana 一、Elasticsearch介绍 Elasticsearch是什么? Elasticsearch 是一个基于Lucene的分布式搜索和分析引擎&#xff0c;ES是elaticsearch简写&#xff0c;Elasticsearch是一…

Lite-UNet: 轻量且高效的细胞定位模型,轻量化的U-Net

论文&#xff1a;Lite-UNet: A Lightweight and Efficent Network for Cell Localization Paper Link&#xff1a;Lite-UNet: A Lightweight and Efficent Network for Cell Localization Code&#xff1a; https://github.com/Boli-trainee/Lite-UNet 核心思想&#xff1a;魔…

OpenHarmony 应用全局的 UI 状态存储:AppStorage

AppStorage 是应用全局的 UI 状态存储&#xff0c;是和应用的进程绑定的&#xff0c;由 UI 框架在应用程序启动时创建&#xff0c;为应用程序 UI 状态属性提供中央存储。 和 AppStorage 不同的是&#xff0c;LocalStorage 是页面级的&#xff0c;通常应用于页面内的数据共享。而…

cs231n

计算机视觉概述 a study of visual data visual data has exploded to a ridiculous degree 手机上两三个摄像头&#xff0c;more camera than people&#xff0c;视觉传感器&#xff0c;摄像头终端&#xff0c;产生很多视觉数据 visual data构成互联网上传输的的大部分数据 8…

【Linux-常用命令-基础命令-删除文件夹以及内容-rm--r-命令-笔记】

【Linux-常用命令-基础命令-删除文件夹以及内容-rm--r-命令-笔记】 1、前言2、操作3、自己的操作 1、前言 最近&#xff0c;在使用Linux的时&#xff0c;使用相关基础命令是&#xff0c;总是容易忘记&#xff0c;上网一搜&#xff0c;大部分都写的比较繁琐&#xff0c;关于删除…

Compose竖向列表LazyColumn

基础列表一 LazyColumn组件中用items加载数据&#xff0c;rememberLazyListState()结合rememberCoroutineScope()实现返回顶部。 /*** 基础列表一*/ Composable fun Items() {Box(modifier Modifier.fillMaxSize()) {val context LocalContext.currentval dataList arrayLi…

锐化多个视频的同时轻松快速批量添加上背景图片的教程

在日常生活中&#xff0c;我们可能经常需要给一些视频添加背景图。但是&#xff0c;这并不是一项简单的任务&#xff0c;需要花费大量的时间和精力。那么&#xff0c;有没有一种简单的方法可以批量添加背景图到视频呢&#xff1f;答案是肯定的。下面&#xff0c;我们就来介绍一…

【word技巧】word页眉,如何禁止他人修改?

我们设置了页眉内容之后&#xff0c;不想其他人修改自己的页眉内容&#xff0c;我们可以设置加密的&#xff0c;设置方法如下&#xff1a; 先将页眉设置好&#xff0c;退出页眉设置之后&#xff0c;我们选择布局功能&#xff0c;点击分隔符 – 连续 设置完之后页面分为上下两节…