当前位置: 首页 > news >正文

模板初阶【C++】

文章目录

  • 模板的作用
  • 模板的原理
  • 模板分为两大类——函数模板和类模板
    • 函数模板
      • 语法
      • 函数模板实例化模板函数的方式
      • 模板函数的类型转换
      • 既有函数模板又有已经实现的函数,会优先调用哪一个?
    • 类模板
      • 语法
      • 模板类实例化对象
      • 模板类的模板参数可以有缺省值
      • 类模板中的成员函数全函数模板
      • 模板类中的成员函数声明和定义分离

模板的作用

模板的主要作用是实现泛型编程,泛型编程即编写与类型无关的通用代码,是代码复用的一种手段
模板就是泛型编程的基础。


我们经常使用的交换函数就可以使用泛型编程来进行编写,这样可以大大减少重复的代码

一般编写方式
在这里插入图片描述
可以发现上图的三个函数除了参数类型不一样,其他的都是一样的重复的代码太多了,这个时候就可以考虑使用模板进行编写了


模板编写方式:
在这里插入图片描述
此时编译器就可以根据类型的不同实例化出不同的函数


模板的原理

模板就如其名字一样,就像一个冰棍模具,把不同的果汁(类型)放进去就可以得到不同口味的冰棍,但是这些冰棍就只有口味不同,外形(代码逻辑)都是一样的。

如下图
在这里插入图片描述
编译器编译阶段,对于模板的使用,编译器会根据传入的实参类型来推演生成对应类型的函数以供
调用。


模板分为两大类——函数模板和类模板

函数模板

语法

template < typename/class T(自定义类型名), typename/class T,………>
函数模板定义


在这里插入图片描述


函数模板实例化模板函数的方式

  1. 只传实参(隐式调用)[让编译器自己根据实参类型推]
    在这里插入图片描述

  2. 既传实参又传类型(显示调用)[即自己指定模板使用的类型]
    在这里插入图片描述

必须显式传类型的场景

即仅靠实参推演出的类型不够


在这里插入图片描述
此时就必须显式传类型
在这里插入图片描述


当模板类型个数和实参个数不同时,可能会类型不明


在这里插入图片描述
此时有3个解决方法

  1. 对实参进行强制类型转换
    即 把函数调用方式改为: Add(a,(int)c)或者 Add((char) a,c),让参数类型统一。

  2. 显式传递模板参数
    即 把函数调用方式改为Add<int>(a,c)或者Add<char>(a,c),让编译器知道模板参数是什么,先实例化出对应的函数之后,再传入实参,此时实参就会自动进行隐式类型转换

  3. 增加模板参数个数到于实参个数匹配

    在这里插入图片描述


模板函数的类型转换

使用实参类型推导模板参数时(隐式调用),不能隐式类型转换

显式调用时可以隐式类型转换


既有函数模板又有已经实现的函数,会优先调用哪一个?

例如下图这种情况:
在这里插入图片描述

此时分3种情况

  1. 如果调用普通函数不会发生类型转换,那就调用已经存在的普通函数
    在这里插入图片描述

  2. 如果调用普通函数发生类型转换,而调用函数模板实例化的模板函数不会发生类型转换时,就调用模板函数
    在这里插入图片描述

  3. 如果都发生类型转换,就调用已经存在的普通函数


类模板

语法

template < typename/class T(自定义类型名), typename/class T,………>
模板类的定义


在这里插入图片描述


模板类实例化对象

模板类实例化对象时只能显式传类型

此时<>加在类名后面

[<>必须要有,哪怕<>中不写类型]


在这里插入图片描述
在这里插入图片描述


模板类的模板参数可以有缺省值


在这里插入图片描述

类模板中的成员函数全函数模板

为什么?

因为类模板中的成员变量的类型是不确定的,成员函数是否使用了类模板的模板类型不确定

所以他没有办法像普通类的成员函数一样,在编译时就创建好了

而是跟函数模板一样需要编译器在运行过程中推演


模板类中的成员函数声明和定义分离

不能简单地直接类名+::

而是

模板类型声明+类中的成员函数的定义[注意此时类名后面还是要加<类型>,因为这样才是一个完整的类类型],这样类实例化对象的时候就可以推导出对应的成员函数的类型
在这里插入图片描述

