【C++】模板初级

【C++】模板初级

  • 泛型编程
  • 函数模板
    • 函数模板的概念
    • 函数模板格式
    • 函数模板的原理
    • 函数模板的实例化
    • 模板参数的匹配原则
  • 类模板
    • 类模板格式
    • 类模板的实例化

泛型编程

当我们之前了解过函数重载后可以知道,一个程序可以出现同名函数,但参数类型不同。

//整型
void Swap(int& x, int& y)
{
	int tmp = x;
	x = y;
	y = tmp;
}

//浮点型
void Swap(double& x, double& y)
{
	double tmp = x;
	x = y;
	y = tmp;
}

//字符型
void Swap(char& x, char& y)
{
	char tmp = x;
	x = y;
	y = tmp;
}

int main()
{
	int a = 1, b = 2;
	Swap(a, b);

	double c = 3, d = 4;
	Swap(c, d);

	char e = 'a', f = 'b';
	Swap(e, f);
	return 0;
}

大家可以发现,使用函数重载虽然可以实现,但不足之处也很明显:
1.重载的函数仅仅时类型不同,代码的复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数
2.代码的可维护性比较低,一个出错可能所有的重载都出错。

那么在C++中就存在这样一种方式,类似于存在一种模具,通过给这个模具填充不同的材料(类型),来获得不同材料的铸件(即生成具体类型的代码)。

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

模板
函数模板
类模板

函数模板

函数模板的概念

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

函数模板格式

template<typename T>
void Swap(T& x, T& y)
{
	T tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 1, b = 2;
	Swap(a, b);

	double c = 3, d = 4;
	Swap(c, d);

	char e = 'a', f = 'b';
	Swap(e, f);
	return 0;
}

观察上面代码,格式为:
template<<typename T1,typename T2,…,typename Tn>>

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

  • 注意
    1.这俩部分是相对应的,存在一个函数,就需要在函数上面增加一段template的声明
    2.typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

函数模板的原理

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

通过反汇编的方式观察下面这段代码:

在这里插入图片描述
在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。

在这里插入图片描述
例如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型、整型类型也是如此。

函数模板的实例化

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

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

在这里插入图片描述

当函数传参时,存在不同的俩个类型时,可以使用隐式实例化。

template<typename T>
T Add(const T& x, const T& y)
{
	return x + y;
}

int main(void)
{
	int a = 1;
	double b = 1.2;
	Add(a, (int)b);
	Add((double)a, b);
	return 0;
}
  • 显式实例化:在函数名后的<>中指定模板参数的实际类型。
template<typename T>
T Add(const T& x, const T& y)
{
	return x + y;
}

int main(void)
{
	int a = 1;
	double b = 1.2;
	Add<int>(a, b);
	Add<double>(a, b);
	return 0;
}

程序运行时如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。

模板参数的匹配原则

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

类模板

类模板格式

tmplate<class T1, class T2, ... ,class Tn>
class name
{
//类内成员定义
};

以数据结构中的栈为例:

template<class T>
class Stack
{
	//...
private:
	T& _arr;
	int _size;
	int _capacity;
};

当我们需要在顺序表中创建不同的类型时,可以使用类模板。

类模板的实例化

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

template<class T>
class Stack
{
	//声明
	Stack(int capacity = 4);
private:
	T& _arr;
	size_t _size;
	size_t _capacity;
};
//定义
template<class T>
Stack<T>::Stack(int capacity)
	:_capacity(capacity)
	,_size(0)
{
	_arr = new T[capacity];
}

【注意】对于普通类而言,类名和类是一样的;而对于类模板而言,类名与类型不同。以stack为例子:stack< t >是类型,stack是类名。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络安全等级保护制度详解,一文掌握核心要点!

一、等级保护制度发展情况 等级保护制度的法律依据 《计算机信息系统安全保护条例》&#xff08;1994年General Office of the State Council第147号令&#xff09; 公安部主管全国计算机信息系统安全保护工作。 计算机信息系统实行安全等级保护&#xff0c;安全等级的划分…

Python+Selenium自动化测试环境搭建步骤(selenium环境搭建)

一、自动化简介 1.自动化测试概念&#xff1a; 是把以人为驱动的测试转化为机器执行的一种过程&#xff0c;它是一种以程序测试程序的过程 2.自动化测试分类&#xff1a; 一般IT上所说的自动化测试是指功能自动化测试&#xff0c;通过编码的方式用一段程序来测试一个软件的功…

数据预处理之基于统计的(3σ,Z分数,Boxplot箱线图)异常值检测#matlab

基于统计的异常值检测 1.异常值的含义 异常值是指在数据集中偏离大部分数据的数据&#xff0c;使人怀疑这些数据的偏离并非由随机因素产生&#xff0c;而是产生于完全不同的机制。 异常挖掘(outlier mining)问题由两个子问题构成&#xff1a;(1)如何度量异常。(2)如何有效发…

我一直看不明白:“C++会被java/python等这些语言替代”

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 有些程序&#xff0c;是既可以…

【QT5】<重点> IMX6ULL开发板运行QT

目录 1. 安装交叉编译器 2. 命令行交叉编译QT项目 3. 运行该可执行程序 4. 开发板上运行UDP程序与Ubuntu通信 1. 安装交叉编译器 第一步&#xff1a;进入正点原子论坛找到IMX6ULL开发板的资料&#xff0c;下载“开发工具”&#xff0c;将“交叉编译工具”中的fsl-imx-x11-…

Spring中的IOC

IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;是Spring框架核心概念之一。它是一种设计原则&#xff0c;用来实现对象的松耦合和依赖管理。在传统的编程中&#xff0c;对象负责创建或查找其依赖对象&#xff0c;而在IOC模式下&#xff0c;这些职责被移…

