c++之旅第九弹——模版

大家好啊,这里是c++之旅第九弹,跟随我的步伐来开始这一篇的学习吧!

如果有知识性错误,欢迎各位指正!!一起加油!!

创作不易,希望大家多多支持哦!

一.模版的概念:

1.泛型编程:

编写逻辑代码,适用于多种数据类型。

2.模版:

通过将类型定义为参数,实现了代码的重用性,即实现泛型编程。

二.函数模版:

1.函数模版不是实体函数,编译器不会对一个函数模板生成可执行代码;这只是一个函数功能的框架描述,只有在调用时有了具体的类型,生成了模版函数时才会生成可执行代码。

template:模板的关键字

<> :类型的参数列表

typename:用来声明类型参数,也可以用 class

2.函数模版使用:

int a=1,b=2;
char c='x';
​
template<typename T>//单类型
void fun(T &a,T &b)//&不是必须的格式
{
cout<<a<<endl<<b<<endl;
}
​
template <typename T1,typename T2>//双类型定义方式
void fun(T1 &a, T2 &b)

(1)、隐式推导类型:调用fun(a,b);正确 调用fun(a,c);错误,因为函数模板不会有隐式转换

(2)、显示指定类型:调用fun<int>(a,b);正确 调用fun<int>(a,c);也是正确的,因为显式指定类型后就生成了对应类型的实体函数,和普通函数一样,普通函数在编译器下可以进行可转换参数的转换,故此时也是正确的。//双类型的显式指定类型:fun<char, int>('a', 97);

(3)、函数模版类型参数列表中写普通形参就只能显式推导写法调用,eg:fun<int, 10>(12);不过一般这种写法不用于函数模版,因为可以将普通形参直接写在函数参数列表中,一般使用于类模板中。

3.函数模版和普通函数的区别:

(1)、函数模板和普通函数一样都是可以重载的,函数模板与普通函数也能构成重载

(2)、如果出现了函数模板与普通函数之间的重载,两者均满足时优先调用普通函数

(3)、如果函数模板可以产生一个更好的匹配,那么选择调用模板函数

(4) 、想要强制使用模板,那么就可以使用显式指定类型调用

4.函数模版的局限性:

eg:

template<typename T>
void fun(T &a,T &b)
{
cout<<a<<endl<<b<<endl;
}

若想使用该模版函数,但是传入的类型为自定义类类型,这样这个函数就无法执行了。

解决方式:

重载一个具体类型的函数来解决这个问题,Person 为自定义类型,其中有一个可以访问到的 x 成员

template<>void fun<Person>(Person&a,Person&b)
{
cout<<a.x<<endl<<b.x<<endl;
}

三.类模版:

1.类模板与函数模板类似,也不是一个实体的类,理解为一个类型的框架,所以类模板也需要生成具体的模板类,才能定义对象。

(1)写法1(只有类型参数):

template<typename T1 ,typename T2>class 类模板名{成员函数和变量 ;}

T1,T2 看作为类型的参数,在类中使用

(2)写法2(在类型参数列表中有形参):(eg:栈的实现)

template <class T,int maxSize>
class CMyStack  //自定义顺序栈
{T buff[maxSize];int top;
public:CMyStack(){top = 0;}void push(T const& elem){buff[top++] = elem;}void pop(){top--;}T getTop() const{return buff[top - 1];}bool empty() const{return top == 0;}
};
CMyStack<int, 10> ms;//生成模板类后定义对象

2.类模板作为函数参数

(1)、做为函数的传入实参

void doWork(Person<string,int>& p){}

(2)、参数模板化

template<class T1,class T2>void doWork(Person<T1,T2> &p){}

(3)、整体模板化

template<class T>void doWork(T& p){}

3.类模板一般用于写数据结构类型,如数组,栈等。

4.类模板注意事项:

(1)类模板中成员函数要写在和类同一个头文件中类外的部分,不写到.cpp文件中

原因:因为.cpp文件是会参与编译的,而类模板在写的时候没有已知类型,故写在.cpp文件中的类中函数定义无法参与编译,也就相当于没有函数定义了;就算定义了一个模板类确定了类型,调用时写在.cpp文件中的函数体也不作数,使用时依然会报错(尝试得出),所以只有两种写法:直接定义在类中或者写在和类同一个头文件中的类外部分。

(2)template的类型参数T可以直接表示指针类型,但这样使用时会增加使用数据的不便,因为每次使用数据时都必须解引用进行操作,相对于普通类型(如int)的直接使用方式更加繁琐,所以一般也不会这样进行类型参数的使用。

