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的模板,现在测试一下结果是否正确呢?
发现测试结果完全正确.
然后这里博主有个疑问,就是我们调用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> {}
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注猪先飞的更多内容!
原文出处:https://blog.csdn.net/m0_51723227/article/details/120997774
相关文章
- vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
- 这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
- 整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
- 这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
- 这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
深入解析WordPress中加载模板的get_template_part函数
这篇文章主要介绍了WordPress中加载模板的get_template_part函数,其中重点讲解了其函数钩子的使用,需要的朋友可以参考下...2016-01-14- 这篇文章主要介绍了C++ bitset用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- mysql安装成功后有几个默认的配置模板,列表如下: my-huge.cnf : 用于高端产品服务器,包括1到2GB RAM,主要运行mysql my-innodb-heavy-4G.ini : 用于只有innodb的安装,最多有4GB RAM,支持大的查询和低流量 my-large.cnf : 用于...2015-03-15
- 本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
- 这篇文章主要为大家详细介绍了C++ Eigen库计算矩阵特征值及特征向量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- 这篇文章主要介绍了C++ pair的用法实例详解的相关资料,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了VSCode C++多文件编译的简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
- 虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。下面通过实例代码给大家介绍c++中的循环引用,一起看看吧...2020-04-25
- 这篇文章主要给大家介绍了关于C++随机点名生成器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 1、简介Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目...2014-05-31
- map容器是C++ STL中的重要一员,删除map容器中value为指定元素的问题是我们经常与遇到的一个问题,下面这篇文章主要给大家介绍了关于利用C++如何删除map容器中指定值的元素的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。...2020-04-25
- 这篇文章主要介绍了C++ 约瑟夫环问题案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-15