学习笔记—C++—模板初阶

目录

模板初阶

泛型编程

函数模板

模版概念

函数模版格式

模版的原理

函数模板的实例化

模版参数的匹配规则

类模板


模板初阶

泛型编程

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

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

加对应的函数。

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

如果在C++中,也能够存在这样一个模具,通过给这个模具中填充不同材料(类型),来获得不同

材料的铸件(即生成具体类型的代码),那将会节省许多头发。巧的是前人早已将树栽好,我们只

需在此乘凉。

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。

void Swap(int& left, int& right)
{int c = left;left = right;right = c;
}void Swap(double& left, double& right)
{double c = left;left = right;right = c;
}void Swap(char& left, char& right)
{char c = left;left = right;right = c;
}

函数模板

模版概念

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

函数模版格式

template<typename T1, typename T2,…,typename Tn>返回值类型 函数名(参数列表){}

下面是一个交换函数的模版,可以对不同的类型进行一个交换的操作

template<typename T>
void Swap(T& left, T& right)//针对广泛的类型
{T temp = left;left = right;right = temp;
}
int main()
{int x = 0, y = 1;double m = 1.1, n = 2.2;//通过模版就很方便了//调用的其实还是两个函数Swap(x, y);Swap(m, n);return 0;
}
注意: typename 用来定义模板参数 关键字 也可以使用 class( 切记:不能使用 struct 代替
class)。

模版的原理

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。

所以其实模板就是将本来应该我们做的重复的事情交给了编译器。

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

函数模板的实例化

编译器通过模版生成对应的函数叫做实例化操作

实例化分为两种,一种叫做隐式实例化,一种叫做显式实例化

如果我们传的是两个类型不一样的数据的话是会报错的,但是我们可以通过增加多个模版参数来进行不同类型数据的交换的

template<class T>
T Add(const T& left, const T& right)
{return left + right;
}template<class T>
T* Func(size_t n)
{return new T[n];
}int main()
{int a1 = 10, a2 = 20;double c1 = 10.1, c2 = 20.1;//自动推倒类型   隐式实例化Add(a1, a2);Add(c1, c2);cout << Add(a1, (int)c2) << endl;cout << Add(c1, (double)a2) << endl;//显示实例化cout << Add<int>(a1, c2) << endl;cout << Add<double>(c1, a2) << endl;Func<int>(10);Func<double>(20);return 0;
}

模版参数的匹配规则

● 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数。

● 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板。

● 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换。

int Add(int left, int right)
{return left + right;
}template<class T>
T Add(T left,T right)
{return (left + right)*5;
}template<class T1,class T2>
T1 Add(T1 left,T2 right)
{return(left+right)*10
}int main()
{cout << Add(1, 2) << endl;       //调用一cout << Add<int>(1, 2) << endl;  //调用二cout << Add(1.1, 2.2) << endl;   //不匹配一,直接调用二cout << Add(1, 2.2) << endl;     //调用三 return 0;
}

类模板

template<class T1, class T2, ..., class Tn>
class 类模板名
{// 类内成员定义
};
// 类模板
template<typename T>
class Stack
{
public:Stack(size_t capacity = 4){_array = new T[capacity];_capacity = capacity;_size = 0;}void Push(const T& data);private:T* _array;size_t _capacity;size_t _size;
};// 声明和定义分离的写法
template<class T>
void Stack<T>::Push(const T& data)
{// ..._array[_size++] = data;
}int main()
{// 实例化生成对应的类,这里是两个不同的类型Stack<int> st1;		// intStack<double> st2;  // double// Stack是类名,Stack<int>才是类型Stack<char> st3;return 0;
}

模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误。

只有在类里面我们才能使用这个T,出了这个类就不作数了。

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

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

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

相关文章

Docker 中多个容器之间的通信

在 Docker 中&#xff0c;多个容器之间的通信可以通过以下几种主要方式实现&#xff0c;具体选择取决于网络需求、隔离性及管理复杂度&#xff1a; 一、自定义 Bridge 网络&#xff08;推荐&#xff09; 通过创建自定义的 Docker 网络&#xff0c;容器可以加入同一网络并通过容…

