C++ 模板初阶

embedded/2025/2/24 8:33:46/

目录

一、前言

二、正文

1、函数模板 

1.1函数模板概念

1.2函数模板格式

1.3函数模板的原理

1.4函数模板的实例化

1.5模板参数的匹配原则

2.类模板

2.1类模板的定义格式

2.2类模板函数化 

3.template与typedef的区别

三、结言


一、前言

据说C++创建初期,很多人是对C++这一门新型语言是不感冒的,因为他们认为C++和C语言并没有明确的区别,当C++推出—模板,这一功能的时候才被更多人认可。今天我们将要学习的就是模板中的初阶部分。

二、正文

当我们想要实现将多个数据类型的变量进行交换,我们该如何操作呢,是写多个Swap交换函数?这样就显得很冗余。

这个时候就需要借助我们的模板功能了,我们可以创建一个通用的模板函数,让他适应所有类型的数据。

 

你是什么类型数据,我就给你生成是什么数据类型的函数。

1、函数模板 

1.1函数模板概念

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

1.2函数模板格式

template<typename T1,typename T2......> 或者template<calss T1,class T2......>。

值得注意的是:标号1必须和标号1下面的函数搭配使用才是模板函数,不然就会报错。

如上图所示可知,template<typename T1,typename T2......>必须和函数搭配起来使用。

1.3函数模板的原理

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

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

(大家放心使用,上面的图片是我扣我学习课件上的)

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

1.4函数模板的实例化

用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。

上面这个情况我们在不改变模板函数的情况下,该如何正常运行呢?

我们可以通过强制隐式类型转换或者显式实例化来解决这个问腿。

1.5模板参数的匹配原则

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

  • 2.对于非模板函数和同名函数模板,如果其他条件相同,在调用时会优先调用非函数模板函数而不会从函数模板中生成出一个实例。如果模板可以生成一个具有更好匹配的函数,那么将选择函数模板来生成一个实例,以便更好的满足实际需要。

  • 3.模板函数不允许自动类型转换,但普通函数可以自动类型转换。

2.类模板

2.1类模板的定义格式

#include<iostream>
using namespace std;
//类模板
template<class T>
class stack  //stack是类名
{
public:stack(int capacity = 4){_array = new T[capacity];_capacity = capacity;_size = 0;}void Push(const T& data){//扩容_array[_size] = data;++_size;}
private:T* _array;int _capacity;int _size;
};int main()
{stack<int > st1;//栈存储的是int类型stack<double> st2;//栈存储的是double类型return 0;
}

2.2类模板函数化 

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

3.template与typedef的区别

看到前面大家可能感觉template与我们之前学习的typedef有点相似,都是想将A在后文中都被替代成B。

例如typedef int typedata。在后续代码中所有的typdata都是int。

但是template与typedef还是有所区别的,typedef只能针对一个函数,而template则可以针对所有类型的数据生成相对应的函数。

例如上面就是template函数的优势,只要写出了类模板函数,我们既可以生成存储int类型德栈,也可以生成double类型的栈。

而typedef则不能达到这个效果,它只能正对某个特定的函数,我们想改变其栈存储的类型,还得手动改变其类型。

三、结言

今天的模板初阶就分享到这了,同学们我们下期再见~

 


http://www.ppmy.cn/embedded/164793.html

相关文章

go 查看版本

个人学习笔记 1. 打开终端&#xff08;或命令提示符&#xff09; 在 Windows 上&#xff0c;使用 cmd 或 PowerShell。在 macOS 或 Linux 上&#xff0c;使用终端应用程序。 2. 运行以下命令 go version 3. 查看输出 命令执行后&#xff0c;终端会显示已安装的 Go 版本&…

Python pip 缓存清理:全面方法与操作指南

在使用 Python 的 pip 进行包安装时&#xff0c;pip 会将下载的包缓存起来&#xff0c;以加快后续相同包的安装速度。不过&#xff0c;随着时间推移&#xff0c;缓存会占用大量磁盘空间&#xff0c;这时你可以对其进行清理。下面为你介绍不同操作系统下清理 pip 缓存的方法。 …

AI发展迅速,是否还有学习前端的必要性?

今天有个小伙伴跟我讨论&#xff1a;“现在 AI 发展迅速&#xff0c;是否还有学习 JS 或者 TS 及前端知识的必要&#xff1f;” 我非常肯定地说&#xff1a; 是的&#xff0c;学习 JavaScript/TypeScript 以及前端知识仍然非常必要&#xff0c;而且在可预见的未来&#xff0c;…

玩转 Java 与 Python 交互,JEP 库来助力

文章目录 玩转 Java 与 Python 交互&#xff0c;JEP 库来助力一、背景介绍二、JEP 库是什么&#xff1f;三、如何安装 JEP 库&#xff1f;四、JEP 库的简单使用方法五、JEP 库的实际应用场景场景 1&#xff1a;数据处理场景 2&#xff1a;机器学习场景 3&#xff1a;科学计算场…

基于计算机视觉的手势识别:让机器理解我们的手势语言

友友们好! 我的新专栏《Python进阶》正式启动啦!这是一个专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会找到: ● 深入解析:每一篇文章都将…

【CI/CD】CI/CD环境搭建流程和持续集成环境配置

文章目录 CI/CD环境搭建流程一、GitLab 安装与配置1. 环境准备2. 安装依赖3. 下载安装GitLab4. 修改配置5. 应用配置并启动6. 初始化设置 二、GitLab 项目管理1. 创建群组与项目2. 用户管理3. 上传代码 三、Jenkins 安装与配置1. 安装JDK172. 安装Jenkins3. 修改配置4. 启动服务…

系统思考—结构影响行为

最近和一些客户交流&#xff0c;发现越来越多的组织&#xff0c;特别是那些成长中的企业&#xff0c;正在深陷一种看似无法突破的恶性循环。而这个问题的根源&#xff0c;往往并不在个人的能力上&#xff0c;而是深藏在组织结构的设计上。 比如&#xff0c;每当遇到重大决策时…

MATLAB在投资组合优化中的应用:从基础理论到实践

引言 投资组合优化是现代金融理论中的核心问题之一&#xff0c;旨在通过合理配置资产&#xff0c;实现风险与收益的最佳平衡。MATLAB凭借其强大的数学计算能力和丰富的金融工具箱&#xff0c;成为投资组合优化的理想工具。本文将详细介绍如何使用MATLAB进行投资组合优化&#…