【C++】| 01——泛型编程 | 模板

news2024/11/23 13:18:45

系列文章目录

【C++】| 01——泛型编程 | 模板


文章目录

  • 1. 认识泛型编程
  • 2. 函数模板
    • 1.1 函数模板的语法
      • 1.1.1 定义模板
      • 1.1.2 应用模板实现函数
      • 1.1.3 使用模板函数(实例化)
        • 1.1.3.1 隐式使用(实例化)
        • 1.1.3.2 显式使用(实例化)
        • 1.1.3.3 使用函数模板的注意事项(实例化)
  • 2. 类模板
    • 2.1 定义类模板
    • 2.2 使用类模板
    • 2.3 类模板实例化对象 做函数入参
    • 2.4 类模板继承
    • 2.7 类模板友元
    • 2.6 类模板声明和定义分文件编写
  • 3. 总结


1. 认识泛型编程

 我们在学习编程的过程中 常会听到 面向过程、面向对象、抽象等概念,那什么是泛型呢?它有什么用呢?
 什么是泛型编程?
泛型是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。
                 ——来自维基百科
 通俗点就是 实现不关心参数(数据类型) 功能代码的一种方式
 泛型编程有什么用呢?
 比如一个函数不关心 传入的参数类型 那么这个函数是不是具有了通用性
 作用:让程序复用 具有通用性
 泛型编程可以应用到哪里
 它可以应用到函数、类等其他很多里面

2. 函数模板

 函数模板就是应用泛型编程的函数。模板顾名思义。也就是套壳子 别人写好的作业改名字 不关心内容 里面 写上我的名字就是我的作业。
 作用:实现一个通用函数(函数返回值/入参类型 用替代类型表示 后期在使用时 自定义类型 使用即可)
注: 模板的通用性是有局限的
下面通过举例 来了解函数模板的作用

1、在C/C++中我要实现一个 计算两个整数和 及两个小数和

在这里插入图片描述
我们可以看到我们用函数模板后 只需要给一个函数传入不同参数即可实现 不同需求
后面会详细的介绍模板的定义和应用

1.1 函数模板的语法

1.1.1 定义模板

在这里插入图片描述

1.1.2 应用模板实现函数

eg : 使用函数模板实现 一个两数交换的函数

在这里插入图片描述

1.1.3 使用模板函数(实例化)

使用函数模板也就是 函数模板实例化
实例化就是 填入参数使用函数
有两种使用方式(实例化)
1、隐式实例化(不指定类型 编译器自动检测)
2、显式实例化(指定类型)
下面通过例子说明

1、交换2个整数
2、交换2个单精数
3、交换2个字符型

1.1.3.1 隐式使用(实例化)

编译器通过我们填入的实参 自动推导出该函数入参的实际类型
在这里插入图片描述
函数模板调用过程
在这里插入图片描述

1.1.3.2 显式使用(实例化)

编译器通过我们指定的参数类型 使用函数

显式: 函数名 + <指定的参数类型>
eg: func < int >(a,b);

在这里插入图片描述

注意:显示使用(实例化) 我们指定了参数类型 所以只能传入 对应类型

1.1.3.3 使用函数模板的注意事项(实例化)

  1. 隐式使用(实例化)时
    当我们函数使用1个通用类型时 比如 T 我们填入的参数类型必须一致
    即参数类型不会隐式转换(普通函数会)

看图理解
在这里插入图片描述

2、普通函数和函数模板 可以发生重载
在这里插入图片描述
3、函数模板也可以重载
在这里插入图片描述

2. 类模板

类模板 就是将模板应用到了类里。它和函数模板有以下区别
1、函数模板可以隐式实例化(自动识别leim类型) 类模板不行
2、函数模板不可以默认参数 (C++11之后可以)

2.1 定义类模板

template + <class/template 类模板名> // 类模板定义和函数模板定义相似

在这里插入图片描述

定义有默认参数的类模板

在这里插入图片描述

2.2 使用类模板

eg: 定义一个狗类 并实例化类模板 对象

在这里插入图片描述

eg: 类模板成员函数 在类外实现

在这里插入图片描述

2.3 类模板实例化对象 做函数入参

在这里插入图片描述

2.4 类模板继承

在这里插入图片描述

2.7 类模板友元

1、类内实现友元
在这里插入图片描述
2、类外实现友元
在这里插入图片描述

类外实现需要先声明类模板及函数 让编译器可以识别到