Day1-初次接触UFS

经过导师初次介绍&#xff0c;了解工作以芯片测试为主&#xff0c;需坚持学习&#xff0c;小白大致需3-6月入门。整体学习应分为3大块&#xff0c;UFS协议占40%&#xff08;3-4h&#xff09;,C技能占40%&#xff08;3-4h&#xff09;,工具或业务占20%&#xff08;1-2h&#xff…

【LeetCode 热题100】二叉树构造题精讲:前序 + 中序建树 有序数组构造 BST(力扣105 / 108)(Go语言版)

&#x1f331; 二叉树构造题精讲&#xff1a;前序 中序建树 & 有序数组构造 BST 本文围绕二叉树的两类构造类题目展开解析&#xff1a; 从前序与中序遍历序列构造二叉树 将有序数组转换为二叉搜索树 我们将从「已知遍历构造树」和「平衡构造 BST」两个角度&#xff0c;拆…

JMeter重要的是什么

重要特性 支持多种协议&#xff1a; JMeter支持对多种协议进行性能测试&#xff0c;包括HTTP、HTTPS、FTP、JDBC&#xff08;数据库&#xff09;、LDAP、JMS、SOAP、REST等。这使得它能够适应各种不同的测试场景。强大的负载模拟能力&#xff1a; JMeter能够模拟大量的虚拟用户…

一文读懂WPF系列之MVVM

WPF MVVM 什么是MVVMWPF为何使用MVVM机制WPFMVVM 的实现手段 INotifyPropertyChanged​数据绑定的源端通知​​原理 PropertyChanged事件双向绑定的完整条件常见疑惑问题 什么是MVVM 翻译全称就是 model-view-viewmodel 3部分内容 以wpf的概念角度来解释就是 数据库数据源模型…

OCR API识别对比

OCR 识别DEMO OCR识别 demo 文档由来 最开始想使用百度开源的 paddlepaddle大模型 研究了几天&#xff0c;发现表格识别会跨行&#xff0c;手写识别的也不很准确。最终还是得使用现成提供的api。。 文档说明 三个体验下来 腾讯的识别度比较高&#xff0c;不论是手写还是识别表…

嵌入式MCU常用模块

日后填坑。 无线通信模块 2.4G 基本介绍 以NRF24L01为例。 NRF24L01是一款2.4GHz的无线收发模块&#xff0c;支持SPI通信协议&#xff0c;具有低功耗、高数据速率&#xff08;250kbps-2Mbps&#xff09;和多设备通信能力。 它可以同时与最多6个其他模块通信&#xff0c;适合…

记一次InternVL3- 2B 8B的部署测验日志

测试效果&#xff1a; 问题和耗时如图 5、资源占用 不释放资源会一直涨显存。总体还算满意&#xff0c;我试了好多个图理解大模型&#xff0c;就属它牛一点 附图一张 补充&#xff0c;测试InternVL3-2B的结果 1、模型下载魔搭社区 2、运行环境&#xff1a; 1、硬件 RTX 30…

Java版本对应关系表

Java版本对应关系表 以下Java主要版本&#xff08;Major Version&#xff09;与公开大版本号的对应关系 公开大版本名称Major 版本号内部版本号格式示例&#xff08;java -version输出&#xff09;Java 8 (1.8)52 (0x34)1.8.0_XXX1.8.0_301Java 953 (0x35)9.0.X9.0.4Java 105…

2025最新版flink2.0.0安装教程(保姆级)

Flink支持多种安装模式。 local&#xff08;本地&#xff09;——本地模式 standalone——独立模式&#xff0c;Flink自带集群&#xff0c;开发测试环境使用 standaloneHA—独立集群高可用模式&#xff0c;Flink自带集群&#xff0c;开发测试环境使用 yarn——计算资源统一…

android11 配置默认电池优化白名单

