我们都知道c++有函数重载的概念,比如我们写一个相加的函数,以整数为例,我们大概率是这样写:

int Add(int x,int y)
{
    return x+y;
}

并且我们知道c++函数重载的概念,于是我们若是想写double类型,float类型,long 类型的Add函数,我们会写好几段相同的代码,只是不同的参数类型罢了;

但是这样会有很多代码冗余,如下:

int Add(int x,int y)
{
    return x+y;
}

float Add(float x,float y)
{
    return x+y;
}

double Add(double x,double y)
{
    return x+y;
}

long Add(long x,long y)
{
    return x+y;
}

我们可以看到,上面的代码除了数据类型不同,其他完全一样。

为了减少工作量,c++的创造者设计了新的语法——模板;

目录

初识模板

 函数模板

类模板

类模板格式

类模板的指针变量初始化


初识模板

就像我们人类创造武器或者印刷纸币的时候,会有一个模具,这样就能使用不同的材料创造出相同的东西,而我们的模板也是类似的,它和一个关键字息息相关——template;        

而模板又分为类模板函数模板

 函数模板

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

首先是函数模板,我们以上面的Add函数为例,若是使用模板来写,我们应该怎么写呢?

template<class T>
T Add(T x, T y)
{
	return x + y;
}

 以上便是函数模板的使用方式,而若是想要使用Add函数,

 则应该按Add<参数类型>(参数A,参数B)的形式使用;

如下:

模板虽然使用简单,但是也需要遵守以下规则,否则也会出错:

1.模板格式

template<typename T1, typename T2,......,typename Tn> 返回值类型 函数名 ( 参数列表 ){}、 2.在编译阶段,编译器会根据传入的实参类型来推演生成对应的函数,这也叫函数模板的实例化。 3.当出现和函数模板同名的函数时,编译器会有限调用非函数模板函数。 4.模板函数不允许隐式类型转换
此外,函数模板还有几个特殊点需要注意;

像这样,Add只有一种类型T,而下面的调用使用了a和b俩种不同类型的实参进行传参;

这样会导致错误,若是想传不同类型的数据则应该多用几个模板;

 比如这样。

类模板

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

随着我们学习的深入,我们会学到各种各样的容器,而这些容器可能需要容纳各种类型的数据,因此它们都统一使用了类模板,如vector,list之类的。

类模板格式

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

而我们平时使用则是这样使用的:

int main()
{

    vector<int> arr1;
    vector<char> arr2;
    vector<string> arr3;
    return 0;
}

 和函数模板一样都需要我们将数据类型传过去,才能使用对应容器。

类模板的指针变量初始化

我们都知道模板类都需要实例化,而类模板的指针变量初始化也需要实例化才能初始化;

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	vector<int>* v = new vector<int>();


	return 0;
}

这样,我们才能成功初始化一个类模板的指针变量。

以上就是模板的内容,比较简单,谢谢大家~~

更多推荐

c++模板认识以及使用