由于模板类不完整,所以不能直接用它去限定作用域

即在类外实现成员函数等用::区限定时,不能直接限定,要先指定类型

相关文章:

模板初阶【C++】

文章目录 模板的作用模板的原理模板分为两大类——函数模板和类模板函数模板语法函数模板实例化模板函数的方式模板函数的类型转换既有函数模板又有已经实现的函数&#xff0c;会优先调用哪一个&#xff1f; 类模板语法模板类实例化对象模板类的模板参数可以有缺省值类模板中的…...

搭建Vue的环境

目录 # 开篇 步骤一&#xff0c;准备Vue 的环境 步骤二&#xff0c;下载Vue.js的包 步骤三&#xff0c;创建并打开写前端代码的文件夹 步骤四&#xff0c;在VSCode中引入Vue.js的包 步骤五&#xff0c;创建第一个vue.html Vue其他知识 Vue.config命令 # 开篇 介绍&…...

[学习笔记]-MyBatis-Plus简介

简介 Mybatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 简言之就是对单表的增删改查有了很好的封装。基本不用再单独写sql语句了。目前此类…...

2024.6.23 刷题总结

2024.6.23 **每日一题** 520.检测大写字母&#xff0c;本题是简单模拟题&#xff0c;考察了ASCLL码相关的知识&#xff0c;根据题意&#xff0c;本题对于字符串有三种正确的用法&#xff0c;所以我们分三类来讨论&#xff0c;先根据首字母的大小写来分类&#xff0c;如果首字母…...

mysql查询不同用户(操作记录)的最新一条记录

先用MAX(time) 和 group by item_id 查询出不同的item_id对应的最大时间&#xff0c;然后再在外面连表查询&#xff0c;查询 表中 item_id 和login_time 时间 相等于刚才的查询记录的记录 具体语句如下 select a.* from reyo a join (select item_id,max(login_time) as ti…...

Java中如何使用设计模式来解决编程问题?

Java中使用设计模式来解决编程问题&#xff0c;可以显著提高代码的可复用性、可维护性和可读性。设计模式是一套被广泛应用于软件工程的解决方案&#xff0c;描述了在特定上下文中面对具体问题时的可复用解决方案。以下是几种常用的设计模式及其应用场景&#xff1a; 单例模式…...

单机、集群和分布式

目录 1.概述 2.单机服务器 单机版的服务器的性能&#xff0c;设计上的瓶颈&#xff1f; 3.集群 解决瓶颈1&#xff1a; 没有解决瓶颈2&#xff1a; 没有解决瓶颈3&#xff1a; 集群的优点&#xff1f; 集群的缺点&#xff1f; 4.分布式 分布式的优点&#xff1f; 分…...

qt开发-10_LineEdit

QLineEdit 小部件是一个单行文本编辑器。行编辑允许用户使用一组有用的编辑函数输入和 编辑一行纯文本。包括撤消和重做、剪切和粘贴以及拖放。通过更改行编辑的 echoMode()&#xff0c;它 还可以用作“只写”字段&#xff0c;用于输入如密码等. 创建好项目后&#xff0c;进入 …...

福昕PDF编辑器快速去除PDF水印方法

在福昕PDF编辑器软件中打开一个带有水印的PDF文件&#xff0c;点击如图下所示的页面管理->水印&#xff0c;点击全部移除 点击 是 水印消除&#xff08;注&#xff1a;部分类型的水印可以消除&#xff0c;但是有些类型的水印无法通过此方法消除&#xff09;...

Cloudflare 常用操作

一、域名托管到cloudflare 登录cloudflare->添加站点->填写域名(例如阿里云)->继续选择free套餐->继续->保存cloudflare分配的DNS地址->进入阿里云域名管理->进入DNS管理/DNS修改把DNS地址修改为cloudflare分配的两个DNS->保存->回到cloudflare->…...

elementUI的table使用展开功能( type=“expand“ ),展开时合起上一次展开的内容,始终保持展开内容为一个,并且再次点击合起自身

直接上代码了没什么可讲的,主要是用到 row-key"id" :expand-row-keys"expands row-click"handleRowClick" <template><div class"ele-body"><el-card shadow"never"><!-- 数据表格 --><ele-pro-t…...

【金】?Y? python网页前端streamlit

