C++ 基础之函数模板和类模板

C++ 基础之函数模板和类模板

C++ 有别于 C ,比较重要的就是其抽象、封装、继承和多态等特性。多态又具体地体现在重载、虚函数和模板等等之上。

今天就和大家聊一聊函数模板和类模板。

函数模板

我们来看函数重载:
在这里插入图片描述

观察发现,这几个函数代码基本相同,只有参数类型不同,功能相同。问题就来了:写多个相同的函数体,是重复劳动,而且还可能因为代码的冗余造成不一致性。就不能找个东西去通用地表示和替代这些类型吗?

编写通用代码适用于多种不同的数据类型,讲三个函数写成通用的一个函数——函数模板。函数模板的基本原理是通过数据类型的参数化,将一组算法相同但所处理数据类型不同的重载函数凝练成一个函数模板。

怎么定义呢?只需要在原来的函数定义前加上template <class 标识符>或者template <typename 标识符>,就可以用这个标识符来通用地表示变量类型了。来看一个例子。

在这里插入图片描述

编译器从调用swaptemp()时实参的类型,推导出函数模板的类型参数。当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数。比如,如果调用表达式swaptemp(a,b),若实参 a、b 为 int 型,推导出模板中类型参数 T 为 int 。此时,生成的函数为:

void swaptemp(int& x,int& y)
{ int temp;
temp=x;
x=y;
y=temp;
}

返回类型也可以用类型参数 T 类定义:

在这里插入图片描述

函数模板也可以有多个类型参数:
在这里插入图片描述

函数模板方法克服了 C 语言用大量不同函数名表示相似功能的坏习惯。克服了 C++ 函数重载用相同函数名字重写几个函数的繁琐。函数模板是 C++ 中功能最强的特性之一,是提高软件代码重用率的重要手段。

类模板

和函数模板类似,应用模板技术,可以将一组功能相同但所处理数据类型不同的类凝练成一个类模板。编译时,再由编译器按照类模板自动生成针对不同数据类型的类定义代码。类模板的声明方式和函数模板是一模一样的。

不过,有一个问题是函数模板有传入参数,可以自动识别类型,从而确定类型参数该怎么具体化。而对于类,并没有一个传入参数可供判别(类的构造函数,只是类的一份子,它的传入参数,不能代表类的传入参数)。怎么办呢?我们需要在实例化对象的时候,指定类型参数。例子如下。

在这里插入图片描述

对于类模板方法的定义,和一般的类的定义不同的地方在于:

  • 在每个模板定义之前,都需要在前面加上模板声明:template<typename/class T>
  • 类模板和结构模板在定义和使用时,必须在名字后面缀上模板参数譬如<T>,写如:Student<T>
    举个例子如下:

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

类模板也可以带两个类型参数:
在这里插入图片描述
在这里插入图片描述

©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页