【C++】C++的模板初识

news2024/9/24 10:23:38

目录

思维导图大纲:

1. 什么是模板? 

2. 模板的分类 

区别:函数模版和模版函数 / 类模版和模版类 

2.1 函数模板 

2.1.1 用法 

 2.1.2 原理

2.1.3 函数模板的实例化 

2.1.4 模板参数的匹配原则 

2.2 类模板 

 2.2.1 用法

 2.2.2 原理

2.2.3 声明和定义分离 

2.2.4 类模板的实例化 


思维导图大纲:

1. 什么是模板? 

模板是泛型编程的一种体现,同一类代码可以多次使用!简单打个比方说,模板就相当于活字印刷术,有了这项技术我们就可以高效的拓印不同的书籍;模板也是如此:有了模版我们可以减少大量重复的代码编写,例如:我们需要写一个swap函数,需求是要交换int类型和float类型等等,如果按照原本函数重载的写法我们仍然需要写多个swap函数,有了模版我们就可以根据不同情况生成不同的swap 

2. 模板的分类 

区别:函数模版和模版函数 / 类模版和模版类 

函数模版是一个模版是一种工具,模版函数是通过模版实例化生成的一个具体的函数对象。同理类模版和模版类也是如此 

2.1 函数模板 

2.1.1 用法 

// 函数模版
template<class T>
void Swap(T& data1, T& data2)
{
	T tmp = data1;
	data1 = data2;
	data2 = tmp;
}
  • template关键字
  • <>内部是类型,关键字可以使用class/typename
  • 返回值类型 函数名(参数列表){} 

 2.1.2 原理

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

2.1.3 函数模板的实例化 

函数模板的实例化分为:

  • 隐式实例化:编译器自己去推导类型
  • 显示实例化:我们明确类型 
// 函数模版
template<class T>
void Swap(T& data1, T& data2)
{
	T tmp = data1;
	data1 = data2;
	data2 = tmp;
}

void Text01()
{
	// 函数模版的实例化
	int a = 1, b = 2;
	double c = 1.1, d = 2.2;
	// 1. 显示实例化
	Swap<int>(a, b);
	Swap<double> (c, d);
	cout << a << " " << b << endl;
	cout << c << " " << d << endl;
	// 2. 隐式实例化
	Swap(a, b);
	Swap(c, d);
	cout << a << " " << b << endl;
	cout << c << " " << d << endl;
}

2.1.4 模板参数的匹配原则 

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

2.2 类模板 

 2.2.1 用法

// 类模版
template<class T>
class Stack
{
public:
	void push(const T& data)
	{
		_v.push_back(data);
	}
private:
	vector<T> _v;
};
  • template关键字
  • <>内部是类型,关键字可以使用class/typename

 2.2.2 原理

类模板的生成原理和函数模板差不多,但是是属于按需生成(实例化),类模板中的函数也属于函数模板 

2.2.3 声明和定义分离 

在不同文件中:

类模板的声明和定义不要分离到俩个文件去,会产生连接错误,造成该原因是按需实例化,C++模板的实例化是在编译时进行的,这意味着编译器在编译过程中需要看到模板的完整定义,以便为特定的类型生成实例化代码。如果模板的声明和定义被分开放置在两个文件中,编译器在编译使用模板的源文件时,可能无法找到模板的完整定义,从而导致编译失败或链接错误。 

同一个文件中:

需要声明函数的来源使用域访问符::,然后是模板参数

2.2.4 类模板的实例化 

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

// Stack是类名,Stack<int>才是类型
Stack<int> st1; // int
Stack<double> st2; // double

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

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

相关文章

Linux--gdb的常用命令

目录 前言 一、gdb是什么&#xff1f; 二、常用命令 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 对于程序有两个版本&#xff0c;一个是debug版和release版&#xff0c;要想进行调试必须使用debug版本&#xff0c;再Linux上进行调试就要用到调试器…

660高数刷题

1 周期函数的周期等于上下限的差值则值相等 2 3 4 5 6 泰勒公式要展开到多少阶

快速幂算法【算法 08】

快速幂算法详解 在计算机编程中&#xff0c;快速幂算法是一种高效计算大整数幂次的算法。相较于直接的暴力计算&#xff0c;快速幂能够在对数级别的时间复杂度下完成运算&#xff0c;因此它在许多算法和问题中&#xff08;如数论、组合数学、密码学等&#xff09;都有广泛的应用…

web常见漏洞之——SSRF

ssrf 概述工具环境实验一 概述 SSRF(Server-Side Request Forgery)叫做服务器请求伪造&#xff0c;因为服务器提供了从其他服务器应用获取数据的功能且没有对目标地址进行过滤和限制导致黑客可以对服务器请求的地址进行伪造。 ssrf漏洞的主要用处就是对服务器进行资源扫描&am…

YOLOv9改进策略【损失函数篇】| Slide Loss,解决简单样本和困难样本之间的不平衡问题

一、本文介绍 本文记录的是改进YOLOv9的损失函数&#xff0c;将其替换成Slide Loss&#xff0c;并详细说明了优化原因&#xff0c;注意事项等。Slide Loss函数可以有效地解决样本不平衡问题&#xff0c;为困难样本赋予更高的权重&#xff0c;使模型在训练过程中更加关注困难样…

【回溯Ⅱ】组合问题

用回溯&#xff08;递归&#xff09;解决组合问题 第一类组合问题77.组合216.组合问题Ⅲ 第二类组合问题39. 组合总和递归法一&#xff1a;组合位置填空递归法二&#xff1a;遍历数组 40. 组合总和 II递归法一&#xff1a;组合位置填空递归法二&#xff1a;遍历数组❌ 常规思路…

