【C++初阶】第6课—模版初阶

发布于:2024-12-07 ⋅ 阅读:(141) ⋅ 点赞:(0)

1. 函数模版

  • 在讲函数模版之前先看一个例子

在这里插入图片描述


  • 为了实现泛型编程,C++提出了函数模版的概念
  • 函数模版与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本

1.1 函数模版格式

  • 关键字template开头
  • template<typename T1,typename T2,…,typename Tn>
  • 返回值类型  函数名(参数列表) { }

在这里插入图片描述


  • 定义模版时,可以使用typename和class指定类型参数,例如,template <typename T>template <class T>在功能上是等价的。

在这里插入图片描述


1.2 函数模版原理

  • 函数模版本身并不是一个函数,是编译器使用方式产生特定具体类型的模具,因此模版就是将我们本来应该做的重复性工作让编译器实现
  • 在编译器编译阶段,编译器需要根据实参来推演生成对应类型的函数以供调用

在这里插入图片描述


1.3 函数模版的实例化

  • 用不同类型的参数使用函数模版时,称为函数模版的实例化
  • 模版参数实例化分为:隐式实例化和显式实例化
  • 隐式实例化:让编译器根据实参推演模版参数的实际类型

在这里插入图片描述


在这里插入图片描述


  • 当然还有其他的方法,那就是显式实例化

在这里插入图片描述


  • 这里需要提示的是,我们显式实例化后,对于那些实参不是给定的,例如Add<int>(a,f1)中的f1不是int类型,编译器会默认隐式类型转换

1.4 模版参数的匹配原则

  • 如果一个函数模版和一个非模版函数同时存在,且两个函数重名,函数模版还可以被实例化为这个非模板函数,编译器遵循的原则:有现成的吃现成的,没有再去构造函数模版

在这里插入图片描述


在这里插入图片描述


  • 对于多个不同类型的参数

在这里插入图片描述


  • 模版函数不允许自动转换类型,而普通函数可以自动转换类型

在这里插入图片描述


2. 类模版

  • 类模板定义的格式:
  • template<class T1,class T2,…,class Tn>
  • class 类模版名
  • {
  •  //类内成员定义
  • }
  • 类模版实例化时,只需要在类模板名字后+<实例化的类型>,实例化名字不是真正的类,而实例化的结果才是真正的类
  • Stack<int> st1;  //用来存储int类型的数据
  • Stac<double> st2;   //用来存储浮点数的数据
  • Stack是类名,Stack<int> 才是类型

在这里插入图片描述


  • 上述图片就可以实现一个栈中放整型数据,另一个栈放浮点数数据,两个栈不是同一个,而是共用一个Stack类模板
  • 这里需要注意的是,如果使用typedef,有一定的局限型,两个栈只能存放整形或者浮点数,而不能一个存储整形数据,一个存储浮点数的数据,要实现两个栈分别存储不同类型的数据,需要定义两个不同参数类型的栈,没有上述类模板好用

网站公告

今日签到

点亮在社区的每一天
去签到