C++学习笔记——模板

学习视频

文章目录

  • 模板的概念
  • 函数模板
    • 函数模板语法
    • 函数模板注意事项
    • 函数模板案例
    • 普通函数与函数模板的区别
    • 普通函数与函数模板的调用规则
    • 模板的局限性
  • 类模板
    • 类模板与函数模板区别
    • 类模板中成员函数创建时机
    • 类模板对象做函数参数
    • 类模板与继承
    • 类模板成员函数类外实现
    • 类模板分文件编写
    • 类模板与友元
    • 类模板案例

模板的概念

模板就是建立通用的模具,大大提高复用性

模板的特点:

  • 模板不可以直接使用,它只是一个框架
  • 模板的额通用并不是万能的

函数模板

  • C++ 另一种编程思想称为泛型编程,主要利用的技术就是模板
  • C++ 提供两种模板机制:函数模板类模板

函数模板语法

函数模板的作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。

template<typename T>
函数声明或定义

解释:
template — 声明创建模板
typename — 表面其后面的符号是一种数据类型,可以用class代替
T — 通用的数据类型,名称可以替换,通常为大写字母

函数模板注意事项

注意事项:

  • 自动类型推导,必须推导出一致的数据类型T,才可以使用
  • 模板必须要确定出T的数据类型,才可以使用

函数模板案例

案例描述

  • 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序
  • 排序规则从大到小,排序算法为选择排序
  • 分别利用char数组int数组进行测试

普通函数与函数模板的区别

  • 普通函数调用时可以发生自动类型转换(隐式类型转换)
  • 函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换
  • 如果利用显示指定类型的方式,可以发生隐式类型转换
template<typename T>
T myAdd(T a, T b){return a+b;	
}int a = 10;
char b = 'b';
myAdd(a, b);// 会报错,使用函数模板时,char不会自动转换为int类型

普通函数与函数模板的调用规则

调用规则如下:
1、如果函数模板和普通函数都可以实现,优先调用普通函数
2、可以通过空模板参数列表来强制调用函数模板
3、函数模板也可以发生重载
4、如果函数模板可以产生更好的匹配,优先调用函数模板

总结:既然提供了函数模板,最好就不要提供普通函数,否则容易出现二义性

模板的局限性

局限性:

  • 模板的通用性并不是万能的

利用具体化Person的版本实现代码,具体化优先调用

template<> bool myCompare(Person &p1, Person &p2){}

总结:

  • 利用具体化的模板,可以解决自定义类型的通用化
  • 学习模板并不是为了写模板,而是在STL能够运用系统提供的模板

类模板

类模板的作用:

  • 建立一个通用类,类中的成员 数据类型可以不具体制定,用一个虚拟的类型来代表

总结:类模板和函数模板语法相似,在声明模板template后面加类,此类称为类模板

类模板与函数模板区别

类模板与函数模板区别主要有两点:

  1. 类模板没有自动类型推导的使用方式
  2. 类模板在模板参数列表中可以有默认参数

总结:

  • 类模板使用只能用显示指定类型方式
  • 类模板中的模板参数列表可以有默认参数

类模板中成员函数创建时机

类模板中成员函数和普通类中成员函数创建时机是有区别的:

  • 普通类中的成员函数一开始就可以创建
  • 类模板中的成员函数在调用时才创建

总结:类模板中的成员函数并不是一开始就创建的,在调用时才去创建。因为只有在调用时才能知道模板所表示的具体类型,去创建实例。

类模板对象做函数参数

学习目标:

  • 类模板实例化出的对象,向函数传参的方式

一共有三种传入方式:

  1. 指定传入的类型 \; —直接显示对象的数据类型
  2. 参数模板化 \;\;\;\;\;\;\; —将对象中的参数变为模板进行传递
  3. 整个类模板化 \;\;\;\; —将这个对象类型 模板化进行传递

使用 typeid().name() 可查看模板代替的类型

总结:

  • 通过类模板创建的对象,可以有三种方式向函数中进行传参
  • 使用比较广泛是第一种:指定传入的类型

类模板与继承

当类模板碰到继承时,需要注意以下几点:

  • 当子类继承的父类是一个类模板时,子类在声明的时候,需指定出父类中T的类型
class Son: public Base<int>
  • 如果不指定,编译器无法给子类分配内存
  • 如果想灵活指定出父类中T的类型,子类也需变为类模板