1、如何从 Google Colab Notebook 启动 streamit参考-How to Launch Streamlit App from Google Colab Notebook !streamlit run web.py & npx localtunnel --port 8501 & curl ipv4.icanhazip.com...

数据仓库之Lambda架构

Lambda架构是一种设计大规模数据处理系统的架构模式&#xff0c;它结合了批处理和实时处理的优点&#xff0c;以应对大数据的多样性、速度和规模问题。该架构主要由三个层次组成&#xff1a;批处理层&#xff08;Batch Layer&#xff09;、速度层&#xff08;Speed Layer&#…...

Apriori 处理ALLElectronics事务数据

通过Apriori算法挖掘以下事务集合的频繁项集&#xff1a; 流程图 代码 # 导入必要的库 from itertools import combinations# 定义Apriori算法函数 def apriori(transactions, min_support, min_confidence):# 遍历数据&#xff0c;统计每个项的支持度 item_support {}for tr…...

Content Provider:深入解析Android数据共享的核心组件

在Android开发中&#xff0c;Content Provider是一个重要的组件&#xff0c;它允许应用程序之间共享数据。它扮演着“数据访问中间层”的角色&#xff0c;为不同应用程序提供了一个统一的数据访问接口。以下将从技术难点、面试官关注点、回答吸引力以及代码举例四个方面&#x…...

069、Python 函数的递归调用

函数可以自己调用自己吗&#xff1f;&#xff1f;&#xff1f; 这就涉及函数的递归的用法了。 递归的概念&#xff1a; 函数递归是指函数在其定义中直接或间接调用自身的过程。 递归是一种强有力的编程技术&#xff0c;通常用于解决可以被分解为相同问题的子问题的情况&…...

数仓开发那些事_番外

一位神州的正式员工&#xff08;没错&#xff0c;就是之前文章中出现的实习生&#xff09;&#xff1a;一闪&#xff0c;你今年涨工资了吗&#xff1f; 一闪&#xff1a;mad&#xff0c;一年辛苦到头只涨了500米 神州员工&#xff1a;你去年绩效不是优秀吗&#xff0c;怎么就涨…...

Vue3+TypeScript项目实战——打造雨雪交加的智慧城市

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…...

经典游戏案例:植物大战僵尸

学习目标&#xff1a;植物大战僵尸核心玩法实现 游戏画面 项目结构目录 部分核心代码 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using Random UnityEngine.Random;public enum Z…...

Go 与 Java 字符编码选择:UTF-8 与 UTF-16 的较量

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

vscode+picgo+gitee实现Markdown图床

vscode中编辑Markdown文件&#xff0c;复制的图片默认是保存在本地的。当文档上传csdn时&#xff0c;会提示图片无法识别 可以在gitee上创建图床仓库&#xff0c;使用picgo工具上传图片&#xff0c;在Markdown中插入gitee链接的方式来解决该问题。 一、 安装picgo工具 1.1 v…...

【thinkphp问题栏】tp5.0分页技巧

