广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++模板基础知识点有哪些
  • 678
分享到

C++模板基础知识点有哪些

2023-06-25 16:06:44 678人浏览 泡泡鱼
摘要

这篇文章主要讲解了“c++模板基础知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++模板基础知识点有哪些”吧!引入我们对交换函数Swap已经非常熟悉了,但是我们经常会遇到这样的

这篇文章主要讲解了“c++模板基础知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++模板基础知识点有哪些”吧!

引入

我们对交换函数Swap已经非常熟悉了,但是我们经常会遇到这样的一些事,比如,很多不同的数据类型进行交换,那么我们就需要写不同的重载Swap,如下:

#include <iOStream>using namespace std;void Swap(int& a,int& b){    int t  = a;    a = b;    b = t;}void Swap(double& a,double& b){    double t = a;    a = b;    b = t;}int main(){    int a = 10,b = 20;    double c = 1.2,d = 3.4;    Swap(a,b);    Swap(c,d);    return 0;}

可以看到,如果有必要,我们需要交换几种类型的数据,就必须写上几种重载Swap,这就导致非常的繁琐,因为我们对其交换逻辑太熟悉了,只是换了变量类型,那有什么办法可以解决呢?没错,这就是我们今天要讲的模板.

模板

概念:在生活中,博主举一个例子,假设你是一个手办厂家,现在你需要售出各种材料和颜色做的悟空手办,首先你需要的就是悟空的模型,然后按照这个模型使用不同的材料.这个模型就是我们在程序中的模板.

模板种类:

  • 函数模板

  • 类模板

函数模板

函数模板的格式:

template<class T1,class T2,...>     return_val function_name (para1,para1,...){}

打省略号的都是形参列表,表示参数量自由,我们现在知道了怎样使用函数模板,那试试写一个Swap模板:

template<class T> void Swap (T& a,T& b){    T t = a;    a = b;    b = a;}

按照模板规范,我们写出来了Swap的模板,现在测试一下结果是否正确呢?

C++模板基础知识点有哪些

发现测试结果完全正确.

然后这里博主有个疑问,就是我们调用Swap时,编译器是执行的上面模板呢?还是执行的通过模板推演出来的函数呢?

答:通过模板推演出来的函数,因为C++提出模板是为了节省程序员的时间,我们所省略的工作,只是编译器替我们完成了.

也就是说,比如我们这样调用:

int main(){    int a = 10,b = 20;    Swap(a,b);    return 0;}

那么编译器在底部会推演出一个如下函数,并执行:

void Swap(int& a,int& b){    int t  = a;    a = b;    b = t;}

模板的匹配原则

什么叫做模板的匹配原则呢?

就是说当既有定义出来的明确函数,同时又有模板,那么调用函数时候,执行的是哪一个?以下面为例:

void Swap(int& a,int& b){    int t  = a;    a = b;    b = t;}template<class T> void Swap (T& a,T& b){    T t = a;    a = b;    b = a;}int main(){    int a = 10,b = 20;    Swap(a,b);    return 0;}

匹配顺序为:

  • 如果有定义出来的函数,且类型完全匹配调用时实参类型,则执行定义出来的函数.

  • 如果定义出来的函数,不符合,则执行模板推演.

也就是说,上面的例子中,Swap调用的是我们定义出来的Swap,而不是模板.

模板的显示调用

上面讲解的模板使用,其实被称做隐式调用,现在,博主介绍一下显示调用.

显示调用格式:

function<Type1,Type2,..>(para1,para1,...);

也就是说,我们明确知道需要使用的什么类型,并且就想告诉编译器,我传给你的是什么类型,然后让编译器推演出该类型的函数.比如下面使用:

int a = 10,b = 20;char c = 'a',d = 'b';Swap<int>(a,b);  //告诉编译器我传的是int类型Swap<char>(c,d);  //告诉编译器我传的是char类型

大家可能会问了,这有什么用呢?既然编译器会根据我们的调用情况进行推演,还进行显示调用不是多此一举吗?大家请看下面的代码:

template<class T> void Swap (T& a,T& b){    T t = a;    a = b;    b = a;}int main(){    int a = 10;    double b = 23.22;    Swap(a,b);         //这样调用编译器就会报错    return 0;}

像上面的调用方式,是不允许的,因为模板中只有一个T,但是我们传了两个类型,编译器根据模板将不知道T应该是啥类型,而解决上面的问题只有两种

  • 一是强制性转换类型,比如Swap(a,(int)b);

  • 二是显示使用模板,比如Swap<int>(a,b);

其次,博主讲解模板的显示调用还有一个目的就是为了引出下面的类模板.

类模板

类模板和函数模板相似,定义框架如下:

template <class T1,class T2,...>    class class_name    {    };

我们对数据结构—栈,应该算比较了解,而对于经常刷力扣的伙伴来说,可能会发现栈不只是用来存储int类型,比如还有Listnode*等,那我们大概写一下其stack模板吧.

template <class T>class Stack{public:    Stack():data(new T*[10]),top(0),capacity(10) {}    ~Stack()     {        delete[] data;         top = capacity = 0;    }    void Push(T& a)    {}private:    T* data;    int top;    int capacity;};

然后我们定义Stack对象,但是对象应该存储的类型是什么呢?如果我们继续用最开始的隐式模板方法,发现完全实现不了,这也就是博主上面为何要讲解模板的显示调用,因为类模板只能通过显示调用实现,例子使用如下:

Stack <char> st1;      //定义一个存储char类型的栈Stack <int> st2;       //定义一个存储int类型的栈Stack <double> st3;    //定义一个存储double类型的栈

Stack并不是类,其只是一个模板,Stack <int>等才是类

注意1

类模板只是一个模板,他并不属于类.

注意2

当我们的模板类中的成员函数,在模板中声明,而在模板外定义时,需要加上模板参数列表,如下:

template <class T>class Stack{public:    void Push(T& a);    bool empty();private:    T* data;    int top;    int capacity;};template <class T> void Stack<T>:: Push(T& a)     //需要加上template <class T> ,且在Stack后面加上<T>{}template <class T>   void Stack<T>:: empty()        //需要加上template <class T> ,且在Stack后面加上<T>{}

感谢各位的阅读,以上就是“C++模板基础知识点有哪些”的内容了,经过本文的学习后,相信大家对C++模板基础知识点有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: C++模板基础知识点有哪些

本文链接: https://www.lsjlt.com/news/305872.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++模板基础知识点有哪些
    这篇文章主要讲解了“C++模板基础知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++模板基础知识点有哪些”吧!引入我们对交换函数Swap已经非常熟悉了,但是我们经常会遇到这样的...
    99+
    2023-06-25
  • C++的基础知识点有哪些
    这篇文章主要介绍“C++的基础知识点有哪些”,在日常操作中,相信很多人在C++的基础知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++的基础知识点有哪些”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-17
  • Kubernetes模块的基础知识点有哪些
    今天小编给大家分享一下Kubernetes模块的基础知识点有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。  1、创建一...
    99+
    2023-06-03
  • C++的基础知识有哪些
    这篇文章主要介绍“C++的基础知识有哪些”,在日常操作中,相信很多人在C++的基础知识有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++的基础知识有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-16
  • QinQ基础知识点有哪些
    本篇内容主要讲解“QinQ基础知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“QinQ基础知识点有哪些”吧!QinQ 是 802.1Q in 802.1Q 的简称,是基于 IEEE 8...
    99+
    2023-06-03
  • Mysql基础知识点有哪些
    这篇文章主要介绍Mysql基础知识点有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!数据库的特点?数据结构化 ,数据之间具有联系,面向整个系统;数据的共享性高,冗余度低,易扩充;...
    99+
    2022-10-18
  • Redis基础知识点有哪些
    本篇内容介绍了“Redis基础知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 什么是Red...
    99+
    2022-10-19
  • Node.js基础知识点有哪些
    这篇文章给大家分享的是有关Node.js基础知识点有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Node.js是什么根据Node.js官方网站的描述,“Node.js是一套...
    99+
    2022-10-19
  • jQuery基础知识点有哪些
    这篇文章将为大家详细讲解有关jQuery基础知识点有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。jQuery语法实例$(this).hide()jQuery 的 h...
    99+
    2022-10-19
  • JavaScript基础知识点有哪些
    这篇文章主要介绍“JavaScript基础知识点有哪些”,在日常操作中,相信很多人在JavaScript基础知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java...
    99+
    2022-10-19
  • InnoDB基础知识点有哪些
    这篇文章给大家分享的是有关InnoDB基础知识点有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、关于count(*)知识点:MyISAM会直接存储总行数,InnoDB则不...
    99+
    2022-10-19
  • Angular8基础知识点有哪些
    这篇文章给大家分享的是有关Angular8基础知识点有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Angular CLI又称 Angular脚手架,用于快速生成项目或者组件...
    99+
    2022-10-19
  • XHTML基础知识点有哪些
    本篇内容介绍了“XHTML基础知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 一.HTML实...
    99+
    2022-10-19
  • html基础知识点有哪些
    这篇文章主要介绍了html基础知识点有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。HTML语义化HTML标签的语义化是指:通过使用包含...
    99+
    2022-10-19
  • css3基础知识点有哪些
    这篇文章主要讲解了“css3基础知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css3基础知识点有哪些”吧! div > p 选择父元素...
    99+
    2022-10-19
  • CSS基础知识点有哪些
    这篇文章主要为大家展示了“CSS基础知识点有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“CSS基础知识点有哪些”这篇文章吧。CSS3 选择器选择器可以被分...
    99+
    2022-10-19
  • Hibernate基础知识点有哪些
    这篇文章主要介绍“Hibernate基础知识点有哪些”,在日常操作中,相信很多人在Hibernate基础知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Hibernate基础知识点有哪些”的疑惑有所...
    99+
    2023-06-17
  • Java基础知识点有哪些
    这篇文章主要介绍“Java基础知识点有哪些”,在日常操作中,相信很多人在Java基础知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java基础知识点有哪些”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-02
  • VBS基础知识点有哪些
    这篇文章给大家分享的是有关VBS基础知识点有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。VBScript(Microsoft Visual Basic Script Editon).,微软公司可视化BASI...
    99+
    2023-06-08
  • MongoDB基础知识点有哪些
    这篇文章主要介绍MongoDB基础知识点有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!NO.1 Linux下MongoDB的安装   Linux下MongoDB的安装还算简单,总体可以分为如...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作