2.6 类模板声明和定义分文件编写

在存在很多类的时候 我们就需要分文件编写 来管理代码。在C语言中 一般结构体/函数等声明在 头文件(.h)里 ,源文件(.c) 引入(#include 头文件)即可。但在C++中 当我们类模板声明和定义分文件后 源文件引入的话会存在问题。

在这里插入图片描述
这种情况下 会报错 无法链接 编译器在定义源文件里找不到 类模板的实例化

解决方法:将类模板的声明和定义放到一个文件 “xxxx.hpp” 或者 xxxx.h 里

3. 总结

面向对象 泛型编程 等编程思想 都是为了让程序更具有通用性 。当然 官方也为我们提供了标准的模板库 即STL 标准模板库。

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

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

相关文章

第1章 Nginx简介

基于 Nginx版本 1.14.2 &#xff0c;Tomcat版本 9.0.0 演示 第1章 Nginx简介 1.1 Nginx发展介绍 Nginx &#xff08;engine x&#xff09; 是一个高性能的Web服务器和反向代理服务器&#xff0c;也可以作为邮件代理服务器。 Nginx 特点是占有内存少&#xff0c;并发处理能力…

南京邮电大学数据库实验二(DBMS的数据库保护)

文章目录 一、实验目的和要求二、实验环境(实验设备)三、实验原理及内容(1) DBMS的数据库保护功能(2) 安全控制中的访问控制机制(3) 事务的提交与回滚(4) 并发控制的锁机制 三、实验内容1.以root账户登录数据库管理系统&#xff0c;创建用户U1和U2&#xff0c;密码自定。2.创建…

Redis 入门教程(简单全面版)

1 安装&#xff1a; 1.1 生产环境安装 注意&#xff1a; 1、如果安装过程有问题可以参考源代码中的 README.md 文件 2、如果服务器只安装一个 redis 通常选择 /usr/local/redis 作为安装目录&#xff0c;如果安装多台则建议带上 服务名称 区分&#xff08;建议带上 服务名称 区…

jvm-狂神课程

一、JVM JVM就是Java虚拟机&#xff0c;Java虚拟机就是JVM 1. JVM位置 1、Java程序&#xff08;跑的环境是在jvm&#xff08;虚拟机&#xff09;跑的&#xff0c;也可以说是在jre上跑的&#xff09;java运行是需要在特定的环境的也就是这个jre这种。 2、jvm&#xff08;也就是…

别不信:这些细节关乎你的物联网设备的命运!

《高并发系统实战派》-- 值得拥有 一、设备接入层网络协议的意义 随着物联网的发展&#xff0c;越来越多的设备需要接入云平台进行远程监控和管理。设备接入层网络协议起到了承担设备接入网络的功能&#xff0c;为物联网平台提供了数据交互的基础。设备接入层网络协议对于物联…

【C++ 入坑指南】(01)学习路线

入门 1. 推荐书籍 《Accelerated C》&#xff0c;《Essential C》二选一精读。《A Tour of C》选读。 《Accelerated C》很适合新手&#xff0c;因为只有短短不到 300 页&#xff0c;在普遍一样的入门书籍里面是一股清流。容易通读完&#xff0c;减少挫败感。就这样的篇幅&am…

【每天学习一点新知识】如何绕过CDN查真实ip

1、什么是CDN 为了防止流量过大网络堵塞&#xff0c;我们就在靠近用户的地方&#xff0c;建一个缓存服务器&#xff0c;把远端的内容复制一份&#xff0c;放在这里&#xff0c;简单来说就是将内容缓存在终端用户附近。 2、怎么绕过cdn找到远端服务器的真实ip呢&#xff1f; &…

FS2462是泛海微自主开发的5A降压型同步整流芯片

FS2462是泛海微自主开发的5A降压型同步整流芯片&#xff0c;是国内首家大电流同步5A芯片&#xff0c;内部集成极低RDS内阻20豪欧金属氧化物半导体场效应晶体管的(MOSFET)。输入工作电压宽至4.75V到21V&#xff0c;输出电压1.0V可调至20V。5A的连续负载电流输出可保证系统各状态…

Landing AI:计算机视觉数据标注AI平台

【产品介绍】 Landing AI是一家由人工智能领域的知名专家、Coursera联合创始人、前百度首席科学家、Google大脑创始负责人吴恩达博士创立的公司&#xff0c;旨在为各行各业提供先进的计算机视觉解决方案。 Landing AI的核心产品是LandingLens&#xff0c;一个基于云端的计算机视…

前端开发代码规范工具

规范化是前端工程化的一个重要部分。现在&#xff0c;有许多工具能够辅助我们实行代码的规范化,比如你一定知道的 ESLint 和 Prettier。 今天&#xff0c;来聊聊这些工具的工作原理和基本使用&#xff0c;了解它们是如何发挥作用的&#xff0c;以及如何更好地利用这些工具去规…

AI成功破译古老未知语言,人工智能技术开辟历史研究新时代

近年来&#xff0c;人工智能在各个领域取得了突飞猛进的发展&#xff0c;成为了当今社会讨论的热点。尽管有关其使用的争议不断&#xff0c;但AI技术在某些方面的作用已经不容忽视。 最近&#xff0c;以色列特拉维夫大学和阿里尔大学的研究者们联手研发了一款能够破译古老未知…

Nature:刘清华团队揭示调控睡眠时间的关键分子通路

导读 你能做到一周不睡觉吗&#xff1f;良好的睡眠对我们保证生活质量十分重要。不过&#xff0c;有些人每天只需睡4-6个小时&#xff0c;有些人则需要8个小时&#xff08;可能还不够&#xff09;&#xff0c;这是什么原因导致的&#xff1f; 其实&#xff0c;这也是很多科学…

阿里云服务器镜像是什么意思?

阿里云服务器镜像是云服务器的装机盘&#xff0c;镜像是为云服务器安装操作系统的。云服务器镜像系统怎么选择&#xff1f;云服务器操作系统镜像分为Linux和Windows两大类&#xff0c;Linux可以选择Alibaba Cloud Linux&#xff0c;Windows可以选择Windows Server 2022数据中心…

怎样恢复删除的视频?这5个方法才是正确答案!

案例&#xff1a;怎样恢复删除的视频&#xff1f; 【我是个视频爱好者&#xff0c;平常会在电脑中存很多视频&#xff0c;但也经常会将很多视频误删&#xff0c;怎样恢复删除的视频呢&#xff1f;希望大家给我一些建议&#xff01;】 在摄影摄像技术较发达的今天&#xff0c;…

cond conv 代码-思想

参考博客&#xff1a; 1 解析图示最清楚动态卷积之CondConv思想和代码实现_&永恒的星河&的博客-CSDN博客 2 知乎的解释&#xff0c;简洁明了CondConv代码解析 - 知乎 知乎提供code&#xff1a;External-Attention-pytorch/CondConv.py at master xmu-xiaoma666/Extern…

详解MySQL索引失效

目录 B树结构 测试数据 索引失效的情况 没有用到索引 违反左前缀原则 范围查询断索引 like需要分情况 结果数据超过半数 B树结构 索引失效的根本原因其实就是违反了B树的结构特性&#xff0c;查找的时候没办法在B树上继续走下去&#xff0c;所以首先我们来回顾一下B树…

进程控制(中)

目录&#xff1a; 1.status获取子进程退出的退出码和信号 2.不进行位操作方式获取子进程的退出码和信号 3.waitpid 第三个参数options ------------------------------------------------------------------------------------------------------------------------------- 1.…

工业4.0,为什么数字化转型这么难,上了ERP还要上MES

工业4.0时代&#xff0c;中国制造企业已经面临着与国际先进水平的差距&#xff0c;更多的企业在寻找新的发展道路&#xff0c;数字化转型是制造业企业转型升级的必由之路。但是&#xff0c;许多制造型企业由于在传统生产过程中&#xff0c;业务数据不能得到有效监控、生产过程数…

人脸修复增强调研

Real-ESRGAN 工程地址&#xff1a;https://github.com/xinntao/Real-ESRGAN 效果&#xff1a; 人脸增强部分&#xff0c;调用的GFPGAN. GFPGAN 工程地址&#xff1a;https://github.com/TencentARC/GFPGAN 论文效果&#xff1a; BasicSR-ESRGAN&#xff1a; 项目地址&a…

巨杉数据库荣获新睿之星,赋能大湾区技术与产业升级

巨杉数据库凭借多年深耕分布式数据库的技术积累和创新能力&#xff0c;于广州投资年会上荣获新睿之星奖项&#xff0c;该奖项不仅是对巨杉数据库的肯定&#xff0c;也充分肯定广州培育本土高新企业的发展成果。 4月18日&#xff0c;2023年第九届广州国际投资年会在广州白云国际…