一、调用内置方法paginate thinkphp内置了一个paginate方法支持分页功能 该方法位于library\think\db\Query.php内 /*** 分页查询* param int|array $listRows 每页数量 数组表示配置参数* param int|bool $simple 是否简洁模式或者总记录数* param array $config 配…...

获取时间戳是使用System.currentTimeMillis()还是使用new Date().getTime()(阿里开发规范)?

1.阿里规范 在阿里的Java开发手册中强制要求使用System.currentTimeMillis() 2.为什么(源码详解) new Date().getTime()它实际上也是调用的System.currentTimeMillis()&#xff0c;源码分析。 这个fastTime是它的成员变量&#xff0c;在new Date()的时候就被赋值了。 扩展一…...

仿饿了么加入购物车旋转控件 - 自带闪转腾挪动画 的按钮

, mWidth - mCircleWidth, mHeight - mCircleWidth); canvas.drawRoundRect(rectF, mHintBgRoundValue, mHintBgRoundValue, mHintPaint); //前景文字 mHintPaint.setColor(mHintFgColor); // 计算Baseline绘制的起点X轴坐标 int baseX (int) (mWidth / 2 - mHintPaint.m…...

Docker部署nacos集群

docker拉取nacos镜像&#xff0c;本文使用nacos2.0.3 三台服务器都要执行以下命令 docker pull nacos/nacos-server:v2.2.0准备挂载的日志目录和配置文件目录 日志&#xff1a;mkdir /usr/local/software/nacos/logs 配置文件&#xff1a;/usr/local/software/nacos/conf在配…...

centos查找文件 及 操作写入的进程

du -sh * 查看目录空间占用、发现大文件&#xff0c;确定进程&#xff0c;结束 yum install lsof 安装lsof 查看文件写入的 进程 2. lsof /root/.influxdbv2/engine/data/bab49411e5f7cbce/autogen/1/000000036-000000002.tsm COMMAND PID USER FD TYPE …...

构建高可用Java微服务架构的秘籍

构建高可用Java微服务架构的秘籍 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 随着云计算和分布式系统的快速发展&#xff0c;微服务架构已成为构建大型应用…...

VBA学习(18):VBA制作任意工作表均可使用的聚光灯

在需要制作聚光的工作簿&#xff0c;按<ALTF11>组合键&#xff0c;打开VBE编辑器。在右侧[工程资源管理器窗格]选中ThisWorkbook模块&#xff0c;将以下代码复制粘贴到该模块的代码窗口。 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target …...

【STM32-启动文件 startup_stm32f103xe.s】

STM32-启动文件 startup_stm32f103xe.s ■ STM32-启动文件■ STM32-启动文件主要做了以下工作&#xff1a;■ STM32-启动文件指令■ STM32-启动文件代码详解■ 栈空间的开辟■ 栈空间大小 Stack_Size■ .map 文件的详细介绍■ 打开map文件 ■ 堆空间■ PRESERVE8 和 THUMB 指令…...

51学习记录(一)——51介绍及震动感应灯

文章目录 前言一、STC89C522.内部结构及引脚 二、继电器原理及震动传感器原理三、项目搭建及实现 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、STC89C52 1.简介 所属系列&#xff1a;51单…...

wordpress只有一个主题/北京百度推广优化公司

大佬&#xff0c;牛&#xff01;&#xff01;&#xff01; 给定一个n和s&#xff0c;一个长度为n的数组。我们从数组中拿数&#xff0c;要求必须连续的拿&#xff0c;拿2*k个&#xff0c;而且前k个之和小于等于s&#xff0c;后k个之和也是小于等于s。我的思路&#xff1a;我的…...

c 鲜花店网站建设/友情链接搜读

当前位置:我的异常网 Oracle开发 求日均值,该如何处理求日均值,该如何处理www.myexceptions.net 网友分享于&#xff1a;2013-12-26 浏览&#xff1a;36次求日均值ACCOUNTDATEPRICE2006-12-492006-12-722006-12-822006-12-255082006-12-26442006-12-27102006-12-28112006-12…...

诸城高密网站建设/如何在百度上开店铺

for the file C:\FILES\TEXT.DAT GetPathName will return "C:\FILES\TEXT.DAT" GetFileTitle will return "TEXT" GetFileName will return "TEXT.DAT" GetFileExt will return "DAT"....

刚做的单页网站怎么预览/品牌广告

转自&#xff1a;http://blog.51cto.com/jimshu/590411 Windows 防火墙通过阻止未授权用户通过 Internet 或网络访问您的计算机来帮助保护计算机。 Windows 2008 和 Windows Vista 及后续版本都修改了安全策略&#xff0c;防火墙默认阻止了未经允许的访问。 一、服务 1、查看服…...

网站建设中国的发展/广告代理公司

背景 相信很多系统里都有这一种场景&#xff1a;用户上传 Excel&#xff0c;后端解析 Excel 生成相应的数据&#xff0c;校验数据并落库。 这就引发了一个问题&#xff1a;如果 Excel 的行非常多&#xff0c;或者解析非常复杂&#xff0c;那么解析校验的过程就非常耗时。 如…...

北京海淀区网站开发/杭州搜索引擎优化公司

1 .什么是健康检查&#xff1f; 健康检查几乎就是名称暗示的。它是一种检查您的应用程序是否健康的方法。随着越来越多的应用程序转向微服务式架构&#xff0c;健康检查变得尤其重要&#xff08;Health Check&#xff09;。虽然微服务架构有很多好处&#xff0c;但其中一个缺点…...