SpringBoot集成kafka-监听器手动确认接收消息(主要为了保证业务完成后再确认接收)

SpringBoot集成kafka-监听器手动确认接收消息 1、说明2、示例2.1、application.yml2.2、消费者2.3、生产者2.4、测试类2.5、测试 1、说明 kafak中默认情况下是自动确认消息接收的&#xff0c;也就是说先启动消费者监听程序&#xff0c;再启动生产者发送消息&#xff0c;此时消…

【动态规划】第 N 个泰波那契数

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 题目讲解算法原理代码实现 题目 题目如下&#xff1a; 讲解算法原理 我们先说一下动态规划题目的整体做题思路&#xff1a; 第一步&#xff1a; 状态表示 什么是状态表示? 做动态规划类题目一般…

跟李沐学AI:样式迁移

样式迁移需要两张输入图像&#xff1a;一张是内容图像&#xff0c;另一张是样式图像。 我们将使用神经网络修改内容图像&#xff0c;使其在样式上接近样式图像&#xff0c;得到合成图片。类似手机相册中的滤镜效果。 奠基性工作&#xff1a;基于CNN的样式迁移 任务&#xff1…

vue3+vite+axios+mock从接口获取模拟数据实战

文章目录 一、安装相关组件二、在vite.config.js中配置vite-plugin-mock插件三、实现mock服务四、调用api接口请求mock数据方法一、直接使用axios 请求mock 数据方法二、对axios进行封装统一请求mock数据 五、实际运行效果 在用Vue.js开发前端应用时通常要与后端服务进行交互&a…

WPF 选择对应控件技巧

当界面控件过多&#xff0c;选择对应的控件是比较困难的。

白酒与青年文化:潮流与传统的碰撞

在时代的洪流中&#xff0c;青年文化如同一股涌动的潮流&#xff0c;不断冲击着传统的边界。而白酒&#xff0c;作为中国传统文化的瑰宝&#xff0c;也在这一潮流中找到了新的表达方式。今天&#xff0c;我们就来探讨一下白酒与青年文化之间的碰撞与整合&#xff0c;以及豪迈白…

项目问题 | vscode连接远程Linux服务器报错: “> Host key verification failed. > 过程试图写入的管道不存在”

远程连接服务器时报错&#xff1a; Please contact your system administrator. Add correct host key in C:\Users\LiHon/.ssh/known_hosts to get rid of this message. Offending ECDSA key in C:\Users\LiHon/.ssh/known_hosts:9 Host key for 124.71.71.215 has changed a…

七种有效将msvcp140.dll丢失的解决方法,快速修复msvcp140.dll错误

在使用Windows操作系统的计算机上安装或运行软件时&#xff0c;用户可能遭遇“msvcp140.dll丢失”这一常见错误。这个问题通常发生在尝试启动某些程序时&#xff0c;系统会弹出一个警告窗口&#xff0c;提示“无法继续执行代码&#xff0c;因为系统未找到msvcp140.dll”。这样的…

【学习笔记】AD实现原理图的元器件自动标号

【学习笔记】AD24实现原理图的元器件自动标号 在原理图绘制过程中&#xff0c;载入的元器件封装并不会默认标号&#xff0c;而是“&#xff1f;”的形式显示&#xff0c;为避免手动标号所带来的大量繁琐工作&#xff0c;自动标号会是一个很好的选择。 在 Altium Designer&…

【网络】传输层协议——TCP协议(初阶)

目录 1.TCP协议 1.1.什么是TCP协议 1.2.为什么TCP叫传输控制协议 1.2.TCP是面向字节流的 2.TCP协议段格式 2.1.流量控制——窗口大小&#xff08;16位&#xff09; 2.2.确认应答机制 2.2.1.什么是确认应答机制 5.2.2.推导确认应答机制 5.3.2.确认号和序列号 2.3.六位…

日志审计-graylog ssh登录超过6次告警

Apt 设备通过UDP收集日志&#xff0c;在gray创建接收端口192.168.0.187:1514 1、ssh登录失败次数大于5次 ssh日志级别默认为INFO级别&#xff0c;通过系统rsyslog模块处理&#xff0c;日志默认存储在/var/log/auth.log。 将日志转发到graylog vim /etc/rsyslog.conf 文件末…

四、前后端分离通用权限系统(4)

&#x1f33b;&#x1f33b; 目录 一、前端开发和前端开发工具1.1、前端开发介绍1.2、下载和安装 VS Code1.2.1、下载地址1.2.2、插件安装1.2.3、创建项目1.2.4、保存工作区1.2.5、新建文件夹和网页1.2.6、预览网页1.2.7、设置字体大小 二、Node.js2.1、Node.js 简介2.1.1、什么…

汇编知识MOV,MRS,MSR,PUSH和POP指令

处理器做得最多的事情就是在处理器内部来回的进行数据传递 1) 将数据从一个寄存器传递到另一个寄存器中 2) 将数据从一个寄存器传递到特殊寄存器&#xff0c;例如CPSR,SPSR寄存器 3) 将立即数传递到寄存器。 数据传输常用的三个指令&#xff1a;MOV,MRS,MSR指令 常用的…

微信小程序模板与配置(三)app.json对小程序进行全局性配置

全局配置文件及常用的配置项 小程序根目录下的app.json文件是小程序的全局配置文件。常用的配置项如下&#xff1a; pages 记录当前小程序所有页面的存放路径window 全局设置小程序窗口的外观tabBar 设置小程序底部的tabBar效果style 是否启用新版的组件样式 一、全局配置-w…