【C++】-6- 模板初阶

news2024/9/20 9:04:33

文章目录

  • 引入——泛型编程
  • 一、函数模板
    • 1.函数模板格式
    • 2.函数模板原理
    • 3.模板的实例化
    • 4.模板参数的匹配原则
  • 二、类模板
    • 0.引入
    • 1.类模板的定义格式
    • 2.类模板的实例化

引入——泛型编程

如果我们需要实现不同数据类型的Swap函数,需要手写很多内容类似的结构。如下。

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;
}

//……

这样既在书写代码的过程中可能出现错误,又不好维护,效率不高。
由此,我们选择将这个任务交给编译器完成。我们给编译器一个“模具”,让编译器根据“摸具”创建出具体的“实例”。

在这里插入图片描述

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

在这里插入图片描述


一、函数模板

(以上面 Swap 函数为例)

template<typename T>
void Swap(T& x, T& y)
{
	T tmp = x;
	x = y;
	y = tmp;
}

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

1.函数模板格式

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

2.函数模板原理

template<class T>
void Swap(T& x, T& y)
{
	T tmp = x;
	x = y;
	y = tmp;
}

int main()
{
	int a = 13, b = 7;
	Swap(a, b);
	cout << "a=" << a << " " << "b=" << b << endl;

	double c = 1.13, d = 1.7;
	Swap(c, d);
	cout << "c=" << c << " " << "d=" << d << endl;

	return 0;
}

在这里插入图片描述

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

3.模板的实例化

  • 隐式:让 编译器 根据实参推演模板参数的实际类型
    在这里插入图片描述

如上,编译器 无法 根据实参推演模板参数的实际类型。
两种解决办法:
①强制类型转化:Add(a, (int)b);
②显式实例化:Add<int>(a, b);

  • 显式 :在函数名后的<>指定模板参数的实际类型
template<class T>
T Add(T x, T y)
{
	return x + y;
}

void Test2()
{
	int a = 13;
	double b = 1.7;
	Add<int>(a, b);
}

