【C++】详细介绍模版初阶—函数模版、类模板

文章目录

  • 一、泛型编程
  • 二、函数模版
    • 2.1 函数模版概念
    • 2.2 函数模版格式
    • 2.3 函数模版的原理
    • 2.4 函数模版的实例化
    • 2.5 函数模版的匹配原则
  • 三、类模版
    • 3.1 类模版定义
    • 3.2 类模版实例化
  • 总结


ヾ(๑╹◡╹)ノ" 人总要为过去的懒惰而付出代价ヾ(๑╹◡╹)ノ"
在是图片描是小刘述


一、泛型编程

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。【不是针对某种类型】
template模版关键字
template< class T>
template< typename T>

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

解决办法【声明与定义分离,出现链接错误】

  1. 显示实例化指定(麻烦,不建议)
//声明
template
void Swap<int>(int& left, int& right);template
class Vector<int>;template
class Vector<double>;
//原因是因为声明没有类型,那么我们就把类型给写出来
  1. 不分离两个文件中

二、函数模版

2.1 函数模版概念

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

2.2 函数模版格式

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

template<typename T>//也可以是class T
void Swap(T& left, T& right)
{T tmp = left;left = right;right = tmp;
}
//函数模版

注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)【Swap库里面有,不用自己实现】
声明与定义

//声明
template<typename T>
void Swap(T& left, T& right);//定义
template<typename T>
void Swap(T& left, T& right)
{T tmp = left;left = right;right = tmp;
}
//函数模版

注意定义写的格式

2.3 函数模版的原理

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

函数模版的类型是编译器根据实参传递给形参,推演出来的。如果不能自动推演,我们就需要显示实例化,指定模版参数。
类模板的类型显示实例化,明确指定的。

2.4 函数模版的实例化

用不同类型的参数使用函数模板时,称为函数模板的实例化。
模板参数实例化分为:隐式实例化显式实例化
1. 隐式实例化:让编译器根据实参传递给形参,推演模板参数的实际类型

template<typename T>//也可以是class T
void Swap(T& left, T& right)
{T tmp = left;left = right;right = tmp;
}
//函数模版int main()
{int a = 1;int b = 2;Swap(a, b);//编译器根据实参传递给形参,判断为intdouble c = 1.2;double d = 2.3;Swap(c, d);//编译器根据实参传递给形参,判断为doublereturn 0;
}

当参数类型不同时:

template<typename T>
T Add(const T& left, const T& right)//常量,需要有const
{return left + right;
}
int main()
{int a = 1;double c = 2.1;Add<int>(a, c);//c这里有一个隐式类型转换Add<double>(a, c);Add(a,(int)c);//c这里有一个隐式类型转换Add((double)a, c);return 0;
}

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

template<typename T>
T* func(int n)
{terurn new T[n];//new n个对象,,,,无法推导出T的类型
}
int main()
{int* p1 = func<int>(10);//函数模版显示实例化return 0;
}

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

函数模版的类型是编译器根据实参传递给形参,推演出来的。如果不能自动推演,我们就需要显示实例化,指定模版参数。

2.5 函数模版的匹配原则

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

三、类模版

3.1 类模版定义

template<class T1, class T2, …, class Tn>
class 类模板名
{
// 类内成员定义
};

类模板不是具体的类,实例化才是真正的类。

template<class T>
class Stack
{
public:// 使用析构函数演示:在类中声明,在类外定义。~Vector();//……void push(T x){}private:T* _a;int _top;
};
//类模板中函数放在类外进行定义时,需要加模板参数列表,每一个函数都需要加模板参数列表
template <class T>
Vector<T>::~Vector()
{
if(_pData)delete[] _pData;
_size = _capacity = 0;
}int main()
{Stack<int> s1;s1.push(1);Stack<double> s2;s2.push(2.1);return 0;
}

类模板中函数放在类外进行定义时,需要加模板参数列表

3.2 类模版实例化

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

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


总结

以上就是今天要讲的内容,本文详细的介绍了函数模版和类模板。希望给友友们带来帮助!

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

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

相关文章

【SQL】【Oracle+JAVA】数据库管理数据库系统设计综合实验