template<class T1>
class Son2: public Base<T1>
Son2<int> s2

总结:如果父类是类模板,子类需要指定出父类中T的数据类型

类模板成员函数类外实现

学习目标:能够掌握类模板中的成员函数类外实现

总结:类模板中成员函数类外实现时,需要加上模板参数列表

template<class T1, class T2>
void Person<T1, T2>::showPerson(){}

类模板分文件编写

学习目标:

  • 掌握类模板成员函数文件编写产生的问题以及解决方法

问题:

  • 类模板中成员函数构建时机是在调用阶段,导致分文件编写时链接不到

解决:

  • 解决方式1:直接包含.cpp源文件
  • 解决方式2:将声明和实现写在同一个文件中,并更改后缀名为.hpp,hpp是约定的名称,并不是强制

总结:主流的解决方式是第二种,将类模板成员函数写到一起,并将后缀名改为.hpp

类模板与友元

学习目标:

  • 掌握类模板配合友元函数的类内和类外实现

全局函数类内实现 - 直接在类内声明友元即可

friend void printPerson(Person<T1, T2> p){cout << "姓名:" << p.m_Name << "年龄:" << p.m_Age << endl;
}

全局函数类外实现 - 需要提前让编译器知道全局函数的存在

因为是全局函数实现,所以不需要加作用域

总结:建议全局函数做类内实现,用法简单,而且编译器可以直接识别

类模板案例

案例描述:实现一个通用的数组类,要求如下:

  • 可以对内置数据类型以及自定义数据类型的数据进行存储
  • 将数组中的数据存储到堆区
  • 构造函数中可以传入数组的容量
  • 提供对应的拷贝构造函数以及operator=防止浅拷贝问题
  • 提供尾插法和尾删法对数组中的数据进行增加和删除
  • 可以通过下标的方式访问数组中的元素
  • 可以获取数组中当前元素个数和数组的容量

在这里插入图片描述

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

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

相关文章

JS基础知识学习笔记全

JS基础知识学习笔记全 一、引入方式 1、内部脚本 &#xff08;一般定义在body下面会改善执行速度&#xff09; <body></body><!-- 内部脚本 --><script>/* 打开页面警告框显示的内容 */alert(helloJS);</script>2、外部脚本 外部专门新建一…

Nginx系列-10 realIp模块使用

背景 Nginx对每个模块都有说明文档&#xff0c;可参考:https://nginx.org/en/docs/ 当请求被代理后&#xff0c;真实客户端相对服务器被隐藏&#xff0c;即服务端无法判断HTTP消息来源。 如上图所示&#xff0c;IP分别为100.100.100.1和100.100.100.2的两个客户端向服务器200.…

TransformerEngine

文章目录 一、关于 TransformerEngine &#xff1f;亮点 二、使用示例PyTorchJAXFlax 三、安装先决条件Dockerpip从源码使用 FlashAttention-2 编译 四、突破性的变化v1.7: Padding mask definition for PyTorch 五、FP8 收敛六、集成七、其它贡献论文视频最新消息 一、关于 Tr…

traefik 2

不在白名单里的&#xff0c;就不能访问 允许谁访问&#xff0c;就把它加进来 traefik 高级应用 1. 负载均衡 关键在ingressroute 添加多个 svc 验证 就是找一台&#xff0c;配好host, 然后 两个svc 权重都是1&#xff0c;改一下就成了灰度分布 2. 灰度发布 关键在于…

立创梁山派--移植开源的SFUD和FATFS实现SPI-FLASH文件系统

本文主要是在sfud的基础上进行fatfs文件系统的移植&#xff0c;并不对sfud的移植再进行过多的讲解了哦&#xff0c;所以如果想了解sfud的移植过程&#xff0c;请参考我的另外一篇文章&#xff1a;传送门 正文开始咯 首先我们需要先准备资料准备好&#xff0c;这里对于fatfs的…

Chapter 10 Python数据容器:字符串

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、字符串的定义二、字符串的下标索引三、字符串的常用操作&#xff08;方法&#xff09;四、字符串的遍历 前言 在 Python 中&#xff0c;数据容器是组织和管理数据的…

NC 二叉树的最大深度

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 求给定二叉树…

com.mysql.cj.jdbc.Driver 爆红

出现这样的问题就是pom.xml文件中没有添加数据库依赖坐标 添加上这个依赖即可&#xff0c;添加完后重新加载一下Maven即可。 如果感觉对你有用就点个赞&#xff01;&#xff01;&#xff01;