el-date-picker 有效时间精确到时分秒 且给有效时间添加标记

el-date-picker实现有效日期做标记且时分秒限制选择范围 代码如下&#xff1a; // html部分 <el-date-pickerv-model"dateTime"type"datetime":picker-options"pickerOptions" > </el-date-picker>// js部分 /*** 回放有效日期开始时…

WPF/C#:如何将数据分组显示

WPF Samples中的示例 在WPF Samples中有一个关于Grouping的Demo。 该Demo结构如下&#xff1a; MainWindow.xaml如下&#xff1a; <Window x:Class"Grouping.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x&q…

文心一言 VS 讯飞星火 VS chatgpt (283)-- 算法导论21.2 1题

一、使用链表表示和加权合并启发式策略&#xff0c;写出 MAKE-SET、FIND-SET 和 UNION 操作的伪代码。并指定你在集合对象和表对象中所使用的属性。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 在并查集&#xff08;Disjoint Sets&#xff09;或集合合并&…

6.7.29 基于卷积神经网络的乳腺良恶性图像分类

计算机化乳腺癌诊断系统在早期癌症诊断中发挥着重要作用。为此&#xff0c;应用深度学习&#xff0c;利用卷积神经网络 (CNN) 对基于小型乳房 X 线图像分析协会 (mini-MIAS) 数据库的乳房 X 线图像中的异常&#xff08;良性或恶性&#xff09;进行分类。观察准确度、灵敏度和特…

天锐绿盾数据防泄密软件有哪些功能

天锐绿盾数据防泄密软件的功能丰富而全面&#xff0c;旨在从源头上保障企业数据的安全。以下是对其主要功能的归纳和介绍&#xff1a; www.drhchina.com 一、文件加密模块 透明加密&#xff1a;在不影响用户工作流程的前提下&#xff0c;对需要保护的文件进行自动加密处理。文…

unity 打包PC安装包中常见文件的功能

目录 前言 一、打包好的文件 二、常用文件 1.文件夹XXX_Data 2.文件夹MonoBleedingEdge 3.文件夹XXX_Data内部 三、文件的应用 1.如果你替换了一个图片 2.如果你新增了或减少了图片和资源 3.场景中有变动 4.resources代码加载的资源改了 5.如果你代码替换了 四、作…

大模型时代:消失的飞轮

在移动互联网时代&#xff0c;“数据飞轮”效应深入人心&#xff1a;场景催生应用&#xff0c;应用生成数据&#xff0c;继而这些数据反馈优化算法&#xff0c;再反哺应用本身&#xff0c;进入迭代优化的良性循环。 随着生成式人工智能的兴起&#xff0c;许多人认为这一飞轮效…

springboot原理篇-bean管理

springboot原理篇-bean管理&#xff08;二&#xff09; 我们今天主要学习IOC容器中Bean的其他使用细节&#xff0c;主要学习以下三方面&#xff1a; 如何从IOC容器中手动的获取到bean对象bean的作用域配置管理第三方的bean对象 一、获取Bean 了解即可&#xff0c;默认情况下…

基于Python的花卉识别分类系统【W9】

简介&#xff1a; 基于Python的花卉识别分类系统利用深度学习和计算机视觉技术&#xff0c;能够准确识别和分类各种花卉&#xff0c;如玫瑰、郁金香和向日葵等。这种系统不仅有助于植物学研究和园艺管理&#xff0c;还在生态保护、智能农业和市场销售等领域展现广泛应用前景。随…

可视化大屏搞这样,是对前端开发尊严的巨大挑战。

现在可视化大屏不搞点炫酷的效果和3D交互&#xff0c;出门都不好意思给别人打招呼&#xff0c;作为前端领域的老司机&#xff0c;我感觉尊严受到了巨大挑战&#xff0c;必须迎难而上&#xff0c;hold住他们&#xff0c;老铁们你们觉得呢&#xff1f;

构建高效API接口:五个关键技术要点解析

构建高效API接口是现代软件开发中至关重要的一环。以下是五个关键技术要点&#xff0c;它们可以帮助开发者设计、实现、和维护高性能的API接口&#xff1a; 1. RESTful设计原则和HTTP协议最佳实践 资源定位与可寻址性&#xff1a;为每个资源定义清晰的URL&#xff0c;使用HTT…

买灯必看!护眼台灯是智商税吗?护眼台灯真的有用吗?

随着人们健康意识的日益增强、儿童近视率的大幅度增加&#xff0c;眼睛健康逐渐成为人们关注的焦点。为了减轻长时间用眼带来的疲劳&#xff0c;许多人开始寻求高品质的照明设备来呵护双眼。照明技术的飞速发展&#xff0c;使得现代照明产品能够精准地调整光线亮度、色温和闪烁…

RTSP/Onvif安防监控平台EasyNVR抓包命令tcpdump使用不了,该如何解决?

安防视频监控汇聚EasyNVR智能安防视频监控平台&#xff0c;是基于RTSP/Onvif协议的安防视频平台&#xff0c;可支持将接入的视频流进行全平台、全终端分发&#xff0c;分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。平台可提供的视频能力包括&#xff1a;…

区间DP——AcWing 282. 石子合并

区间DP 定义 区间 DP 是动态规划的一种特殊形式&#xff0c;主要是在一段区间上进行动态规划计算。 运用情况 通常用于解决涉及在一段区间内进行操作、计算最优值等问题。比如计算一个区间内的最大子段和、最小分割代价等。一些常见的场景包括合并操作、划分操作等在区间上…