C++函数模板,类模板

C++函数模板,类模板

  • 1.函数模板
    • 1.1函数模板的概念
    • 1.2函数模板的格式
    • 1.3函数模板的原理
    • 1.4函数模板的实例化
    • 1.5模板参数的匹配原则
  • 2.类模板
    • 2.1类模板的定义格式
    • 2.2类模板的实例化

1.函数模板

1.1函数模板的概念

  • 在C++中,函数模板是一种通用的函数定义,可以用于处理不同类型的数据。它允许我们编写一个通用的函数,可以在需要时自动根据传递给函数的参数类型生成相应的函数实例。
    函数模板使用关键字template或者class来定义,并在其后面跟一个或多个模板参数。模板参数可以是类型参数、非类型参数或模板参数包。类型参数表示要处理的数据类型,非类型参数表示常量或值,而模板参数包表示一组参数。

比如我们写一个交换函数:

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;
}
  • 对于不同类型的交换,我们都得写一个与之对应类型的交换函数。但是这些函数除了类型不一样之外交换方式都是一摸一样的。
    所以C++中有了泛型编程的概念。
    泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。

1.2函数模板的格式

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

template<typename T>
//也可写成:template<class T>
void Swap( T& left, T& right)
{T temp = left;left = right;right = temp;
}

1.3函数模板的原理

  • 函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模
    板就是将本来应该我们做的重复的事情交给了编译器。
	template <class T>void Swap(T& left, T& right){T tmp = left;left = right;right = tmp;}int main(){int a = 1;int b = 2;double c = 1.1;double d = 2.2;Swap(a, b);Swap(c, d);return 0;}
  • 我们看上述的代码,这两个swap函数是调用的同一个swap函数吗?
    答案是否定的,两个swap函数分别调用的是两个不一样的函数。
    我们可以从汇编角度上找到我们的答案:
    在这里插入图片描述
  • int类型的去调用了int类型的Swap函数,double类型的去调用了double类型的Swap函数。
    也就是说我们可以理解为,函数模板是一个接收类型的中转站,模板接收到了传过来的实参类型之后,编译器会自己对应着生成相应类型的函数进行编译。
    在这里插入图片描述

1.4函数模板的实例化

  • 用不同类型的参数使用函数模板时,称为函数模板的实例化。
    模板参数实例化分为:隐式实例化和显式实例化。
  1. 隐式实例化:让编译器根据实参推演模板参数的实际类型
    上面的Swap(a, b)就是隐式实例化,模板自动推导出a,b的类型为int。
    那么如果是这样的代码呢?
template <class T>
void Swap(T& left, T& right)
{T tmp = left;left = right;right = tmp;
}int main()
{int a = 1;double d = 2.2;Swap(a, d);return 0;
}

此时a的类型是int,d的类型是double,这个时候模板就推到不出来是什么的类型了。
这个时候就要用到显式实例化。

  1. 显式实例化:在函数名后的<>中指定模板参数的实际类型
template < class T>
void Swap(T& left, T& right)
{T tmp = left;left = right;right = tmp;
}int main()
{int a = 1;double d = 2.2;Swap<int>(a, d);//显式实例化return 0;
}

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

有些情况是必须要使用显式实例化的:

template <class T>
T* fun(int n)
{T* ret = new T[n];return ret;
}int main()
{fun<int>(10);//这里必须显式实例化return 0;
}

1.5模板参数的匹配原则

  1. 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数
  2. 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模
    板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板
  3. 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换
void Swap(int& left, int& right)
{int tmp = left;left = right;right = tmp;
}template <class T>
void Swap(T& left, T& right)
{T tmp = left;left = right;right = tmp;
}int main()
{int a = 1;int b = 2;Swap(a, b);//调用非模板Swap<int>(a, b);//调用函数模板return 0;
}

2.类模板

2.1类模板的定义格式

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

2.2类模板的实例化

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

// Vector类名,Vector才是类型
Vector< int> s1;
Vector< double> s2;

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言--求一个十进制整数中1的个数

一.题目描述⭐ 求一个十进制整数中1的个数 比如&#xff1a; 输入:10201 输出&#xff1a;2 &#xff08;这个数字中1的个数是2&#xff09; 二.思路分析⭐ 数字类的问题我们可以用取模&#xff0c;或者取余运算。 首先定义一个计数器&#xff0c;用来统计1的个数。 输入数字…

Python练习题(三)

&#x1f4d1;前言 本文主要是【Python】——Python练习题的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&am…

正则表达式及文本三剑客grep,awk,sed

目录 正则表达式 前瞻 代表字符 表示次数 位置锚定 分组或其他 grep 选项 范例 awk 前瞻 awk常见的内置变量 范例 sed 前瞻 sed格式 范例 搜索替代 格式 范例 分组后项引用 格式 范例 正则表达式 前瞻 通配符&#xff1a;匹配的是文件名 正则表达式&a…

U盘不仅能在电脑上使用,在手机上也可使用,包括安卓和苹果手机,但苹果的较特殊

许多最好的安卓手机都使用USB-C端口在电脑上充电和来回传输文件,但如果你需要给老板发电子邮件的文件放在闪存驱动器或全尺寸SD卡上呢? 幸运的是,使用廉价的适配器电缆,你可以将USB加密狗或读卡器直接连接到手机上。你甚至可以直接使用USB-C闪存驱动器,以实现更轻松的过程…

IDEA如何配置Git 遇到问题的解决

新建项目 点击 会变红 会生成.git隐藏文件 配置远程仓库路径&#xff1a;点击Manage Remotes&#xff1a;将远程仓库的链接放到这里&#xff1a; 得到如下样式&#xff1a; 此时提交到本地仓库 点击add&#xff0c;添加到暂存文件&#xff1a; 此时文件变绿&#xf…