目录 1.介绍 2.读取配置文件 3.默认配置一个白名单列表 1.介绍 在 Android 11 中,DeviceIdleController 是负责控制设备进入 Doze 模式(闲置模式) 的核心系统服务,其内部方法 readConfigFileLocked() 负责从配置文件中读取 Doze 模式的行为参数,包括 idle 阶段的时间间…

java中的Future的设计模式 手写一个简易的Future

案例 例如&#xff1a;今天是小妹的生日&#xff0c;需要一个蛋糕有点仪式感&#xff0c;于是去蛋糕店预定&#xff0c;预定完之后&#xff0c;店老板说蛋糕做好了&#xff0c;到时电话通知你&#xff0c;不可能在这傻傻的等着吧&#xff0c;还有其他事情要做啊&#xff0c;于…

【Redis】Redis C++使用

一、Redis的自定义网络协议 1.1 为什么可以编写出一个自定义的Redis客户端 为什么我们可以编写出一个自定义的Redis客户端&#xff1f;因为Redis公开了自己的自定义协议。而对于一些其他软件的客户端&#xff0c;我们无法编写出一个自定义的Redis客户端&#xff0c;因为他们没…

【软考系统架构设计师】软件工程知识点

1、 软件开发生命周期 软件定义时期&#xff1a;包括可行性研究和详细需求分析过程&#xff0c;任务是确定软件开发工程必须完成的总目标&#xff0c;具体分为问题定义、可行性研究、需求分析等 软件开发时期&#xff1a;软件的设计与实现&#xff0c;分为概要设计、详细设计、…

DeepSeek 与开源:肥沃土壤孕育 AI 硕果

当国产 AI DeepSeek 以其低成本推理和多模态能力在全球范围内引起轰动时&#xff0c;人们惊叹于中国技术的迅猛发展&#xff0c;却很少有人深究这一成就背后的根基。答案其实早已写在中国开源生态二十多年的发展历程中。 从倪光南院士提出“以开源打破技术垄断”的理念&#x…

职坐标:智慧城市未来发展的核心驱动力

内容概要 智慧城市的演进正以颠覆性创新重构人类生存空间&#xff0c;其发展脉络由物联网、人工智能与云计算三大技术支柱交织而成。这些技术不仅推动城市治理从经验决策转向数据驱动模式&#xff0c;更通过实时感知与智能分析&#xff0c;实现交通、能源等领域的精准调控。以…

vue复习46~90

1.小兔鲜 所有都折叠 ctrl k,ctrl0 所有都展开 ctrl k,ctrlj当前结构渲染5次 <BaseBrandItem v-for"item in 5" :key"item"><BaseBrandItem>2.scoped样式冲突 结构&#xff1a;只能有一个根元素样式&#xff1a;全局样式(默认)&#xff1…

PHP 用 workman 即时通讯,做个简版QQ

1. workman是什么 &#xff0c;一般应用在那些地方 workerman是一个高性能的PHP socket 服务器框架&#xff0c;workerman基于PHP多进程以及libevent事件轮询库&#xff0c;PHP开发者只要实现一两个接口&#xff0c;便可以开发出自己的网络应用&#xff0c;例如Rpc服务、聊天室…

【WORD】批量将doc转为docx

具体步骤进行&#xff1a; 打开Word文档&#xff0c;按下AltF11快捷键&#xff0c;打开VBA编辑器。在VBA编辑器中&#xff0c;左侧的“项目资源管理器”窗口会显示当前打开的Word文档相关项目。找到您要添加代码的文档项目&#xff08;通常以文档名称命名&#xff09;&#xf…

【免费】【实测有用】5KPlayer Windows 电脑作为 MacBook 无线扩展屏

总结&#xff1a;使用 5KPlayer 将 Windows 电脑作为 MacBook 无线扩展屏 准备工作 设备要求&#xff1a; MacBook 和 Windows 电脑需连接到同一 Wi-Fi 网络。【这里有雷&#xff1a;eduroam不会成功&#xff0c;家里的WIFI成功了&#xff0c;需要确认校园网是否可行。】确保…