【C++】模版初阶---函数模版、类模版

🌟个人主页:第七序章  

🌈专栏系列:C++

目录

❄️前言:

🌈1.泛型编程:

🌈2.函数模板

🍭2.1函数模板概念

🍭2.2函数模板格式

🍭2.3 函数模板的原理

🍭2.4 函数模板的实例化

🍭2.5 函数模版的匹配原则

🌈3. 类模板

🍭3.1 类模板的定义格式

🍭3.2 类模板的实例化

🌈4.关键问题

🍉问题 1:

🍉问题 2:

🍉问题 3:

🌻共勉:


❄️前言:

上一篇我们学习了C/C++的内存管理,今天我们来学习一下C++的函数模板和类模板。

🌈1.泛型编程:

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

🥝template 模版关键字
template< class T>
template< typename T>
🥝模版参数传递的是类型;函数参数传递的是对象值。
🥝模版的定义和声明不支持分别在两个文件里面【会出现链接错误,所有的链接错误都是符号表找不到】因为编译器的模版T是无法确定的,无法生成符号表。
🥝模版是不支持声明与定义分别放到.h和.cpp中,一般都是需要放到一个文件中。有些地方就会命名成.hpp【头文件和定义实现内容合并到一起】但是并不是必须是.hpp,.h也是可以的。

🌈2.函数模板

🍭2.1函数模板概念

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

🍭2.2函数模板格式

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

template<typename T>
void Swap( T& left,  T& right)
{T temp = left;left = right;right = temp;
}

🥝注意: typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

🍭2.3 函数模板的原理

🥝在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供 调用。

🥝比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码, 对于字符类型也是如此

🍭2.4 函数模板的实例化

  1. 隐式实例化:让编译器根据实参推演模板参数的实际类型
  2. 显式实例化:在函数名后的<>中指定模板参数的实际类型
int main(void)
{int a = 10;double b = 20.0;// 显式实例化 Add<int>(a, b); return 0;
}

🍭2.5 函数模版的匹配原则

🥝1.一个非模板函数【专门的函数】可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数。
🥝2.对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板。
🥝3.模板函数不允许自动类型转换,但普通函数可以进行自动类型转换

🌈3. 类模板

🍭3.1 类模板的定义格式

template<class T1, class T2, ..., class Tn> 
class 类模板名
{// 类内成员定义 
};
template<class T>
class Stack
{
public:Stack(size_t capacity = 4){_array = new T[capacity];_capacity = capacity;_size = 0;cout << "Stack(size_t capacity = 4)" << endl;}~Stack(){delete[] _array;_capacity = 0;_size = 0;}void push(const T& data);
private:T* _array;int _capacity;int _size;
};//声明和定义分离的写法 不建议分离到.h 和.cpp
template<class T>
void Stack<T>::push(const T& data)
{_array[_size++] = data;
}

🍭3.2 类模板的实例化

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

	// Vector类名,Vector<int>才是类型 Vector<int> s1;Vector<double> s2;
int main()
{Stack<int> st1; // 实例化为处理int类型的Stack类,st1是该类对象Stack<double> st2; // 实例化为处理double类型的Stack类,st2是该类对象return 0;
}