加密货币换法拉利!BTC和ETH可买超跑,满足加密富豪需求!未来继续扩张全球市场!

全球知名的意大利豪华跑车制造商法拉利&#xff08;Ferrari&#xff09;正在跟随时代潮流&#xff0c;加速在全球范围内推广其加密货币支付系统。这一举措旨在进一步满足加密货币持有者对奢侈品的需求&#xff0c;并拥抱日益普及的数字资产。 2023年10月&#xff0c;法拉利在美…

一文掌握YOLOv1-v10

引言 YOLO目标检测算法&#xff0c;不过多介绍&#xff0c;是基于深度学习的目标检测算法中最出名、发展最好的检测器&#xff0c;没有之一。本文简要的介绍一下从YOLOv1-YOLOv10的演化过程&#xff0c;详细技术细节不过多介绍&#xff0c;只提及改进点&#xff0c;适合初学者…

美团大众点评字符验证码

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言(…

昇思MindSpore学习入门-高阶自动微分

mindspore.ops模块提供的grad和value_and_grad接口可以生成网络模型的梯度。grad计算网络梯度&#xff0c;value_and_grad同时计算网络的正向输出和梯度。本文主要介绍如何使用grad接口的主要功能&#xff0c;包括一阶、二阶求导&#xff0c;单独对输入或网络权重求导&#xff…

宠物空气净化器是不是智商税?央视推荐狗毛空气净化器分享

宠物空气净化器是不是智商税&#xff1f;是众多宠物主人在考虑是否购置宠物空气净化器时心中最大的疑问。作为呼吸科医生&#xff0c;我建议&#xff0c;在保护呼吸健康方面&#xff0c;任何投资都是值得的。特别是对于养有猫狗的家庭来说&#xff0c;宠物所带来的各种污染物和…

一次性解决 | 网站被提示“不安全 ”

当网站被提示“不安全”时&#xff0c;这通常意味着用户的个人信息、登录凭证和其他敏感数据可能面临风险。为了一次性解决这个问题&#xff0c;可以从一下方面入手。 一、检查并启用HTTPS协议 检查URL&#xff1a;确保网站地址以“https://”开头&#xff0c;而非“http://”…

HTML常见标签——超链接a标签

一、a标签简介 二、a标签属性 href属性 target属性 三、a标签的作用 利用a标签进行页面跳转 利用a标签返回页面顶部以及跳转页面指定区域 利用a标签实现文件下载 一、a标签简介 <a>标签用于做跳转、导航&#xff0c;是双标签&#xff0c;记作<a></a>&#…

【Linux C | 网络编程】进程池小文件传输的实现详解(二)

上一篇实现了一个最基本的进程池&#xff1a;客户端读取标准输入&#xff0c;发送给服务端&#xff0c;服务端回复一个相同的内容。 【Linux C | 网络编程】简易进程池的实现详解&#xff08;一&#xff09; 这篇内容在上篇进程池的基础上实现小文件的传输。 文件传输的本质…

Java 并发编程:一文了解 Java 内存模型(处理器优化、指令重排序与内存屏障的深层解析)

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 022 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

力扣高频SQL 50 题(基础版)第三题

文章目录 力扣高频SQL 50 题&#xff08;基础版&#xff09;第三题1148.文章浏览题目说明思路分析实现过程准备数据实现方式结果截图 力扣高频SQL 50 题&#xff08;基础版&#xff09;第三题 1148.文章浏览 题目说明 Views 表&#xff1a; ---------------------- | Colu…

昇思25天学习打卡营第1天|简单深度学习

前言 昇思MindSpore是一个全场景深度学习框架&#xff0c;旨在实现易开发、高效执行、全场景统一部署三大目标。 其中&#xff0c;易开发表现为API友好、调试难度低&#xff1b;高效执行包括计算效率、数据预处理效率和分布式训练效率&#xff1b;全场景则指框架同时支持云、边…

数据传输安全--SSL VPN

目录 IPSEC在Client to LAN场景下比较吃力的表现 SSL VPV SSL VPN优势 SSL协议 SSL所在层次 SSL工作原理 SSL握手协议、SSL密码变化协议、SSL警告协议三个协议作用 工作过程 1、进行TCP三次握手、建立网络连接会话 2、客户端先发送Client HELLO包&#xff0c;下图是包…