(3)类模板继承情况:

①普通类的派生类为类模板情况:

class CA
{
};
template <class T>
class CB : public CA
{
};

②类模板的派生类新定义普通数据,但该派生类仍为类模板:

template <class T>
class CD
{   
T d;
};
template <class T>
class CE : public CD<T>
{   
int e;
};

③两者均包含的是模版:

template <class T1,class T2>
class CF : public CD<T1>
{T2 f;
};

(4)函数模版有显式和隐式推导,类模版只有显式推导;

模版函数和模版类在生成相对应实体或进行使用之前是不会报出函数模版和类模版的书写错误的(即实体化后才会保错),因为不参与编译。

5.类模板使用场景:

(1)泛型编程,是一种编写通用代码逻辑的方法,使其能够适用于多种数据类型。通过使用模板,我们可以定义通用的数据结构(如数组、链表、栈、队列等)和算法(如排序、查找、遍历等),从而处理不同类型的数据。

(2)C++标准库中的容器类库(如vector、list、map等)也是使用模板实现的。这些容器类模板允许存储和操作各种类型的数据,提供了方便、高效且类型安全的数据结构。 (3)另外,C++标准库中的迭代器也是通过模板实现的。迭代器模板允许对容器中的数据进行遍历和访问,而无需关心具体的容器类型。使用迭代器模板可以提供一种通用的访问方式,使得不同类型的容器可以以统一的方式进行操作。

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

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

相关文章

ORB-SLAM3整体流程详解

0. 简介 在之前&#xff0c;作者曾经转过一篇《一文详解ORB-SLAM3》的文章。那篇文章中提到了ORB-SLAM3是一个支持视觉、视觉加惯导、混合地图的SLAM系统&#xff0c;可以在单目&#xff0c;双目和RGB-D相机上利用针孔或者鱼眼模型运行。与ORB-SLAM2相比&#xff0c;ORB-SLAM3…

qiankun框架中基于actions机制实现主应用与子应用间的双向通信

文章目录 一、原理1、setGlobalState&#xff1a;2、onGlobalStateChange&#xff1a;3、offGlobalStateChange&#xff1a;4、图解 二、示例主应用1、在父应用中使用initGlobalState设置全局状态actions并导出供其他组件使用。2、在main.js中引入actions实例并在注册子应用时通…

Ubuntu20.04安装ROS过程记录以及常见报错处理

官网安装步骤如下&#xff1a; http://wiki.ros.org/cn/noetic/Installation/Ubuntu#A.2BXwBZy1uJiMU- 第一个&#xff1a;添加ROS软件源 sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-la…

中位数和众数-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第49讲。 中位数和众数&…

逆向入门:为CTF国赛而战day05day06

用的汉化版的 昨天做了一道题目&#xff0c;然后下了那个apkide改之理,就没了 今天再来一题。 我发现&#xff1a;ascii表要好好学。这里#号是35就被写到题目里去了。 CTF reverse 不一样的flag_ctf reverse flag.bin-CSDN博客

linux下如何查看防火墙状态

systemctl status firewalld (看防火墙进程) cat /etc/selinux/config (看是否启用linux安全模式)

最新版两款不同版SEO超级外链工具PHP源码

可根据个人感觉喜好自行任意选择不同版本使用&#xff08;版V1或版V2&#xff09; 请将zip文件全部解压缩即可访问&#xff01; 源码全部开源&#xff0c;支持上传二级目录访问 #已更新增加大量高质量外链&#xff08;若需要增加修改其他外链请打开txt文件&#xff09; #修…

设计模式学习笔记 - 设计模式与范式 -行为型:9.迭代器模式(上):相比直接遍历集合数据,使用迭代器模式有哪些优势?

概述 上篇文章&#xff0c;我们学习了状态模式。状态模式是状态机的一种实现方式。它通过将事件触发的状态转移和动作执行&#xff0c;拆分到不同的状态类中&#xff0c;以此来避免状态机类中的分支判断逻辑&#xff0c;应对状态机类代码的复杂性。 本章&#xff0c;学习另外…

day02 VS Code开发单片机

VS Code开发单片机 1.1 安装 MinGW-w64 1)MinGW-w64介绍 VS Code 用于编辑 C 代码,我们还需要 C 编译器来运行 C 代码,所以安装 VS Code之前我们需要先安装 C 编译器。这里我们使用 MinGW-w64(Minimalist GNU for Windows 64-bit)。 MinGW-w64 是一个用于Windows操作系…