4.模板参数的匹配原则

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

    在这里插入图片描述

  2. 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板
    (例如,如上图,对于 int 数据类型,调用 Add 函数时会优先调用 专门处理 int 的 Add 函数

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


二、类模板

0.引入

template<class T>
class Stack
{
private:
	T* _arry;
	int _top;
	int _capacity;
};

int main()
{
	Stack<int> st1;
	Stack<double> st2;

	return 0;
}

在这里插入图片描述

1.类模板的定义格式

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

2.类模板的实例化

// 动态顺序表
// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具
template<class T>
class Vector
{
public:
	Vector(size_t capacity = 10)
		: _pData(new T[capacity])
		, _size(0)
		, _capacity(capacity)
	{}

	// 使用析构函数演示:在类中声明,在类外定义。
	~Vector();

private:
	T* _pData;
	size_t _size;
	size_t _capacity;
};
// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表
template <class T>
Vector<T>::~Vector()
{
	if (_pData)
		delete[] _pData;
	_size = _capacity = 0;
}

int main()
{
	Vector<int> v;
	return 0;
}

在这里插入图片描述

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

注:类模板 声明和定义 分离在 不同的文件(.h)(.cpp)中,会出现链接失败


END

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

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

相关文章

【Gragph Data Mining】VF2算法 — 图同构匹配的算法

VF2算法是一种用于图同构匹配的算法&#xff0c;可以判断两个图是否同构。VF2算法最初由L. P. Cordella等人在1981年提出&#xff0c;后经过多次改进和优化&#xff0c;已成为常用的图同构匹配算法之一。VF2算法的基本思想是通过递归地搜索两个图的节点匹配&#xff0c;从而判断…

总结847

学习目标&#xff1a; 月目标&#xff1a;5月&#xff08;张宇强化前10讲&#xff0c;背诵15篇短文&#xff0c;熟词僻义300词基础词&#xff09; 周目标&#xff1a;张宇强化前3讲并完成相应的习题并记录&#xff0c;英语背3篇文章并回诵 每日必复习&#xff08;5分钟&#…

概率密度函数可视化

概率密度函数可视化 文章目录 概率密度函数可视化[toc]1 一维随机变量情形2 二维随机变量情形 1 一维随机变量情形 以正态概率密度函数为例&#xff0c;其中位置参数为 μ \mu μ&#xff0c;尺度参数为 σ \sigma σ&#xff0c; f ( x ) 1 2 π σ e − ( x − μ ) 2 2 σ…

ChatGPT聊天新玩意:如何让AI成为你的聊天好友?

目录 引言&#xff1a; 案例&#xff1a; 淄博旅游第一版本&#xff1a; 分析&#xff1a; 淄博旅游第二版本&#xff1a; 分析&#xff1a; 总结&#xff1a; 万能公式&#xff1a; 引言&#xff1a; ChatGPT是什么&#xff1f;今天用一句话概括&#xff0c;它就是新…

翻译: 面向开发人员的GPT提示工程 GPT Prompt Engineering for Developers

1. 提示指南Guidelines for Prompting 在本课中&#xff0c;您将练习两个提示原则及其相关策略&#xff0c;以便为大型语言模型编写有效的提示。 In this lesson, you’ll practice two prompting principles and their related tactics in order to write effective prompts …

7搜索管理

7搜索管理 7.1 准备环境 7.1.1 创建映射 创建xc_course索引库。 创建如下映射 post&#xff1a;http://localhost:9200/xc_course/doc/_mapping 参考 “资料”–》搜索测试-初始化数据.txt { "properties": { "description": { "type": &…

C语言操作符详解

该内容全部代码请看&#xff1a;gitee仓库 第一部分&#xff1a; 板书部分&#xff1a; 1、操作符的分类&#xff1a; 注意&#xff1a; 移位操作符和位操作符 单目操作符中有sizeof 逗号表达式 2、算术操作符&#xff1a; 注意&#xff1a; 除法的使用 取模运算 3、移位操…

485接口的温湿度传感器和RJ45接口的温湿度传感器选择分析

工业以太网RJ45接口 网口温湿度传感器和RS485信号输出温湿度传感器的分析对比 主要适用场合&#xff1a;大型厂房、跨区域机房、多机房、机柜、数据机房、服务器机房、大数据中心、户外电站等 主要区别&#xff1a;以太网温湿度传感器输出信号RJ45&#xff0c;RS485温湿度传…

【JAVA面试】缓存穿透、缓存击穿、缓存雪崩

提示&#xff1a;文章先作为初版&#xff0c;等后续时间充足后&#xff0c;补充更深的内容 文章目录 缓存穿透、缓存击穿、缓存雪崩一、区别二、线程安全问题 缓存穿透、缓存击穿、缓存雪崩 一、区别 缓存穿透&#xff08;Cache Penetration&#xff09;&#xff1a; 缓存穿…

展会邀请丨虹科诚邀您5月12日于北京参与制药行业质量控制技术论坛

2023年上半年&#xff0c;虹科圆满举办了成都CPQC与杭州药安大会&#xff0c;在两场顺利进行的展会上&#xff0c;虹科的产品广受青睐&#xff0c;也获得了许多客户的认可与信赖&#xff0c;虹科也将继续以优质的产品和解决方案解决您的问题。 5月12-5月13日&#xff0c;虹科将…

卷积神经网络(CNN):基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。随着小卫星星座的普及&#xff0c;对地观测已具备多次以上的全球覆盖…

arm安装pyrealsense

arm安装pyrealsense – Step 1 – conda install numba pip install opencv-python pip install scipy – Step 2 pyrealsense2 – 参考 https://github.com/35selim/RealSense-Jetson 编译安装pyrealsense2 git clone -b v2.50.0 --depth1 https://github.com/IntelRealSens…

【Java】哈希冲突(哈希碰撞)

文章目录 为什么发生哈希冲突&#xff08;哈希碰撞&#xff09;能否完全避免哈希冲突常用处理哈希冲突的方法1.开放地址法1.1线性探测再散列缺点&#xff1a;二次聚集 1.2二次探测再散列1.3伪随机探测再散列 2.再哈希地址法3.链地址法4.建立公共溢出区 为什么发生哈希冲突&…

2C 兼容和小技巧 合集

这里写自定义目录标题 2C 兼容小技巧 合集修改input date默认框的小图标 2C 兼容小技巧 合集 以前一直是2b端没遇到过啥兼容性 或者 奇奇怪怪改UI的地方&#xff0c;现在换成C端业务&#xff0c;就在这里记录下遇到的奇奇怪怪的需求以及解决办法吧。 这篇文章争取 长久更新&am…

Kali-linux枚举服务

枚举是一类程序&#xff0c;它允许用户从一个网络中收集某一类的所有相关信息。本节将介绍DNS枚举和SNMP枚举技术。DNS枚举可以收集本地所有DNS服务和相关条目。DNS枚举可以帮助用户收集目标组织的关键信息&#xff0c;如用户名、计算机名和IP地址等&#xff0c;为了获取这些信…

Redis持久化:RDB和AOF

Redis持久化&#xff1a;RDB和AOF Redis 数据存储在内存中&#xff0c;如果不想办法将数据保存到硬盘上&#xff0c;一旦Redis重启(退出/故障)&#xff0c;内存的数据将会全部丢失。我们肯定不想 Redis 里的数据由于某些故障全部丢失(导致所有请求都走 MySQL)&#xff0c;即便发…

软考A计划-重点考点-专题九(数据结构知识)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

解决报错‘cross-env‘ is not recognized as an internal...

目录 一、问题 1.1 问题描述 二、解决 2.1 解决 2.2 其它启动报错问题 一、问题 1.1 问题描述 今天在安装Ant Design Pro的后&#xff0c;执行 yarn start 时意外报错 cross-env is not recognized as an internal or external comman 报错后自然项目也就无法启动&…

组合数学第一讲

加法原则 432 9 879 96 乘法原则 3 * 2 6 800 2^55^2 因子可写成2^x5^y&#xff0c;其中x 0,1,2,3,4,5 y 0,1,2 6*3 18 4 3 * 2 10 数学归纳法 关键&#xff1a;假设n是正确的&#xff0c;证明n1也是正确的 Horse paradox&#xff08;马悖论&#xff09; 用PMI证…

如何提取文件名称到excel

如何提取文件名称到excel&#xff1f;在市场中很多小伙伴&#xff08;例如公司行政和文员&#xff09;就会碰到这个问题&#xff0c;将一些文件的名全部提取出来然后保存到excel表格中。当你在工作中如果遇到这个问题时&#xff0c;你却还在使用最传统的方法一个一个复制粘贴进…