文章目录 零.前言一.实验前准备1.概述2.关系模式3.关系模式属性4.实体间的联系5.完整性条件&#xff1a;6.相关描述7.规范化8.流程 二、SQL数据库编程工作1.创建用户cc并授权2.使用用户RouTineD 登录数据库3.创建表学生STUDENT4.创建表教师TEACHER5.创建表地点PLACE6.创建表课表…

【小样本学习】近两年小样本学习取得重大进展了吗?

点击上方&#xff0c;选择星标&#xff0c;每天给你送干货&#xff01; 作者丨赵俊博 Jake、杨朔、ICOZ 来源丨知乎问答 编辑丨极市平台 导读 2020年小样本学习可谓如火如荼&#xff0c;可是顶会论文却越看越懵&#xff0c;2020年到2021年初&#xff0c;小样本学习有里程碑意义…

近两年小样本学习取得重大进展了吗?

链接&#xff1a;https://www.zhihu.com/question/439865186 编辑&#xff1a;深度学习与计算机视觉 声明&#xff1a;仅做学术分享&#xff0c;侵删 2020年小样本学习可谓如火如荼&#xff0c;我从2020年六月份入坑小样本&#xff0c;顶会论文越看越懵&#xff0c;请问各位&am…

项目——基于Oracle实现一个简易版的教务系统

一、背景知识 本教务系统用户分为&#xff0c;学生&#xff0c;教师&#xff0c;系主任&#xff0c;管理员。学生具有选课功能&#xff0c;管理员具有排课功能。对于排课与选课考虑了简单的冲突检测&#xff0c;如下&#xff1a; 根据老师教学课表&#xff0c;为教学班所有的…

2022谷歌博士奖学金名单公布:共61人获奖!

来源&#xff1a;机器之心 谷歌博士奖学金&#xff08;Google PhD Fellowship&#xff09;旨在奖励在计算机科学等前瞻科研领域表现优异的年轻学者&#xff0c;奖学金用于直接支持攻读博士学位&#xff0c;并提供与谷歌研究导师合作的机会。 自创立以来&#xff0c;该项目已经资…

STM32+CubeMX 通过RMS和FFT进行波形识别

波形识别 本文所展示的程序可以用于分辨正弦波、三角波、方波三种波形。 文章目录 波形识别思路可以判断波形的两个特点时域方面频域方面 外设配置 & DSP库配置代码部分串口重定向时域部分变量定义ADC采集求最大值&#xff0c;最小值&#xff0c;幅值取出波形的一个周期求…

2022秋软工实践 团队展示与选题报告

这个作业属于哪个课程Fzusdn这个作业要求在哪里2022秋软工实践 团队展示与选题报告这个作业的目标群策群力初步完成项目设计&#xff0c;有效交流带来团队友好氛围团队名称小心肝队组长学号042003121组员1学号032002221组员2学号032002343组员3学号032002401组员4学号032002422…

【英语】大学英语CET考试,词汇语法50h+(导学方法论,词汇3关键,语法3大山)

文章目录 1、谭剑波-词汇直播课1-2&#xff08;词汇学习3个关键&#xff09;1.1 看不懂句子的原因&#xff08;词汇的重要性&#xff09;1.2 记不住单词的原因&#xff08;死记硬背70%&#xff09;1.3 理解单词的本质&#xff08;词根词缀&#xff0c;26字母&#xff0c;联想辅…

杨朔:大数据时代的移动营销

2019独角兽企业重金招聘Python工程师标准>>> 杨朔&#xff1a;大数据时代的移动营销 惠莫森中国区总经理杨朔表示&#xff0c;大数据本身强调的可能是大&#xff0c;但我们强调的是有用的数据。对于庞大的数据处理&#xff0c;我们提倡从小做起。所谓“小”便是移动…

详解ACM基础算法—DFS深度优先搜索算法 HIT杨朔

深度优先搜索&#xff08;DFS&#xff09;是搜索手段之一。是从某个状态开始不断转移状态直到无法转移为止&#xff0c;然后退回到前一步状态继续转移其他状态&#xff0c;可以想象为一个沿树爬行的虫子&#xff0c;在一个交叉口他会首先随机选择一条分岔路口一直走下去直到死路…

【调试经验】Ubuntu22.04 安装和配置MySQL 8.0.34

