C++ 模板

news2024/11/28 22:49:50

1. 泛型编程

实现一个通用的交换函数,使用函数重载虽然可以实现,但是有以 下几个不好的地方:

1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函

2. 代码的可维护性比较低,一个出错可能所有的重载均出错

因此,我们可以给编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。泛型编程代码可以处理不同类型,不同结构的数据

模板是泛型编程的基础,但模板不等于泛型编程。

2. 函数模板

2.1 函数模板概念

函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

方法要通用,在实现时类型就不能具体化--类型给具体了方法只能处理该种类型其他处理不了

2.1 函数模板格式

template<typename T1, typename T2,......,typename Tn>

返回值类型 函数名(参数列表){}

举例加法模板

#include<iostream>
using namespace std;

//方法要通用,在实现时类型就不能具体化--类型给具体了方法只能处理该种类型其他处理不了
//要告诉编译器,T是一个类型
//typedef double T; 这种方式错误,实际上还是double类型

//定义一个ADD模板
template<typename T>
T Add(const T& left, const T& right) 
{
    cout << typeid(T).name() << endl;
    return left + right;
}

int main()
{
    Add(10, 20);
    Add(10.2, 2.0);
    return 0;
}

注意:typename是用来定义模板参数关键字也可以使用class(但是一般不用,class定义类,不要引起歧义)

(不能使用struct代替class) 这也是二者区别之一

2.3 函数模板的原理

函数模板不是一个函数,是一个规则

  1. 在实例化之前:只是对模板进行简单的语法检测

  1. 在实例化之后:根据用户对函数模板的实例化结果来生成处理对应类型的代码,并对这些代码进行再次编译

在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此

ADD(1,2) //都为Int,认为T为int类型,则会根据模板生成处理int类型的ADD<int>函数
ADD(2.1,4.2) //都为double,认为T为double类型,则会根据模板生成处理double类型的ADD<double>函数
ADD('1','2') //都为char,认为T为char类型,则会根据模板生成处理int类型的ADD<char>函数

ADD(1,2.2) //T到底设置为int,还是double类型,编译器无法确定,解决方法如下

1.强转

ADD(1,(int)2.2)

2.增加模板

template<typename T, typename S>
  1. 对模板进行显式实例化,明确指明模板参数列表中T的实际类型

ADD<double>(1,2.2);

2.4 函数模板的实例化

显式实例化:在函数名后的<>中指定模板参数的实际类型

显式实例化:明确指定了参数类表中T的实际类型,不需要推演T的类型,如上代码举例

如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错

隐式实例化:没有明确指出参数类表中T的实际类型,编译器需要推演用户传递的类型来确定模板参数列表T的类型,如2.1中代码例子

3. 类模板

3.1 类模板的定义格式

template<class T1, class T2, ..., class Tn>
class 类模板名
{
 // 类内成员定义
};
// 动态顺序表
// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具
template<class T>
class Vector
{ 
public :
 Vector(size_t capacity = 10)
 : _pData(new T[capacity])
 , _size(0)
 , _capacity(capacity)
 {}
 
 // 使用析构函数演示:在类中声明,在类外定义。
 ~Vector();
 
 void PushBack(const T& data);
 void PopBack();
 // ...
 
 size_t Size() {return _size;}
 
 T& operator[](size_t pos)
{
 assert(pos < _size);
 return _pData[pos];
 }
 
private:
 T* _pData;
 size_t _size;
 size_t _capacity;
};
// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表
template <class T>
Vector<T>::~Vector()
{
 if(_pData)
 delete[] _pData;
 _size = _capacity = 0;
}

3.2 类模板的实例化

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>

中即可,类模板名字不是真正的类,而实例化的结果才是真正的类

// Vector类名,Vector<int>才是类型
Vector<int> s1;
Vector<double> s2;

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

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

相关文章

深度剖析数据在内存中的存储(下)(适合初学者)

