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.mzph.cn/news/807555.shtml

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

相关文章

3D开发工具HOOPS:推动汽车行业CAD可视化发展

在最近的行业对话中&#xff0c;Tech Soft 3D&#xff08;HOOPS厂商&#xff09;的Jonathan Girroir和Actify的Peter West探讨了CAD可视化在当代企业中的重要性和挑战。作为CAD可视化领域的佼佼者&#xff0c;Actify通过其广受欢迎的Spinfire应用&#xff0c;赋能了全球40多个国…

【上海大学计算机组成原理实验报告】三、微指令系统实验

一、实验目的 了解译码器、微指令结构的基本工作原理。学习设计微指令的方法。 二、实验原理 根据实验指导书的相关内容&#xff0c;本实验所用的实验箱的微指令系统控制总线宽度为24位&#xff0c;每个地址单元宽度也为24位&#xff0c;其中微指令存储器由3片8位存储器按照…

4.Spring IoCDI

文章目录 1.Ioc - 控制反转(解耦)1.1传统开发1.2批量生产车轮(修改代码) - 传统方式&#xff0c;繁琐1.3解耦1.3.1使用Ioc方法后1.3.2添加变量颜色 只需要修改Tire即可 1.4Bean的存储1.4.1Controller(控制器存储)1.4.2Service(服务存储)1.4.2.1根据context来获取bean1.4.2.2根据…

UI自动化测试详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 UI 测试是一种测试类型&#xff0c;也称为用户界面测试&#xff0c;通过该测试&#xff0c;我们…

实时计算平台设计方案:911-基于6U VPX的光纤图像DSP实时计算平台

基于6U VPX的光纤图像DSP实时计算平台 一、系统组成 该平台基于风冷式的 6U 6槽VPX图像处理平台&#xff0c;包括&#xff1a;计算机主板、计算机主板后板、存储板、图像信号处理板、图像信号处理板后板、图像光纤转接板、机箱背板及机箱组成。图1为系统背板结构示意图&…

vue实现从本地上传头像功能

上传头像&#xff1a; <template><div><el-card class"box-card"><div slot"header" class"clearfix"><span>更换头像</span></div><div><!-- 图片、用来展示用户选择的头像 --><img…

四信大中型水库数字孪生调度运营解决方案,开拓管理新模式

今年来&#xff0c;水利部先后印发《关于大力推进智慧水利建设的指导意见》《智慧水利建设顶层设计》《“十四五”智慧水利建设规划》《“十四五”期间推进智慧水利建设实施方案》等系列文件&#xff0c;明确了推进智慧水利建设的主要任务。 《2024年水利工程运行管理工作要点》…

4.11总结

IO流和网络编程 IO流 IO流根据流的类型分为两种&#xff1a; 一种是输入流&#xff0c;另一种是输出流 输入流只能用来读取数据&#xff0c;输出流只能用来写入数据。 IO流存在两种操作文件类型&#xff1a; 字节流和字符流 字符流只能用于纯文本操作&#xff0c;而字节…

SOLIDWORKS特色功能介绍

SOLIDWORKS是一款功能强大的三维CAD设计软件&#xff0c;广泛应用于机械设计、工程分析、产品数据管理和仿真等多个领域。该软件以其用户友好的界面、丰富的功能和性能&#xff0c;赢得了全球数百万工程师和设计人员的青睐。接下来&#xff0c;我们将详细介绍SOLIDWORKS的一些特…

Vue前端框架

1.vue基本使用1 1.vue环境搭建 一般创建vue项目是在cmd命令中用&#xff1a;vue ui 命令&#xff0c;采用ui图形界面的方式直观创建项目。 2.vue基本使用方式&#xff1a;vue组件 3.文本插值 4.属性绑定 5.事件绑定 6.双向绑定 7.条件渲染 2.vue基本使用2 1.axios 安装axios命令…

引领车载影像革命,全链路解决方案助力座舱创新升级

影像技术的创新与突破正在引领各行各业的飞速发展&#xff0c;尤其对于汽车行业来说&#xff0c;车载影像系统已成为衡量车辆智能化水平的重要指标。为了满足这一日益增长的需求&#xff0c;美摄科技凭借深厚的研发实力与创新精神&#xff0c;推出了全链路的车载影像解决方案&a…

uniapp开发小程序,实现堆叠卡片轮播图

一、实现堆叠卡片轮播图: 需求: 实现堆叠轮播图效果堆叠到后面的图片有虚化效果可以在堆叠图片上写文字或叠加图片等效果可以手动滑动&#xff0c;也可以定时自动轮播 二、代码实现&#xff1a; 1.封装一个组件myswiper.vue <!-- 折叠轮播图 组件--> <template>…

如何在SFTP工具中使用固定公网地址远程访问内网Termux系统

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

AD23原理图导入pcb是元器件位置错乱

1、原因是原理图和PCB没有进行连接导致的&#xff0c;可通过以下方法解决&#xff1a; 1>PCB返回到初始的形态&#xff0c;不可出现报错等问题&#xff0c;选择器件连结&#xff1b; 执行快捷键C --> K&#xff0c;将所有匹配组件进行回退&#xff0c;如下图&#xff1…

【Python】类和对象

类和对象 构造方法封装继承多继承 多态 类&#xff1a; 类是一个模板&#xff0c;描述一类对象的行为和状态。 有了模板我们就可以根据这个模板创建具体的对象。 对象&#xff1a; 对象是类的一个具体实例&#xff0c;有状态和行为。 class 类名称: 类的属性类的行为 # 其中 c…

如何在公网环境远程管理内网Windows系统部署的MongoDB数据库

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 前言 MongoDB是一个基于分布式文件存储的数…

阿里面试总结 一

写了这些还是不够完整&#xff0c;阿里 字节 卷进去加班&#xff01;奥利给 ThreadLocal 线程变量存放在当前线程变量中&#xff0c;线程上下文中&#xff0c;set将变量添加到threadLocals变量中 Thread类中定义了两个ThreadLocalMap类型变量threadLocals、inheritableThrea…

数据知识产权登记前为何需要区块链存证_存储在国外的数据可以做数据资产登记证申请码

各地已公布的管理办法中&#xff0c;均把“数据区块链存证或公证”证明材料做为向各地数据知识产权登记部门提交登记申请表中必要材料之一。北京市数据知识产权登记管理办法要求&#xff1a;有下列情况之一的&#xff0c;不予登记&#xff1a;&#xff08;三&#xff09;登记前…

【SpringBoot】-- mapstruct进行类型转换时Converter实现类不能自动生成代码问题解决

问题描述 我的问题如下&#xff1a; 应该在红色区域生成对应的转换细节&#xff0c;但是这里只返回了一个空对象 问题解决 加入lombok-mapstruct-binding依赖,也要注意依赖引用顺序问题 <dependency><groupId>org.projectlombok</groupId><artifactId&…

uniapp项目引入组件

1、在项目新建文件uni_modules 2、通过uniapp官网查找组件 uni-app官网 3、下载组件 4、将下载好的组件放到步骤1创建的uni_modules目录下 5、在hbuilderX中重新运行小程序