JavaEE 多线程

JavaEE 多线程 文章目录 JavaEE 多线程引子多线程1. 特性2. Thread类2.1 概念2.2 Thread的常见构造方法2.3 Thread的几个常见属性2.4 启动一个线程2.5 中断一个线程2.6 等待一个线程2.7 获取当前线程引用2.8 休眠当前线程 3. 线程状态 引子 当进入多线程这一块内容时&#xff…

ArrayList 与 顺序表 (附洗牌算法)!

曾经我也是一枚学霸&#xff0c;直到有一天想去学渣的世界看看&#xff0c;结果就找不到回去的路了。 目录 1. 线性表 2.顺序表 2.1 接口的实现 3. ArrayList简介 4. ArrayList使用 4.1 ArrayList的构造 4.2 ArrayList常见操作 4.3 ArrayList的遍历 4.4 ArrayList的扩…

掌握视频剪辑技巧:批量置入视频封面,提升视频品质

在当今数字化时代&#xff0c;视频已成为生活的重要组成部分。无论是观看电影、电视剧、综艺节目&#xff0c;还是分享个人生活、工作成果&#xff0c;视频都以其独特的魅力吸引着大众的视线。视频封面是视频内容的缩影&#xff0c;是观众对视频的第一印象。一个好的封面能吸引…

C/C++学生选课/排课系统[2023-12-3]

问题描述&#xff1a;根据我校自动化专业的部分必修及选修课信 息&#xff0c;设计一个学生选课/排课系统。 基本要求&#xff1a; 1、从文件读入课程信息&#xff1b; 2、从键盘输入拟添加的选修课信息&#xff1b; 3、删除已选的选修课(1门或多门) &#xff1b; 4、输出已…

C++ 学习笔记——C++纯虚函数和抽象类

C纯虚函数 什么是纯虚函数 1&#xff0c;纯虚函数只有函数名、参数、返回值类型。 2&#xff0c;纯虚函数的定义是在函数句首使用 virtual 关键字修饰&#xff0c;并且在句末增加 “ 0”。 virtual void funtion() 0;3&#xff0c;纯虚函数只有声明&#xff0c;基类可以存…

Kubernetes(K8s)_15_CNI

Kubernetes&#xff08;K8s&#xff09;_15_CNI CNI网络模型UnderlayMAC VLANIP VLANDirect Route OverlayVXLAN CNI插件FlannelCalico CNI配置内置实现 CNI CNI(Container Network Interface): 实现容器网络连接的规范 Kubernetes将网络通信可分为: Pod内容器、Pod、Pod与Se…

gRPC Java、Go、PHP使用例子

文章目录 1、Protocol Buffers定义接口1.1、编写接口服务1.2、Protobuf基础数据类型 2、服务器端实现2.1、生成gRPC服务类2.2、Java服务器端实现 3、java、go、php客户端实现3.1、Java客户端实现3.2、Go客户端实现3.3、PHP客户端实现 本文例子是在Window平台测试&#xff0c;Ja…

解决 requests.post 数据字段编码问题的方法

目录 一、引言 二、问题分析 三、解决方案与技术解析 四、总结 一、引言 在 Python 中&#xff0c;requests 库是一个常用的 HTTP 客户端库&#xff0c;可以用于发送所有类型的 HTTP 请求。当我们使用 requests.post 方法发送 POST 请求时&#xff0c;我们可能会遇到数据字…

Hdoop学习笔记(HDP)-Part.06 安装OracleJDK

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

ELK高级搜索,深度详解ElasticStack技术栈-上篇

前言 视频地址&#xff1a;java中级教程-ELK高级搜索&#xff0c;深度详解ElasticStack技术栈ELK高级搜索&#xff0c;深度详解ElasticStack技术栈-下篇本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 1. 课程简介 1.1 课程内容 ELK是包含但不限于Elas…

Springboot启动原理解析

我们开发任何一个Spring Boot项目&#xff0c;都会用到如下的启动类 SpringBootApplication public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);} } 从上面代码可以看出&#xff0c;Annotation定义&#x…

【Web安全】拿到phpMyAdmin如何获取权限

文章目录 1、outfile写一句话2、general_log_file写一句话 通过弱口令拿到进到phpMyAdmin页面如何才能获取权限 1、outfile写一句话 尝试执行outfile语句写入一句话木马 select "<?php eval($_REQUEST[6868])?>" into outfile "C:\\phpStudy\\WWW\\p…

多项式拟合求解

目录 简介 基本原理 例1 例2 例3 参考资料 简介 多项式拟合可以用最小二乘求解&#xff0c;不管是一元高阶函数&#xff0c;还是多元多项式函数&#xff0c;还是二者的混合&#xff0c;都可以通过统一的方法求解。当然除了最小二乘法&#xff0c;还是其他方法可以求解&…

springboot数据源配置

springboot数据源配置 数据层解决方案——持久化技术 内置持久化解决方案——jdbcTemplate 内置数据库 H2一般用于测试环境&#xff0c;配置profiels&#xff0c;只在开发阶段使用&#xff0c;让他在上线的时候不走这里就可以了 要使用内嵌的数据库H2,要先导入jar包

sCrypt 现已支持各类主流前端框架

sCrypt 现已支持各类主流前端框架&#xff0c;包括&#xff1a; ReactNext.jsAngularSvelteVue 3.x or 2.x bundled with Vite or Webpack 通过在这些支持的前端框架中集成sCrypt开发环境&#xff0c;你可以直接在前端项目里访问合约实例和调用合约&#xff0c;方便用户使用Se…