上篇讲解了整形在内存中的存储方式&#xff0c;这篇文章就来继续讲解浮点数在内存中的存储方式。 上篇地址&#xff1a; (5条消息) 深度剖析数据在内存中的存储&#xff08;上&#xff09;_陈大大陈的博客-CSDN博客 目录&#xff1a; 3.浮点型在内存中的存储 3.1.浮点数的…

【Windows Server 2019】发布服务器 | 远程桌面服务的安装与配置 Ⅱ——配置RemoteAPP和访问

目录4. 配置RemoteAPP4.2 设置要发布的APP4.1 如何找到访问链接5. 访问发布的RemoteAPP关联博文4. 配置RemoteAPP 4.2 设置要发布的APP &#xff08;1&#xff09;返回【Server Manager】&#xff0c;在左侧的菜单栏中找到【Remote Desktop Services】。 &#xff08;2&#…

jupyter notebook小技巧

1、.ipynb 文件转word文档 将 jupyter notebook&#xff08;.ipynb 文件&#xff09;转换为 word 文件&#xff08;.docx&#xff09;的最简单方法是使用 pandoc。 首先安装pip install pandoc&#xff0c; 安装后&#xff0c;在将 Jupyter notebook文件目录cmd 然后输入打开…

ChatGPT 的盈利潜力:我使用语言模型赚取第一笔钱的个人旅程

使用 Fiverr、Python ChatGPT 和数据科学赚钱的指南。众所周知&#xff0c;ChatGPT 是 12 月发生的互联网突破性事件&#xff0c;几乎每个人都跳过了使用 AI 赚钱的潮流。在本文中&#xff0c;我将分享我是如何使用 ChatGPT 赚到第一笔钱的。本文包括以下主题&#xff1a;回到基…

深入理解Golang 中的Context包

context.Context是Go语言中独特的设计&#xff0c;在其他编程语言中我们很少见到类似的概念。context.Context深度支持Golang的高并发。 1.Goroutine 和channel。 在理解context包之前&#xff0c;应该首先熟悉Goroutine和Channel&#xff0c;能加深对context的理解。 1.1 Goro…

苹果设计可变色Apple Watch表带,智能穿戴玩法多

苹果最新技术专利显示&#xff0c;苹果正在为 Apple Watch 设计一款可变色的表带&#xff0c;可以根据佩戴者所穿着的服装、所在的环境等自动改变颜色。据介绍&#xff0c;这款表带里的灯丝具有电致变色功能&#xff0c;可以通过施加不同的电压&#xff0c;来实现显示多种颜色或…

C++之类与对象(上)

目录 一、类的定义 二.类的访问限定及封装 1.访问限定 2.封装 三.类的作用域和实例化 2.类的实例化 四.类的对象大小的计算 1.类成员存储方式 2.结构体内存对齐规则 五.类成员函数的this指针 1.this指针的引出 2.this指针的特性 3.C语言和C实现Stack的对比 一、类的定义 class …

Linux的kdump分析

文章目录一 系统环境二 下载和安装kerner-debuginfo三 启动crash四 crash常用命令一 系统环境 进行kdump分析的主机是CentOS-7.9系统。 [rootcanway ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootcanway ~]# uname -r 3.10.0-1160.el7.x86_64检查…

智慧新零售网络解决方案,助力新零售企业数智化转型

随着数字化时代的不断发展&#xff0c;新零售连锁业务模式“线上线下”融合发展&#xff0c;数据、设备在逐渐增加&#xff0c;门店数量也会随着企业规模的扩大而增加&#xff0c;但由于传统网络架构不稳定、延时、容量小影响服务质量&#xff08;QoS&#xff09;、分支设备数量…

【java】Spring Cloud --Spring Cloud Alibaba 教程

文章目录Spring Cloud Alibaba是什么Spring Cloud AlibabaSpring Cloud Alibaba 组件Spring Cloud Alibaba 的应用场景Spring Cloud 两代实现组件对比Spring Cloud Alibaba 版本依赖Spring Cloud Alibaba 组件版本关系Spring Cloud Alibaba NacosNacos 的特性服务发现服务健康监…

