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<模板形参表声明><类声明>,并且类模板的成员函数都是模板函数。因为模板可以转为任何类型,所以在类模板中,每个成员函数都有一个this指针代表自己,就会包含这个模板,所以成员函数就是模板函数。比如一个Stack类模板,里面的成员函数一定都是对Stack的数据进行修改操作,而Stack的数据类型是由模板控制的,所以Stack类中的成员函数就都是模板函数。

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

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

相关文章

FPGA-串口接收图像写入RAM并读出在TFT显示屏上显示

系统框图&#xff1a; 需要用到的模块有&#xff1a; 1&#xff0c;UART_RX(串口接收模块)&#xff1b; 2&#xff0c;串口接受的数据存放到RAM模块&#xff1b; 3&#xff0c;RAM IP核&#xff1b; 4&#xff0c;时钟IP核 &#xff08;TFT显示屏驱动时钟的产生&#xff09…

kafka同步副本集及关键参数

上篇文章讲了副本机制是什么&#xff0c;一文读懂kafka内部怎么运行的-CSDN博客 这里深挖下同步副本集及里面的关键参数。副本会去leader副本拉去数据追加到自己日志中。 我们知道kafka副本的作用是提高系统的高可用。当leader副本挂了时&#xff0c;会从候选副本集中选者一个当…

java-幂等性

幂等性 1.1幂等性定义&#xff1a; 在计算机领域中&#xff0c;幂等&#xff08;Idempotence&#xff09;是指任意一个操作的多次执行总是能获得相同的结果&#xff0c;不会对系统状态产生额外影响。在Java后端开发中&#xff0c;幂等性的实现通常通过确保方法或服务调用的结…

设计模式(十四)中介者模式

请直接看原文: 原文链接:设计模式&#xff08;十四&#xff09;中介者模式_设计模式之中介模式-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- 前言 写了很多篇设计模式的…

Ribbon实现Cloud负载均衡

安装Zookeeper要先安装JDK环境 解压 tar -zxvf /usr/local/develop/jdk-8u191-linux-x64.tar.gz -C /usr/local/develop 配置JAVA_HOME vim /etc/profile export JAVA_HOME/usr/local/develop/jdk1.8.0_191 export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOM…

npm install 一直在等待sill idealTree buildDeps

最近在整vue的前端项目&#xff0c;npm install的时候一直在等待&#xff0c;记录下处理过程。 1.检查当前npm镜像的地址 输入命令&#xff1a;"npm config get registry"&#xff0c;如果结果是"https://registry.npmjs.org/"。 更换下地址&#xff0c…

Windows Server 各版本搭建文件服务器实现共享文件(03~19)

一、Windows Server 2003 打开服务器&#xff0c;点击左下角开始➡管理工具➡管理您的服务器➡添加或删除角色 点击下一步等待测试 勾选自定义配置&#xff0c;点击下一步 选择文件服务器&#xff0c;点击下一步 勾选设置默认磁盘空间&#xff0c;数据自己更改&#xff0c;最…

【JavaEE】_Spring MVC 项目传参问题

目录 1. 传递单个参数 1.1 关于参数名的问题 2. 传递多个参数 2.1 关于参数顺序的问题 2.2 关于基本类型与包装类的问题 3. 使用对象传参 4. 后端参数重命名问题 4.1 关于RequestPara注解 1. 传递单个参数 现创建Spring MVC项目&#xff0c;.java文件内容如下&#xff…

2024年3月计划

根据规划&#xff0c;为了要考虑把产品代码吃透。先对于计算几何&#xff0c;图像处理&#xff0c;测量学基础进行 当然&#xff0c;也要把ue继续进行着。ue的rpg和底层渲染。收集下虚幻商城的免费资源&#xff0c;万一以后做独立游戏用得到。其他的可以暂时不进行。因为ue的工…

Apache Flink连载(三十七):Flink基于Kubernetes部署(7)-Kubernetes 集群搭建-3

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录

AI-数学-高中-32-概率-样本空间与随机事件

原作者视频&#xff1a;【概率】【一数辞典】1样本空间与随机事件_哔哩哔哩_bilibili 1.随机试验&#xff1a; 2.样本点、样本空间、有限样本空间&#xff1a; 示例1 示例2 3.事件&#xff1a; 示例&#xff1a;

PAT基础练习

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”&#xff0c;要求按下列格式打印 ************ *****所谓“沙漏形状”&#xff0c;是指每行输出奇数个符号&#xff1b;各行符号中心对齐&#xff1b;相邻两行符号数差2&#xff1b;符号数先从大到小顺序递减…

自己本地模拟内存数据库增删改查

目录 学习初衷准备代码实现结果感谢阅读 学习初衷 用于满足自己的测试要求&#xff0c;不连接数据库&#xff0c;也不在意数据丢失 准备 maven依赖 org.springframework.boot spring-boot-starter-test test 代码实现 内存数据库&#xff08;InMemoryDatabase&#xff0…

[AutoSar]BSW_Com08 CAN driver 模块介绍及参数配置说明 (二)

目录 关键词平台说明一、CanControllers二、CanTxProcessing三、CanFilterMask四、CanHardwareObjects五、CanGeneral 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c;芯片厂商TI 英飞凌编程语言C&#xff0c;C编译器…

游戏引擎分层简介

游戏引擎分层架构&#xff08;自上而下&#xff09; 工具层&#xff08;Tool Layer&#xff09; 在一个现代游戏引擎中&#xff0c;我们最先看到的可能不是复杂的代码&#xff0c;而是各种各样的编辑器&#xff0c;利用这些编辑器&#xff0c;我们可以制作设计关卡、角色、动画…

数据类型和变量

1.数据类型 在Java中数据类型主要分为两类&#xff1a;基本数据类型和引用数据类型。 基本数据类型有四类八种&#xff1a; 1. 四类&#xff1a;整型、浮点型、字符型以及布尔型 2.八种&#xff1a; 整形是分为如上四种 byte short int long 浮点型分为 float 和double …

Docker Compose系列--搭建halo与mysql

原文网址&#xff1a;使用Docker Compose系列--搭建halo与mysql_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍如何使用Docker Compose搭建halo与mysql。 官网网址 使用 Docker 部署 Halo 和 MySQL | Halo Documents Docker Compose搭建mysql 见&#xff1a;Docker Com…

【大厂AI课学习笔记NO.64】机器学习开发框架

机器学习开发框架本质上是一种编程库或工具&#xff0c;目的是能够让开发人员更容易、更快速地构建机器学习模型。 机器学习开发框架封装了大量的可重用代码&#xff0c;可以直接调用&#xff0c;目的是避免“重复造轮子’大幅降低开发人员的开发难度&#xff0c;提高开发效率…

软考高级:候选码、主码、全码、外码、主属性、主键、主关键字、非主属性概念和例题

一、AI 讲解 候选码、主码、全码、外码、主属性、主键、主关键字、非主属性是数据库设计和数据建模中的基本概念&#xff0c;特别是在关系数据库模型中。下面将对这些概念进行简单讲解&#xff0c;并给出相应的例子。 概念讲解 候选码&#xff08;Candidate Key&#xff09;…

Spring框架精髓:带你手写IoC

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…