C++学习之模板

2023-05-16

文章目录:

一、模板

二、函数模板

三、类模板

一、模板

模板 -- 也称泛型编程

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。
在这之前我们可以利用C++的函数重载来实现不同的数据类型所调用的函数,但是这样也会带来许多不好的地方:

  1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数。
  2. 代码的可维护性比较低,一个出错可能所有的重载均出错。

所以,C++引入了模板来解决问题。
模板相当于一个模具,就好比不同颜色的橡皮泥,在同一个模具上,都可以很好的用这个模具来得到不同颜色,相同模样的橡皮泥。

二、函数模板

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

2、函数模板格式
模板参数(模板类型) —— 类似函数参数(参数对象)

template<typename T1, typename T2,......,typename Tn>  或
template<class T1,.......>
typename后面类型名字T是随便取,Ty,K,V,一般是大写字母或者单词
首字母大写T 代表是一个模板类型(虚拟类型)
返回值类型 函数名(参数列表){}

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

  1. 隐式实例化:让编译器根据实参推演模板参数的实际类型
template<class T>
T Add(const T& left, const T& right)
{
	return left + right;
}

int main()
{
	int a1 = 10, a2 = 20;
	double d1 = 10.0, d2 = 20.0;
	cout << Add(a1, a2) << endl;
	cout << Add(d1, d2) << endl;
}

在这里插入图片描述

cout << Add(a1, d1) << endl;

在上面的代码中对应的结果如图片所示,但如果加上该语句不能通过编译,因为在编译期间,当编译器看到实例化时,需要推演其实参类型,通过实参a1将T推演为int,通过实参d1将T推演为double类型,但模板参数列表中只有一个T,编译器无法确定此处到底该将T确定为int或者double类型而报错。
注意:在模板中,编译器一般不会进行类型转换操作,因为一旦转化出问题,编译器就要被黑锅。
所以,可以通过:1、用户自己来强制转换 2. 使用显式实例化。

  1. 显式实例化:在函数名后的<>中指定模板参数的实际类型
	int a = 10;
	double b = 20.0;
	// 显式实例化
	Add<int>(a, b);
	return 0;

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

注意:一般的普通函数和模板函数同时存在时,在调用的时候首先去找普通函数符不符合,如果不符合再去实例化

三、类模板

类模板的作用和函数模板是一样的原理。
类模板格式:
template<class T1, class T2, …, class Tn>
class 类模板名
{
// 类内成员定义
};
例如:

template<typename T>
class Stack
{
public:
	Stack(int capacity = 4)
		:_a(nullptr)
		, _capacity(0)
		, top(0)
	{
		if (capacity > 0)
		{
			_a = new T[capacity];
			_capacity = capacity;
			_top = 0;
		}
	}

private:
	T* _a;
	size_t _top;
	size_t _capacity;

};
int main()
{
	// 类模板都是显示实例化
	//虽然他们用了一个类模板,但是不是同一个类型
	Stack<int> st1;
	Stack<char> st2;
}

