C++模版初阶讲解

这篇具有很好参考价值的文章主要介绍了C++模版初阶讲解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今日为大家分享C++的模版,这里先把模版的初阶讲解一下,以后再讲解模版进阶!

前言:模版的引入

在我们进行学习的编程中,常常会有许多函数的功能相同,有些不同点可能就是其中的数据类型不同!如果我们统统进行函数重载的话,其实也能解决问题,例如,实现两个数的交换!

void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}


void Swap(double& left, double& right)
{
double temp = left;
left = right;
right = temp;
}


void Swap(char& left, char& right)
{
char temp = left;
left = right;
right = temp;
}

.....

但是函数重载也存在许多问题!

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

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


那么是否有一种更好的方法来解决这种问题呢?答案是肯定的,最好的解决方法就是引用模版!

一、模版的分类!

1.函数模版

1.定义

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


2.函数模版格式

template<typename T1, typename T2,......,typename Tn>

返回值类型 函数名(参数列表){}
 

 例如实现一个交换两个数的模版!

C++模版初阶讲解,c++,算法,数据结构,c语言,学习方法


3.函数模版的原理

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器

C++模版初阶讲解,c++,算法,数据结构,c语言,学习方法

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

4.函数模版的实例化

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

隐式实例化:

根据我们传入的形参的类型,编译器自动推演出并生成对应类型的函数!

显式实例化:

我们在调用模版时,直接对模版的类型进行显式调用!

C++模版初阶讲解,c++,算法,数据结构,c语言,学习方法

例如在上述函数模版中,我们在swap后面加上“<>”,显式的调用整形的模版! 当我们不加的话,编译器会自动根据形参类型来生成最合适的函数!


5.模版参数的匹配原则

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

C++模版初阶讲解,c++,算法,数据结构,c语言,学习方法

其中对于1,编译器会优先调用现有的Add函数,而不是让编译器去实例化一个模版函数!对于2来言,因为没有相对于的函数,只能使用模版来实例化一个更匹配的函数!所以其会调用模版来实例化一个Add(double,double)类型的函数!其中调用那个函数,可以通过打断点调试来观察!

通过上面例子可以看出,当存在匹配的函数后,编译器便不会再进行模版的实例化,只有当没有对于的函数存在时,编译器才会进行模版的实例化,生成一个更合适的函数!

其实也可以这样理解:编译器也会偷懒,只要有合适的函数,他便不自己生成,而使用存在的,只有当没有合适的函数时,他才会进行生成!


2.类模版

1.类模版的定义格式

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

假设定义一个vector类模版!

C++模版初阶讲解,c++,算法,数据结构,c语言,学习方法

与函数模版类似,只不过下面变成了class+类名而已!其实都大差不差!

在这里需要注意:1.Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具。
 2.当在类外进行定义函数时,需要加上模版参数列表!


2.模版的实例化

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

// Vector类名,Vector<int>才是类型

Vectorv<double>v1;

Vector<int >v2;

总结:

函数模版可以大大减少我们的工作量,让我们增加更多的时间去思考,而不是将大量的时间花费在重复的代码中!


至此,关于模版的初阶讲解以及完毕了,初阶的讲解主要是让大家能简单认识模版的格式以及简单的使用!但是模版的学习并没有结束,以后还会进行模版的进阶进行讲解! 

希望读完本篇文章,可以让读者对模版有一定的认识!如果有收获,希望大家留下免费的小心心哦!

C++模版初阶讲解,c++,算法,数据结构,c语言,学习方法

 文章来源地址https://www.toymoban.com/news/detail-740105.html