B站自研新一代视频编码器 BILIAV1

1. AV1 视频编码标准介绍 AV1是开放媒体联盟&#xff08;AOM&#xff0c; Alliance for Open Media&#xff09;开发的第一代开放&#xff0c;免版税的视频编码标准。AV1于 2018 年 3 月定稿&#xff0c;相同画质下&#xff0c;码率比 H.265/HEVC 低 20% 左右。经过 Google、N…

【打印SQL执行日志】⭐️Mybatis-Plus通过配置在控制台打印执行日志

目录 前言 一、Mybatis-Plus 开启日志的方式 二、测试 三、日志分析 章末 前言 小伙伴们大家好&#xff0c;相信大家平时在处理问题时都有各自的方式&#xff0c;最常用以及最好用的感觉还是断点调试&#xff0c;但是涉及到操作数据库的执行时&#xff0c;默认的话在控制台…

idea中输入法被锁定如何清除

今天遇到一个问题&#xff1f;idea中输入法被锁定了&#xff0c;无论怎么切换输入法&#xff0c;切换中英文&#xff0c;在idea中输出的均为英文内容&#xff0c;该如何解决呢&#xff1f;&#xff08;idea官网&#xff1a;JetBrains: 软件开发者和团队的必备工具&#xff09; …

Java常用API_正则表达式_分组——捕获分组与非捕获分组介绍与练习

在正则表达式中&#xff0c;从左到右第一个左括号确定为第一组&#xff0c;继续往右看再有左括号它表示的组数就加一。我们可以在正则表达式中使用 \\组数 的方法表示第几组&#xff0c;如\\1表示第一组的内容。 1.捕获分组 捕获分组就是把这一组的数据捕获出来&#xff0c;后…

SpringBoot和Vue2项目配置https协议

1、SpringBoot项目 ① 去你自己的云申请并下载好相关文件&#xff0c;SpringBoot下载的是Tomcat&#xff08;默认&#xff09;&#xff0c;Vue2下载的是Nginx ② 将下载的压缩包里面的.pfx后缀文件拷贝到项目的resources目录下 ③ 编辑配置文件 &#xff08;主要是框里面的内…

基于wsl的Ubuntu20.04上安装桌面环境

在子系统Ubuntu20.04上安装桌面环境 1. 更换软件源 由于Ubuntu默认的软件源在国外&#xff0c;有时候后可能会造成下载软件卡顿&#xff0c;这里我们更换为国内的阿里云源&#xff0c;其他国内源亦可。 双击打开Ubuntu20.04 LTS图标&#xff0c;在命令行中输入 # 备份原来的软…

创意解决方案:如何将作品集视频集中于一个二维码或链接中?

引言&#xff1a;随着面试环节的进一步数字化&#xff0c;展示自己的作品集成为了求职过程中的重要一环。但除了使用传统的方式&#xff0c;如百度网盘或直接发送多个视频链接&#xff0c;有没有更便捷的方法将作品集的多个视频放在一个链接中呢? 本文将介绍一种创意解决方案…

探索未知,守护已知:天通野外摄像机PS02——生物识别保护的新前沿

随着全球生态环境的日益恶化和野生动物种群数量的不断减少&#xff0c;生物多样性保护已经成为全球性的紧迫议题。在这一背景下&#xff0c;野外无人值守卫星图传监测站的应用&#xff0c;特别是在生物识别保护领域&#xff0c;展现出了巨大的潜力和价值。 创新的监测技术 野外…

使用 Citavi 和 NVivo 简化您的文献综述和研究分析

NVivo 是一款支持定性研究方法和混合研究方法的软件。它可以帮助您收集、整理和分析访谈、焦点小组讨论、问卷调查、音频等内容。NVivo&#xff08;1.0版&#xff09;是Windows和Mac的主要版本。遵循最新的主要版本NVivo 12&#xff08;Windows和Mac&#xff09;。 NVivo 强大…

类和对象中阶1⃣️-默认成员函数(构造函数 析构函数)

目录 1.类的6个默认成员函数 2.构造函数 2.1 概念 3.析构函数 3.1 概念 3.2 特性 1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成…

Linux安装Oracle11g(无图形界面下的静默安装)

Oracle11g安装文档-Linux静默安装 环境准备安装数据库配置监听器创建数据库测试打开防火墙 环境准备 创建组和用户 [rootlocalhost ~]# groupadd oinstall #创建oinstall组 [rootlocalhost ~]# groupadd dba  #创建dba组 [rootlocalhost ~]# useradd -g oinstall -G dba -m…