当前位置: 首页 > 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的主页」…...

OpenClaw日志分析实战:Phi-3-vision-128k-instruct多维度错误模式识别

OpenClaw日志分析实战&#xff1a;Phi-3-vision-128k-instruct多维度错误模式识别 1. 为什么需要智能日志分析 凌晨三点&#xff0c;我被手机警报惊醒——服务器又崩了。揉着惺忪睡眼打开终端&#xff0c;面对满屏的日志文件&#xff0c;那种熟悉的无力感再次袭来。这已经是本…...

3个核心方案:开源工具ncmdumpGUI如何让网易云音乐文件自由播放

3个核心方案&#xff1a;开源工具ncmdumpGUI如何让网易云音乐文件自由播放 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 当我们下载了心爱的音乐&#xff0c…...

电源防反接电路设计与工程实践

1. 电源防反接电路的必要性在工业自动化和嵌入式系统设计中&#xff0c;电源接反是一个常见但危害极大的问题。不同于消费电子产品使用标准化接口&#xff0c;许多工业设备需要现场接线&#xff0c;操作人员稍有不慎就可能接错电源极性。我曾参与过一个煤矿监控系统的项目&…...

02_RAGFlow之DeepDoc深度文档理解技术

RAGFlow之DeepDoc深度文档理解技术 知识体系 RAGFlow知识体系 | -- 文档解析层 | -- DeepDoc核心能力 | -- 文档布局分析模型 | -- 模板化分块策略 | -- 多模态处理层 | -- 表格结构识别 | -- 公式识别 | -- 图文混排处理 | -- 分块优化层 | -- 可视化模板市场 |…...

用Wireshark抓包分析CAN总线:手把手教你解码数据帧与遥控帧

用Wireshark抓包分析CAN总线&#xff1a;从数据捕获到故障诊断的完整指南 CAN总线作为现代汽车和工业控制系统的神经中枢&#xff0c;其通信质量直接关系到整个系统的可靠性。本文将带您深入实战&#xff0c;通过WiresharkPCAN-USB这套黄金组合&#xff0c;掌握从基础抓包到高级…...

【OpenClaw从入门到精通】第54篇:物理隔离“龙虾”——傻福虾盘与Docker沙箱实战对比(2026实测版)

摘要:2026年工信部NVDB平台及CNCERT指南明确要求:OpenClaw需在隔离环境中部署,严禁在办公设备直接运行。本文聚焦两大主流隔离方案——物理隔离(闲置旧电脑/专用硬件盒子)与Docker沙箱,系统拆解从原理到实操的全流程。包含3套完整部署案例、15+安全配置命令、容器逃逸风险…...

React Scroll Parallax核心组件详解:Parallax、ParallaxBanner和ParallaxProvider

React Scroll Parallax核心组件详解&#xff1a;Parallax、ParallaxBanner和ParallaxProvider 【免费下载链接】react-scroll-parallax &#x1f52e; React hooks and components to create parallax scroll effects for banners, images or any other DOM elements. 项目地…...

Openfire核心功能解析:如何构建安全高效的实时聊天系统

Openfire核心功能解析&#xff1a;如何构建安全高效的实时聊天系统 【免费下载链接】Openfire An XMPP server licensed under the Open Source Apache License. 项目地址: https://gitcode.com/gh_mirrors/op/Openfire Openfire是一款基于XMPP协议的开源实时聊天服务器…...

从零构建:基于OpenCV与人体姿态分析的跌倒检测实战(附完整源码)

1. 为什么我们需要跌倒检测系统 想象一下家里的老人独自在客厅活动时突然摔倒的场景。这种意外在现实生活中并不罕见&#xff0c;尤其是对于行动不便的老年人群体。传统的解决方案往往依赖于佩戴式设备或紧急呼叫按钮&#xff0c;但这些方法要么需要用户主动操作&#xff0c;要…...

【优化求解】基于matlab粒子群算法面向弹性提升的多种应急资源参与配电网抢修恢复【含Matlab源码 15275期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…...