类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>
中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++学习之模板 的相关文章

  • Git客户端的安装

    1 概述 Git有自带的命名行客户端 xff0c 也有自己的图形化客户端 xff0c 这个就是git exe 此外还有TortoiseGit 在这之上又封装了一层 xff0c 使我们用起来更加的方便 xff0c 这个跟TortoiseSVN
  • Git的使用

    正在学习中 xff0c 搜集了好几个比较好的 暂时记录下 xff0c 后续整理 1 Git使用 官方文档 xff1a https git scm com doc 其中包含了帮助 书籍和视频教程 网上传的比较多的就是廖雪峰的介绍 xff0c
  • 【禅道】如何登陆后直接跳到用户登入界面

    1 问题描述 本人用的开源的禅道xampp xff0c 在windows下部署了服务器 xff0c 部署方法参见我的另一个介绍 xff1a https blog csdn net kevinshift article details 120
  • Windows11右键菜单改回经典模式

    window11的右键菜单设计感觉有点反人类 xff0c 网友也想了破解之道 xff1a 改注册表或者使用网友的小工具 其中小工具这里下载 https www sordum org 14479 windows 11 classic cont
  • [python]启动两个spyder工程

    spyder中一次只能开一个工程 xff0c 为了能够开两个 xff0c 进行同时的编辑和运行 xff0c 则默认是不行的 xff0c 是无法同时打开两个spyder的进程的 方法是启动spyder时加上运行参数 xff1a new ins
  • Git按照目录分权限问题

    1 xff09 Git不能像SVN那样 xff0c 在一个库中 xff0c 按照目录为单位进行权限的设置 也不允许对整个库设置为读权限 xff0c 只对某个目录设置为写权限 哎 xff0c 有些失望 xff01 但人家说这是与Git分布式控
  • python

    问题1 xff1a TypeError module takes at most 2 arguments 3 given https www cnblogs com kevin hou1991 p 14806598 html
  • PID控制

    目录 1 基本情况1 1 位置式PID1 2 增量式PID1 3 PID控制适用系统 2 PID三个量的含义解析2 1 P xff1a 比例2 2 I xff1a 积分2 3 D xff1a 微分2 4 PID xff1a 三者的关系 3
  • VSCode Python运行环境配置

    背景 创建了一个python的虚拟运行环境 xff0c 比如说tensoflow xff0c 想在VS Code下运行调试 步骤 参考说明 xff1a https blog 51cto com u 15127658 2783413 xff0
  • Tomcat中文乱码解决方案【亲测有效】

    场景一 xff1a SpringBoot项目 xff0c 在IDEA中启动 xff0c 访问接口 xff0c 无乱码 场景二 xff1a SpringBoot项目 xff0c 打成war包 xff0c 发到本地tomcat下 xff0c 启
  • 【Python】How to center an image in canvas Python Tkinter

    https www tutorialspoint com how to center an image in canvas python tkinter https www tutorialspoint com how to insert
  • [python]使用pyinstaller打包带界面的Pytorch程序的多个问题

    1 opencv兼容性问题 1 1 现象 打包为一个exe完成后 xff0c 在执行exe时 xff0c 报错 xff1a ImportError ERROR recursion is detected during loading of
  • VS2019下载与安装

    下载 xff0c 这里有一个说明 xff0c 下载说明 不再赘述 补充一下 xff0c 上面的地址中 xff0c 是VS2022的 xff0c 应该放的最新的 老的版本在这里下载 xff1a https visualstudio micro
  • Ubuntu下QtCreator的C++工程调用python

    目录 1 概述1 1 参考1 2 库引用1 3 初始与善后 2 函数调用3 类调用4 参数传递4 1 传递数值类型4 2 传递字符串4 3 传递bool4 4传递图片 5 解析放回的参数5 1 调用方法5 2 数值解析5 3 字符串解析5
  • Ubuntu的QTCreator中c++调用opencv方法

    注意 xff1a 这里用的是opencv 4 0以上版本 如果是4 0下的版本 xff0c 配置不同 xff0c 4 0在这个头文件之类的有变化 QTCreator下创建工程 xff0c 在工程文件 pro中增加配置 xff1a span
  • Ubuntu Qtcreator c++调用python报错

    调用时候 xff0c 报错 xff1a modpython 13107 Gtk ERROR 20 32 18 627 GTK 43 2 x symbols detected Using GTK 43 2 x and GTK 43 3 in
  • [Ubuntu, Ajax Nx]C++调用python报from import错误

    1 现象描述 c 43 43 调用python程序 调用的main函数 xff0c 该main函数中有如下代码 xff1a span class token keyword from span matching span class tok
  • Linux下c++串口编程

    1 NX串口管理 参见https blog csdn net weixin 42447868 article details 109051005 spm 61 1001 2014 3001 5506 2 串口权限管理 2 1 串口权限 xf
  • Jetson Nx 串口接收数据丢失首字节问题

    1 问题描述 I write a uart program using c 43 43 on Jetson Nx Jetpack 4 6 1 Ubuntu version 18 04 LTS to communicate with a PC
  • Linux下的一些基础功能

    1 关于命令行输出到文件 xff1a https www iplayio cn post 6296803 2 kz 64 JetsonNx ls l dev ttyS dev ttyUSB dev ttyTHS dev ttyCUDA ls

