C++——模板详解

目录

模板

函数模板

显示实例化

类模板

模板特点


模板

        模板,就是把一个本来只能对特定类型实现的代码,变成一个模板类型,这个模板类型能转换为任何内置类型,从而让程序员只需要实现一个模板,就能对不同的数据进行操作。模板分为函数模板类模板

        模板使用格式:template<typename T1, typename T2,......,typename Tn>;也可以为:template<class T1, class T2,......,class Tn>

函数模板

        函数模板,就是用模板来实现一个函数,从而让这个函数可以供任何内置类型使用,例如下图:

        我们定义T为模板,那么T就可以为任何内置类型,当传入不同类型时,编译器都会自动对应上。当然下面swap(a,b)和swap(c,d)也不是同个swap函数,而是编译器根据我们形参的类型,从而把T转换为形参的类型,然后生成一个swap函数。图中代码会生成一个形参是int类型的函数和一个形参是double类型的函数。

        编译器根据我们给的类型,在根据函数模板,生成对应类型的函数;这个过程叫模板的实例化

        如果swap的两个传参不是同个传参,但函数模板里是同个模板T,就会无法编译;这时候只能用显示实例化来强行让两个传参为显示实例化的类型。

显示实例化

        进行模板实例化时,还可以显示实例化。即使用模板函数的时候,强制后面的形参为我们所要求的类型。使用方法为:函数模板名<类型>(对象1,对象2....);强制让对象1和对象2为前面<>内输入的类型。

        比如下图,直接用add(a,b)是编译不过的,但用了显示实例化就可以强行让a和b都为int类型,再生成一个int类型的add函数,进行调用。

类模板

        类模板,就是把模板的类型放入类中,这样在我们类的对象实例化的时候,就可以自主选择需要创建的对象的类型。

        注意:类模板创建对象时必须进行显示实例化

        类模板不能声明定义分离到两个文件,在一个文件内进行声明定义分离时,定义部分要包含域和模板类型,而且在定义的上方要在声明一次模板。(因为上面声明的模板,是在class内使用,下面再次声明的模板是在函数内使用)具体使用方式如下图所示:

模板特点

        模板不能声明定义分离。

        模板只能定义一行使用一行,当模板被使用于函数或者中后,不能再放入其他函数或者类中。

        当模板名字和我们自己定义的函数名冲突时,不会报错;当我们调用函数时,编译器会先找有没有形参对应上的非模板函数,找不到才会实例化模板。但如果使用了显示实例化则会强制调用模板,进行模板实例化。  

        模板函数不允许自动类型转换,如果类型不同,则编译不了,只能用显示实例化;但普通函数可以进行自动类型转换。

        模板可以具有非类型参数,用于指定大小,可以根据指定的大小创建动态结构,所以模板可以用来创建动态增大或减小的数据结构

        模板运行时不检查数据类型相当于类型的宏替换,不保证安全。

        类模板是一个类家族,模板类是通过类模板实例化的具体类。

        C++中类模板的声明格式为template<模板形参表声明><类声明>,并且类模板的成员函数都是模板函数。

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

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

相关文章

数据库子父结构表,树状结构数据进行递归查询

表结构&#xff1a; 三个字段如图所示&#xff0c;目标是获取每条数据的根id&#xff08;父id为0的数据根id就是自己的id,否则一直根据父id去查找一直找到父id为0的数据&#xff0c;此数据的id就是根id&#xff09; 业务中实际的解决办法&#xff1a; 新加一个字段进行存储&…

【c++】 STL的组件简介与容器的使用时机

STL六大组件简介 STL提供了六大组件&#xff0c;彼此之间可以组合套用&#xff0c;这六大组件分别是:容器、算法、迭代器、仿函数、适配器&#xff08;配接器&#xff09;、空间配置器。 容器&#xff1a;各种数据结构&#xff0c;如vector、list、deque、set、map等,用来存放…

135.乐理基础-半音是小二度吗?全音是大二度吗?三全音

内存参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;134.乐理基础-音程名字的简写-CSDN博客 上一个内容里练习的答案&#xff1a; 半音可以与小二度划等号吗&#xff1f;全音可以和大二度划等号吗&#xff1f; 严格来说它们是不能划等号的&#xff0c;半音与全音是侧…

如何在Windows部署TortoiseSVN客户端并实现公网连接内网VisualSVN服务端

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统&#xff0c;它与Apache Subversion&#xff08;SVN&#xff09;集成在一起&#xff0c;提供了一个用户友好的界面&#xff0c;方便用…

vulhub中Tomcat7+ 弱口令 后台getshell漏洞

Tomcat版本&#xff1a;8.0 环境说明 Tomcat支持在后台部署war文件&#xff0c;可以直接将webshell部署到web目录下。其中&#xff0c;欲访问后台&#xff0c;需要对应用户有相应权限。 Tomcat7权限分为&#xff1a; manager&#xff08;后台管理&#xff09; manager-gui 拥…

Spring IOC在业务中常见的使用方式

目录 1、什么是IOC 2、java实现创建对象的方式有哪些 3、基于配置文件的di实现 3.1、什么是di 3.2、入门案例 3.3、环境搭建 接口和实现类 ioc配置文件 测试程序 3.4、案例总结 3.5、简单类型属性的赋值&#xff08;set注入&#xff09; set注入要求 JavaBean sp…

内存飙高问题如何排查?

目录 1、查看日志 2、查看GC情况 3、分析堆内存对象占用情况 4、分析堆内存快照文件 内存飙高如果发生在java进程上&#xff0c;一般情况是因为创建了大量对象导致&#xff0c;持续飙高说明垃圾回收跟不上对象创建的速度&#xff0c;或者内存泄漏导致对象无法被回收&#x…

力扣刷题:2.两数相加

题目&#xff1a; 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这…

枚举(蓝桥练习)(反倍数、特别数的和、找到最多的数、小蓝的漆房、小蓝和小桥的挑战)

目录 一、枚举算法介绍 二、解空间的类型 三、循环枚举解空间 四、例题 &#xff08;一、反倍数&#xff09; &#xff08;二、特别数的和&#xff09; &#xff08;三、找到最多的数&#xff09; &#xff08;四、小蓝的漆房&#xff09; &#xff08;五、小蓝和小桥的…

(C语言)Sleep函数,system函数,数组练习,详解与运用

一维数组详解&#xff1a;http://t.csdnimg.cn/zahZF 二维数组详解&#xff1a;http://t.csdnimg.cn/h2mLe 我们看过可一维数组与二维数组&#xff0c;现在我们来进行简单的练习。 题目&#xff1a;编写代码&#xff0c;演⽰多个字符从两端移动&#xff0c;向中间汇聚 1. …

Mysql索引优化导致死锁问题

1、背景 随着公司业务的发展&#xff0c;商品库存从商品中心独立出来成为一个独立的系统&#xff0c;承接主站商品库存校验、订单库存扣减、售后库存释放等业务。在上线之前我们对于核心接口进行了压测&#xff0c;压测过程中出现了MySQL 5.6.35死锁现象&#xff0c;通过日志发…

【python】Python Turtle绘制流星雨动画效果(附源码)

在这篇技术博客中&#xff0c;我们将学习如何使用 Python 的 Turtle 模块绘制一个流星雨的动画效果。通过简单的代码实现&#xff0c;我们可以在画布上展现出流星闪耀的场景&#xff0c;为视觉带来一丝神秘与美感。 一、效果图&#xff1a; 二、准备工作 &#xff08;1)、导入…