在安装新版本的MySQL到电脑时&#xff0c;按着网上一些教程执行发现错误繁多&#xff0c;最后索性自己摸索并把服务装好了。自己也整理了一下在操作时的一些&#xff0c;上传分享上来希望能帮助到大家。 目录 正文 安装MySQL 配置MySQL 登录账户 方式1: 默认账户登录 方…

Illustrator打开visio导出的emf为什么会报错

问题描述 将使用Visio绘制的.emf文件直接拖入Adobe Illustrator有时候会弹出如下报错窗口——“无法完成操作&#xff0c;因为出现未知错误。” 原因分析 经过多次测试&#xff0c;发现这个跟Visio中元素的数量有关&#xff0c;当数量>24或>27&#xff08;差不多就这…

加密狗检测不到mysql_广联达检测不到加密锁

请先检查本机是否已正确安装广联达软件及加密锁驱动程序&#xff0c;盗版用户还需要安装一个“授权工具”。 碰到此问题&#xff0c;着实让人头疼。偶本人表示已经碰到很多次&#xff0c;有句古话&#xff1a;久病成医(有这句话&#xff1f;)。现将解决方法记录如下&#xff1a…

【教程】广联达装饰设计(Deco Design)软件模型导出

【教程】广联达装饰设计&#xff08;Deco Design&#xff09;软件模型导出 首先确认自己的模型是正常&#xff0c;并且可以显示&#xff0c;包括家具&#xff08;不管是外部还是内部&#xff09;。选择工具 - 显示设置 - 楼层显示 - 自定义楼层-全部楼层。 开始-导出-Igms即可…

并发编程基础知识篇--线程的状态和基本操作

目录 创建线程的四种方式 线程的状态和生命周期 扩展知识 线程的调度 线程状态的基本操作 interrupted 实例 join 实例 sleep 实例 扩展小知识 yield 实例 扩展 创建线程的四种方式 创建线程的四种方式 继承Thread类实现Runnable接口使用Callable和Future创…

win7笔记本无线网服务器,win7笔记本连接不上无线网络

有些时候我们在使用win7笔记本&#xff0c;难免会遇到连接不上无线网络的情况&#xff0c;这是怎么回事呢?下面就由学习啦小编来为你们简单的介绍win7笔记本连接不上无线网络的解决方法吧! win7笔记本连接不上无线网络的解决方法 Win7右下角的无线图标为但还是连接不上的话&am…

win7计算机建立无线网络连接不上,教你电脑连接不上无线网络怎么办

最近有网友反馈&#xff0c;遇到了笔记本无法连接无线网络的问题。笔记本如果连接不了WiFi&#xff0c;这样就会带来很多不便。其实导致电脑连接不上无线网络的原因有很多&#xff0c;接下来就让小编教你电脑连接不上无线网络怎么办吧。 电脑连接不上无线网络怎么办&#xff1a…

Win10电脑连接不上无线网络怎么解决

为了电脑使用方便&#xff0c;很多网友都会给电脑连接上无线网络来上网&#xff0c;但是电脑遇到连不上网络怎么办呢&#xff1f;今天给大家分享一个方法&#xff0c;大家遇到无线网络连接不上问题可以参考一下。 系统&#xff1a;win10专业版 电脑&#xff1a;联想Ideapad 7…

Win10笔记本电脑连接不上WiFi的解决办法

笔记本电脑连接不上WiFi是很多朋友会遇到的一个问题,而产生的原因也很多,解决起来相对麻烦一些,需要了解导致的原因与排查方法。最近小编的Win10笔记本电脑也遇到了类似的无线网络连接不可用的问题,不过通过排查很快就解决了,下面小编分享一下详细的Win10笔记本电脑连接不…

禁用计算机的网络连接无线网络连接不上,win7笔记本电脑无线网络连接不上怎么解决?...

最近有不少网友都遇到了win7笔记本电脑无线网络连接不上的问题。我们都知道&#xff0c;无线网络是可以共享的&#xff0c;笔记本无线网络连接不上&#xff0c;我们就无法有进一步的操作了。那么&#xff0c;win7笔记本电脑无线网络连接不上怎么解决呢?接下来&#xff0c;小编…