写博客有哪些好用的工具和软件?

写博客有哪些好用的工具和软件&#xff1f; 在各种平台上写文章&#xff0c;要有一个好用的编辑器&#xff0c;使用简单方便、不用花很多时间排版、能预览效果等。此外&#xff0c;文章还需要配图片、动图和视频等&#xff0c;所以需要好用的截图软件、视频录制和剪辑软件。 …

ME1M 报表Layout调整

众所周知&#xff0c;SAP的许多报表都可以选择以ALV的格式输出&#xff0c;ALV格式界面友好&#xff0c;业务人员可以按照自己的需求去调整报表输出格式&#xff0c;同时也方便导出到本地文件。大多数报表的选择界面上都有一个字段scope of list, 将其改成ALV&#xff1a; 偏偏…

该学会是自己找bug了(vs调试技巧)

前言 &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言初阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:介绍c语言初阶的最后一篇.有关调试的重要性. 金句分享…

Linux基本介绍与常用操作指令

参考链接&#xff1a; Linux面试必备20个常用命令_无 羡ღ的博客-CSDN博客_linux常用命令 1. Linux简介 Linux是一个支持多用户、多任务、多线程和多CPU的操作系统&#xff0c;特点是免费、稳定、高效&#xff0c; 一般运行在大型服务器上。 1.1 常用目录简介 /&#xff1a;根目…

【storybook】你需要一款能在独立环境下开发组件并生成可视化控件文档的框架吗?(一)

storybook介绍入门说说用法prop-types.stories.jsx介绍 你肯定用过ant-design或者elemenUI中的一款UI组件库&#xff0c; 你肯定打开过它们的官网&#xff0c; 你是否好奇过&#xff0c;页面上展示的案例&#xff0c; 你为啥可以操作&#xff0c;还能查看源码供你CV?它们是…

Docker之路(6.docker容器数据卷、具名挂载匿名挂载、权限挂载)

1. 什么是容器数据卷 如果数据都在容器中&#xff0c;那么容器删除后&#xff0c;数据就会丢失&#xff01; 所以希望容器的数据能够存到本地 容器之间可以又一个数据共享的技术&#xff01; Docker容器中产生的数据&#xff0c;可以同步到本地&#xff0c;这就是卷技术。 就是…

Nacos Ignore the empty nacos configuration and get it based on dataId

1.配置错误 dataId问题 启动日志&#xff1a; 使用properties格式的文件&#xff1a; Ignore the empty nacos configuration and get it based on dataId[xxx-server] & group[DEFAULT_GROUP] Ignore the empty nacos configuration and get it based on dataId[xxx-s…

【Redis中bigkey你了解吗?bigkey的危害?】

一.Redis中bigkey你了解吗&#xff1f;bigkey的危害&#xff1f; 如果面试官问到了这个问题&#xff0c;不必惊慌&#xff0c;接下来我们从什么是bigkey&#xff1f;bigkey划分的类型&#xff1f;bigkey危害之处&#xff1f; 二.什么是bigkey&#xff1f;会有什么影响&#xff…

九头蛇hydra爆破http示例

使用hydra执行http表单暴力破解 通过浏览器自带分析得知: 提交地址:http://10.0.0.115/student_attendance/ajax.php?action=login 提交方式:POST 提交数据:username=a&password=a 服务响应:3 根据以上收集的信息就可以使用hydra进行密码爆破 hydra 10.0.0.115 http…

【第一章:Spring概述、特点、IOC容器、IOC操作bean管理(基于xml方式创建对象,注入属性)】

第一章&#xff1a;Spring概述、特点、IOC容器、IOC操作bean管理&#xff08;基于xml方式创建对象&#xff0c;注入属性&#xff09; 1.Spring是什么&#xff1f; ①Spring是一款主流的java EE 轻量级开源框架。 ②广义的Spring&#xff1a;Spring技术栈&#xff0c;Spring不再…