随机推荐

  • SpringBoot ☞ logback日志配置【屏蔽第三包中日志输出】

    一 项目配置文件如下 二 场景 项目启动时 xff0c 控制台无缘无故输出很多error级别的日志 xff0c 让人看着很不舒服 xff0c 断点调试 43 跟踪 xff0c 发现原来是第三方jar包里设置了日志输出 xff0c 如下 xf
  • 通过Xshell操作Jetson Nx

    1 Jetson Nx Nx留有Uart2 口 xff0c 便于使用xshell等进行操作 串口有三根线 链接后使用 2 XShell 软件 2 1 XShell软件介绍 XShell 软件是一个Windows上运行的终端模拟器 xff0c
  • Nx C++程序使用spdlog库进行日志存储

    1 spdlog简介 spdlog是一个开源的日志库 xff0c 在github上有 代码见这里 xff0c 文档这里 C 43 43 语言的 xff0c 支持Linux windows等系统 csdn上也有许多介绍 xff0c 这里列举两
  • C++下的Boost库

    1 介绍 xff08 引子网络 xff09 Boost库是为C 43 43 语言标准库提供扩展的一些C 43 43 程序库的总称 xff0c 由Boost社区组织开发 维护 Boost库可以与C 43 43 标准库完美共同工作 xff0c
  • Opencv之边界跟踪

    问题描述 一般是将二值化后的图像进行边界的提取 需要说明的是这个提取不是简单的找到边界 xff0c 而是按照顺序的找出来 即边界上的点是按照邻接关系依次给出 相关算法 xff08 1 xff09 这里解释 xff1a https blog
  • OpenCV之滤波

    图像滤波 xff0c 指在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制 xff0c 是图像预处理中不可缺少的操作 xff0c 其处理效果的好坏将直接影响后续图像处理和分析的准确性 这里有个概述 xff0c 很好的 xff1a Ope
  • C++文件读写

    这个不错 xff1a C 43 43 文件读写详解 xff08 ofstream ifstream fstream xff09 C 43 43 文件读写详解 xff08 ofstream ifstream fstream xff09 c 4
  • python及其工具

    目录 1 conda xff1a 包管理器2 Anoconda xff1a 开源的包 环境管理器3 labelme4 tensorflow5 cuda和cudnn6 使用yml文件创建环境并安装文件6 1 yml文件由来6 2 如何获得ym
  • C++之文件操作移动、复制、重命名

    1 C 43 43 笔记之CopyFile和MoveFile的使用 2 删除和重命名 include lt fstream gt include lt windows h gt 与opencv的命名空间CV有冲突 xff0c 不能在一个文件
  • (转)C#数字转固定长度的字符串

    转 C 数字转固定长度的字符串
  • 进程监视工具

    Process Monitor 搜索能下到 xff0c 记下 xff0c 以后用 Process Monitor分析某个应用行为 Process Monitor 系统进程监视器 介绍教程 Using Process Monitor 帮助文档
  • UML建模工具Enterprise Architect(EA) -- 安装及简单使用

    目录 一 什么是EA xff1f 二 安装EA 三 为什么要学会用EA 四 创建EA工程 五 创建类视图 xff0c 构建类和接口 六 选中模型目录 xff0c 自动检出Java代码 七 构建内部类 八 趁热打铁 xff0c 构建数据表视图
  • SVN目录结构与分支等

    TortoiseSVN打分支 合并分支 切换分支 SVN创建分支 合并分支 切换分支
  • WPF上下标

    这里有个介绍的文章 xff1a 定义显示的上标和下标 里面介绍了三种方法 我之前有的是这个方法 xff1a Typography Variants 61 Superscript xff0c 如下所示 xff1a lt TextBlock g
  • [WPF] HamburgerMenu

    有两个库支持的 xff1a Metro App库中的 VS自己的控件 xff1a https docs microsoft com zh cn windows communitytoolkit archive hamburgermenu
  • 面积误差三种计算表达的比较

    引自 xff1a 面积误差三种计算表达的比较 有三种理论 xff0c 最基本的经典的 xff0c 引用一个吧 xff1a 网上有个题目 xff0c 求桌面面积的测量结果 桌面为矩形 用米尺测量 xff0c 长L为100 0 cm xff0c
  • 【转】WPF:Canvas中元素的定位

    概述 xff1a Canvas中的元素的大小和位置都是相对于Canvas容器的 xff0c 他的左上角为原点 xff0c 长度也是相对于他的 WPF xff1a Canvas中元素的定位 https blog csdn net chz cs
  • 【转】C#中计时

    一般可以用Environment TickCount xff0c 但是25天后会翻转 有很多 xff0c 见下面两个转的 C 中精确计时的一点收获 https www cnblogs com jintianhu archive 2010 0
  • 利用python分析微信聊天记录

    文章目录 前言一 任务分析二 工具三 步骤1 数据获取获取DB计算密码导出数据库 2 数据清洗 xff08 具体方法以后补充 xff09 3 数据分析 前言 昨天跟女朋友讨论谁给对方发的消息比较多 xff0c 两人各执一词 xff0c 事实
  • C++学习之模板

    文章目录 xff1a 一 模板 二 函数模板 三 类模板 一 模板 模板 也称泛型编程 泛型编程 xff1a 编写与类型无关的通用代码 xff0c 是代码复用的一种手段 模板是泛型编程的基础 在这之前我们可以利用C 43 43 的函数重载来