说明Stack是类模板名,Stack<int>Stack<double>才是具体的类类型。

    🌈4.关键问题

    🍉问题 1:

    函数模板的隐式实例化和显式实例化有何区别?在什么情况下需要使用显式实例化?

     答案:区别主要体现在模板参数确定方式和类型转换处理上。隐式实例化由编译器根据实参自动推演模板参数的实际类型,且编译器一般不进行类型转换;显式实例化需在函数名后<>中手动指定模板参数类型,类型不匹配时编译器会尝试隐式类型转换。当出现隐式实例化无法确定模板参数的情况(如 Add (int, double),模板仅一个参数 T),或需要明确指定模板参数类型以满足特定需求时,需使用显式实例化

    🍉问题 2:

    类模板与函数模板在实例化方面有哪些核心差异?

     答案:一是实例化触发方式,函数模板可通过隐式(编译器推演)或显式(手动指定)实例化,类模板只能通过显式实例化(需在类模板名后<>指定类型);二是名称性质,函数模板实例化时,模板名可通过实参推演关联具体类型,而类模板名本身不是真正的类,只有实例化后的结果(如 Stack<int>)才是具体的类类型

    🍉问题 3:

    当非模板函数与同名函数模板同时存在时,编译器的调用匹配规则是什么?

     答案:有三条核心规则。第一,非模板函数与同名函数模板可共存,模板还能实例化为该非模板函数;第二,其他条件相同时,优先调用非模板函数,若模板能生成参数更匹配的函数版本(如非模板函数处理 int,模板可处理 int 与 double 组合),则选择模板;第三,模板函数不允许自动类型转换,而普通函数可以,这也会影响调用匹配结果(如实参类型不匹配时,普通函数可能通过自动转换匹配,模板函数则报错)

    🌻共勉:

    以上就是本篇博客的所有内容,如果你觉得这篇博客对你有帮助的话,可以点赞收藏关注支持一波~~🥝

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

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

    相关文章

    查找算法(Java)

    目录 一.定义 二.分类 三.线性查找 原理&#xff1a; 思路分析 代码实现 例题实践 1.两数之和 方法一&#xff1a;暴力穷举法 思路分析 代码实现 方法二&#xff1a;创建哈希表 思路分析 代码实现 2.移动零 思路分析 代码实现 四.二分查找 原理&#xff1a; …

    计算机网络--四层模型,IP地址和MAC地址

    四层模型&#xff1a;分别是应用层&#xff0c;传输层&#xff0c;网络层和链路层。应用层&#xff1a;提供了应用程序之间相互通信的接口&#xff0c;允许用户访问网络服务。这一层定义了应用程序如何与底层网络进行交互。例如HTTP协议。传输层&#xff1a;它处理数据的分段、…

    解析、创建Excel文件的开源库OpenXLSX介绍

    OpenXLSX是一个C库&#xff0c;用于读取、写入、创建和修改.xlsx格式的Microsoft Excel文件&#xff0c;源码地址&#xff1a;https://github.com/troldal/OpenXLSX &#xff0c;License为BSD-3-Clause&#xff0c;可在Windows、Linux、MaCOS平台上使用。最新发布版本为v0.3.2&…

    【C++】C++11 篇二

    【C】C11 篇二前言移动构造函数移动赋值运算符重载类成员变量初始化 &#xff08;缺省值出自C11强制生成默认函数的关键字default:禁止生成默认函数的关键字delete:继承和多态中的final与override关键字&#xff08;出自C11可变参数模板递归函数方式展开参数包逗号表达式展开参…

    构建Python环境的几种工具

    本文主要介绍如何构建Python环境来处理不同的工作。 1.常用的构建Python环境的工具 ①venv(内置模块):Python 3.3 内置标准库模块&#xff0c;无需额外安装。 ②virtualenv:venv的前身&#xff0c;功能更强大且支持旧版Python。 ③conda:来自 Anaconda 或 Miniconda。不仅能…

    c#项目编译时外部依赖文件的同步问题

    很多场景因为资源文件太多或太大无法放到资源里面或者是依赖的dll文件&#xff0c;需要编译时同步到bin\debug或bin\release下的&#xff0c;这里面要修改工程文件代码实现。 比如&#xff0c;我把这个项目依赖的dll和附加文件放到ref_dll文件夹里面&#xff0c;希望编译的时候…

    数学建模常用算法-模拟退火算法

    一、模拟退火算法模拟退火的灵感来源于物理中的 “退火过程”—— 将金属加热到高温后&#xff0c;缓慢冷却&#xff0c;金属原子会在热能作用下自由运动&#xff0c;逐渐形成能量最低的稳定结构。算法将这一过程抽象为数学模型&#xff1a;“温度 T”&#xff1a;对应物理中的…

    架构很简单:业务架构图

    缘起业务架构是一个复杂的体系&#xff0c;如何更简单的表达&#xff0c;并能使用起来呢&#xff1f;所谓&#xff1a;大道至简。基于此&#xff0c;这篇文章就开始了。业务是一切架构的开始&#xff0c;如果没有业务&#xff0c;架构又有什么作用呢&#xff1f;所以做架构首先…

    【前端埋点】纯前端实现 A/B Test

    “纯前端实现 A/B Test”&#xff0c;意思就是 没有后端分流、也不依赖流量网关&#xff0c;那么只能靠前端逻辑来做“流量切分”。 &#x1f3af; 目标 80% 的用户 → A 页面20% 的用户 → B 页面且要保证 同一个用户每次访问结果一致&#xff08;否则用户刷新页面时 A/B 会跳…

    Day22_【机器学习—集成学习(3)—Boosting—Adaboost算法】

    Adaptive Boosting(自适应提升)是基于 Boosting思想实现的一种集成学习算法&#xff0c;核心思想是通过逐步提高那些被前一步分类错误的样本的权重来训练一个强分类器。一、Adaboost算法直线相当于一个弱学习器&#xff0c;正确的数据权重减小&#xff0c;错误的数据权重增加二…

    C#语言入门详解(18)传值、输出、引用、数组、具名、可选参数、扩展方法

    C#语言入门详解&#xff08;18&#xff09;传值、输出、引用、数组、具名、可选参数、扩展方法一、传值参数1. 值类型2. 引用类型&#xff0c;并且创建对象3. 引用类型&#xff0c;不创建对象二、引用参数1. 值类型2. 引用类型&#xff0c;创建新对象3. 引用类型&#xff0c;不…

    模型部署:(二)安卓端部署Yolov5-v6.0目标检测项目全流程记录

    模型部署&#xff1a;&#xff08;二&#xff09;安卓端部署Yolov5-v6.0目标检测项目全流程记录1、下载NCNN项目2、下载基于安卓的yolov5项目3、修改相应的配置文件4、将项目打包成apk包5、部署自己训练的yolov5模型6、相关资料下载&#xff1a;1、下载NCNN项目 # 链接地址 ht…

    图形基础算法:如何将点与带曲线边的多边形位置关系算法做稳定

    简介判断点与多边形位置关系算法是几何算法中最基础的算法之一&#xff0c;包括布尔运算在内的非常非常多的算法都会用到它。它的稳定是算法库稳定的关键。下面我们从一个边都是直线的多边形开始了解射线法的原理。然后看看引入曲线后会带来哪些问题&#xff0c;以及在实际应用…

    react的filber架构

    好问题 &#x1f44d; 你问的是 React Fiber 架构。这是 React 16 引入的核心机制&#xff0c;用来解决 React 在大规模更新时的性能问题。下面我给你从 背景 → Fiber 是什么 → 原理 → 优点 → 流程 来系统讲。一、为什么需要 Fiber&#xff1f;在 React 15 及以前&#xff…

    Lucky STUN穿透结合群晖NAS实现docker下transmission监听端口动态更新

    参考文章 LCUKY系列教程 一 「LUCKY STUN穿透」使用 cURL 自动修改 Transmission 的监听端口 二 「LUCKY STUN穿透」使用 Webhook 自动修改 qbittorrent 的监听端口 三 LUCKY STUN穿透在Windows上使用UPnP工具为BT客户端自动添加内外端口号不同的映射规则 四「LUCKY STUN穿透」…

    如何在Ubuntu畅玩鸣潮等游戏

    本教程只包括Steam上的游戏。# 更新软件源 sudo apt update # 安装Steam sudo apt install steam首先&#xff0c;在Ubuntu的snap商店安装Steam&#xff0c;启动&#xff0c;登陆&#xff0c;下载游戏。到这里的操作都比较简单&#xff0c;对于没有反作弊的游戏&#xff0c;往往…

    机器学习09——聚类(聚类性能度量、K均值聚类、层次聚类)

    上一章&#xff1a;机器学习08——集成学习 下一章&#xff1a;机器学习10——降维与度量学习 机器学习实战项目&#xff1a;【从 0 到 1 落地】机器学习实操项目目录&#xff1a;覆盖入门到进阶&#xff0c;大学生就业 / 竞赛必备 文章目录一、聚类任务&#xff08;无监督学习…

    解决 Docker 构建中 Python 依赖冲突的完整指南

    问题背景 在基于 registry.cn-shenzhen.aliyuncs.com/all_dev/dev:invoice-base 镜像构建 Docker 容器时,我们遇到了一个常见的 Python 依赖管理问题: ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/topics/dependency-resolution/#dealing-…

    光子计算芯片实战:Lightmatter Passage互连架构性能评测

    点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 摘要 随着人工智能计算需求呈指数级增长&#xff0c;传统电子计算…

    基于树莓派与Jetson Nano集群的实验边缘设备上视觉语言模型(VLMs)的性能评估与实践探索

    概述 2018年&#xff0c;TensorFlow Lite团队的Pete Warden曾提出&#xff1a;“机器学习的未来在于微型化”。如今&#xff0c;随着人工智能向高性能视觉强大的视觉语言模型&#xff08;Vision-language models, VLMs&#xff09;发展&#xff0c;对高性能计算资源的需求急剧…