到了这里,关于C++模版初阶讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构初阶】九、五种比较排序的讲解和实现(直接插入 \ 希尔 \ 直接选择 \ 堆 \ 冒泡 -- C语言)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】八、非线性表里的二叉树(二叉树的实现 -- C语言链式结构)-CSDN博客  ====

    2024年02月08日
    浏览(51)
  • C++模版初阶讲解

    今日为大家分享C++的模版,这里先把模版的初阶讲解一下,以后再讲解模版进阶! 在我们进行学习的编程中,常常会有许多函数的功能相同,有些不同点可能就是其中的数据类型不同!如果我们统统进行函数重载的话,其实也能解决问题,例如,实现两个数的交换! 但是函

    2024年02月06日
    浏览(38)
  • 【数据结构初阶】一. 复杂度讲解

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 学C的第三十四天【程序环境和预处理】_高高的胖子的博客-CSDN博客  ===============================

    2024年02月10日
    浏览(44)
  • 【数据结构和算法初阶(C语言)】复杂链表(随机指针,随机链表的复制)题目详解+链表顺序表结尾

    目录  1.随机链表的复制 1.2题目描述  1.3题目分析 1.4解题: 2.顺序表和链表对比 2.1cpu高速缓存利用率 3.结语 一个长度为  n  的链表,每个节点包含一个额外增加的随机指针  random   该指针可以指向链表中的任何节点或空节点。        构造这个链表的  深拷贝 。 深拷贝

    2024年03月10日
    浏览(87)
  • 《数据结构、算法与应用C++语言描述》-列车车厢重排问题

    完整可编译运行代码见:Github::Data-Structures-Algorithms-and-Applications/_10Train_carriages_rearrangement/ 一列货运列车有 n 节车厢,每节车厢要停靠在不同的车站。假设 n个车站从 1 到n 编号,而且货运列车按照从n到1的顺序经过车站。车厢的编号与它们要停靠的车站编号相同。为了便于从

    2024年04月10日
    浏览(67)
  • 『初阶数据结构 • C语言』① - 数据结构为何重要

    本文内容借鉴一本我非常喜欢的书——《数据结构与算法图解》。学习之余,我决定把这本书精彩的部分摘录出来与大家分享。 数组是计算机科学中最基本的数据结构之一。如果你用过数组,那么应该知道它就是一个含有 数据的列表。它有多种用途,适用于各种场景,下面

    2024年02月16日
    浏览(47)
  • C语言完整版笔记(初阶,进阶,深刨,初阶数据结构)

    1.初阶: 1.1C语言初阶易忘知识点速记 2.进阶:  1.2C语言进阶易忘点速记 3.深剖: 2.1C语言重点解剖要点速记 2.2C语言重点解剖操作符要点速记   2.3C语言重点解剖预处理要点速记 2.4C语言重点解剖指针和数组要点速记 2.5C语言重点解剖内存管理函数要点速记 4.数据结构:

    2024年02月16日
    浏览(38)
  • 数据结构初阶(用C语言实现简单数据结构)--栈和队列

    ✨✨欢迎来到T_X_Parallel的博客!!       🛰️博客主页:T_X_Parallel       🛰️专栏 : 数据结构初阶       🛰️欢迎关注:👍点赞🙌收藏✍️留言 这小猫真好看 言归正传,通过上篇有关顺序表和链表的博客,可以了解到线性表的一些大致特征,这篇博

    2024年02月08日
    浏览(42)
  • 【数据结构初阶】之堆(C语言实现)

    前言 :在二叉树基础篇我们提到了二叉树的顺序实现,今天让我们来学习一下特殊的二叉树———堆的相关知识。 📃 博客主页: 小镇敲码人 💞 热门专栏:数据结构与算法 🚀 欢迎关注:👍点赞 👂🏽留言 😍收藏 🌏 任尔江湖满血骨,我自踏雪寻梅香。 万千浮云遮碧月

    2024年04月09日
    浏览(82)
  • 『初阶数据结构 • C语言』④ - 冒泡排序

      本文内容借鉴一本我非常喜欢的书——《数据结构与算法图解》。学习之余,我决定把这本书精彩的部分摘录出来与大家分享。      本章内容 写在前面 1.冒泡排序 2.冒泡排序实战 3.冒泡排序的实现 4.冒泡排序的效率 5.二次问题 6.线性解决 7.总结     大 O记法能客观地衡量

    2024年02月16日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包