C++ 模板初阶

news/2025/2/24 14:01:41/

目录

一、前言

二、正文

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/news/1574635.html

相关文章

SpringBoot3中跨域问题解决

问题 SpringBoot3 中处理跨域请求 异常 浏览器在 localhost:3000 地址请求后端 http://127.0.0.1:8080 时, 报错提示 CORS 问题. 默认使用 Get 请求正常, 其他会提示. 使用 SpringBoot 3.4.2 版本配合 SpringSecurity 配置 Access to fetch at http://127.0.0.1:8080/todo-…

【java】就近原则

在 Java 中&#xff0c;就近原则&#xff08;也称为“局部优先原则”&#xff09;是指&#xff1a;当变量或方法的名字发生冲突时&#xff0c;程序会优先使用最近定义的变量或方法。这个原则主要适用于变量、方法调用以及作用域的范围。 就近原则的核心思想 局部变量优先于成员…

FunAudioLLM:用语音大模型解锁智能语音交互的无限可能

摘要 随着人工智能技术的飞速发展&#xff0c;语音处理已成为人机交互的核心领域之一。本文将介绍 FunAudioLLM 模型家族中的两个重要成员&#xff1a;SenseVoiceSmall 和 CosyVoice2-0.5B&#xff0c;探讨它们在语音识别、语音合成和情感分析中的应用&#xff0c;并提供实用的…

MATLAB | 设置滑动窗口计算栅格数据的CV变异系数

一、变异系数 变异系数&#xff08;CV&#xff09;是衡量数据稳定性的重要指标&#xff0c;表示数据的波动程度&#xff0c;计算方式是标准差与均值的比值。在栅格数据分析中&#xff0c;较低的变异系数意味着数据变化较小、稳定性较高&#xff0c;而较高的变异系数则表明数据…

[Android] GKD v1.10.0 β1—— 开屏 及 内部信息流 广告跳过工具

[Android] GKD v1.10.0 β1—— 开屏 及 内部信息流 广告跳过工具 链接&#xff1a;https://pan.xunlei.com/s/VOJnTWH3DBPkCjYawY_PFqCxA1?pwdhngj# GKD&#xff08;详情请戳 作者项目地址&#xff09;是一款免费开源简洁多规则的自动跳过广告的软件&#xff0c;整体基于k…

CSDN博客写作教学(一):初识markdown编辑器(纯干货)

名人说&#xff1a;悟已往之不谏&#xff0c;知来者之可追。 ——《归去来兮辞》陶渊明 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、在哪里写&#xff1f;二、该怎么写&#xff1f;三、完整写作流程 很高兴…

0基础玩转python(打怪升级篇)第一章1.1安装python编辑器

第一章 新手村 1.1合适的武器 &#xff08;安装python编辑器&#xff09; 新手村位于代码大陆的东北部&#xff0c;四面环山&#xff0c;高大的城墙外坐落着一条护城河。一位少年缓步走进城内&#xff0c;看到了城内集市热闹非凡。 你叫做“阿印” 是一位勇士 当前等级o Lv 最…

mysql系列9—mysql的MVCC机制

背景 mysql提供了读未提交、读已提交、可重复读、串行化四种隔离级别&#xff0c;默认的隔离界别为可重复读。其中&#xff0c;不可重复度场景下&#xff0c;每次直接读取最新记录(即使事务未提交)&#xff1b;串行化对于所有的读写都加锁&#xff0c;因此&#xff0c;对二者不…