当前位置: 首页 > news >正文

模板初阶(c++)

目录

1.泛型编程

2.函数模板

2.1定义:

2.2函数模板的格式

2.3函数模板的的原理

2.4函数模板的实例化

2.5模板参数的匹配原则

3.类模板

3.1类模板的定义格式

3.2类模板的实例化

1.泛型编程

告诉编译器一个模子,让编译器根据不同的的类型利用模子来生成代码。

2.函数模板

2.1定义:

函数模板是代表了一个函数家族,该函数模板与类型无关,在使用的时被参数化,根据实参类型产生对应类型的函数。(注意这是一个新的函数而不是原来的函数模板,函数模板不是函数,函数模板参数化之后才是函数)

2.2函数模板的格式

template <typename T1,typename T2,....>

返回值类型 函数名 (参数列表){函数体}

注意typename是用来定义模板参数的关键字,也可以使用class。

2.3函数模板的的原理

函数模板是一个模子,它本身并不是函数,是编译器用使用方式产生特定具体类型的函数的模子,所以模板就是将本来我们应该做的事交给了编译器。在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演出对应的函数以供调用。

2.4函数模板的实例化

使用不同的参数使用函数模板时称为函数模板的的实例化。就模板参数实例化就分为:隐式实例化和显示实例化。

1.隐式实例化:让编译器根据实参推演模板参数的实例化。

2.显示实例化:在函数名后面的<>中指定模板参数的实际类型

#define  _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//下面是模板函数
template <class t>
t add(t a, t b)
{return a + b;
}
int main()
{int a1 = 1;double a2 = 1.1;cout << add(a1, (int)a2) << endl;//这个是隐式实例化,在传参的时候自动推导出t的类型cout << add<double>(a1, a2) << endl;//这个是显示实例化,直接就指定了t类型为double,不一样的就强转。//对于形参没有t的模板,只能用显示实例化,因为传参的时候并不能确定t的类型,那么返回值的类型就无法确定return 0;
}

2.5模板参数的匹配原则

1.一个非模板函数可以和一个同名的函数模板同时存在,而且改函数模板还可以被实例化。

2.如果一个函数模板跟一个或多个非模板的同名函数同时存在,如果其他条件都一样的话,在调用的时候会遵循先匹配,如果适配度也一样就调用非模板的函数,而不是用函数模板来产生一个实例。

#define  _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
int add(int a, int b)
{return a + b;
}
template <class t>
t add(t a, t b)
{return a + b;
}int main()
{int a1 = 1;double a2 = 1.1;cout << add(a1, (int)a2) << endl;//这个是隐式实例化,在传参的时候自动推导出t的类型cout << add<double>(a1, a2) << endl;//这个是显示实例化,直接就指定了t类型为double,不一样的就强转。//对于形参没有t的模板,只能用显示实例化,因为传参的时候并不能确定t的类型,那么返回值的类型就无法确定//模板参数的匹配原则:(调用最匹配的,相同匹配的调用简单的)//对于非模板和同名函数的模板,如果其他的条件都相同,在调用时会优先调用非模板,如果模板可以产生一个具有更寒匹配的函数,那就调用模板cout << add(a1, a1) << endl;//这里调用的是现成的函数而不是模板return 0;
}

3.注意:模板函数不能自动类型转换,但是普通函数可以。

3.类模板

3.1类模板的定义格式

template <class T1,class T2.......>

class 类模板名

{

        类内成员的定

义;

};

#define  _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//下面是类模板
template <class t>
class Stack
{
public:t* _array;size_t _size;size_t _capacity;Stack(size_t cap=4){_array = new t[cap];//new一个t类型的数组_capacity = cap;_size = 0;}void pushstack(const t& date);//声明
};
template <class t>
void Stack<t>::pushstack(const t& date)//定义
{_array[_size++] = date;
}
int main()
{Stack <int> st1;//创建的时候必须添加模板参数<int>cout << st1._array << endl;Stack <double> st2;//模板参数<double>cout << st2._array << endl;return 0;
}

注意:类模板中函数放到类外定义的时候需要加上模板参数列表。

3.2类模板的实例化

类模板的实例化跟函数模板的实例化不同,类模板实例化需要在类模板的的名字后面加上<>,然后将实例化的类型放到<>中,同样类模板名字把并不是真正的类,实例化之后才是一个类名,然后用这个类来创建对象。可以理解为:模板名<实例化类型列表>  这个整体是一个类。


http://www.mrgr.cn/news/33234.html

相关文章:

  • Dependencies 工具
  • Redo与Undo的区别:数据库事务的恢复与撤销机制
  • A12S25-A2-RH,A12A35-A2-RH 安霸ABMBRELLA 图像传感器汽车记录主控芯片
  • 解方程(C语言)
  • 基于python的天气数据采集与可视化分析,对20个城市的天气适宜出行度分析
  • 软件测试的分类
  • 【软件资料集】系统培训方案(Word项目参考2024)
  • 面对外行同事对你的工作指手画脚,但说不到点子上的情况,可以采取以下策略来有效合作
  • 图书管理系统小程序的设计
  • 【Python】探索 TensorFlow:构建强大的机器学习模型
  • Deepin V23安装SecureCRT 9.5.2
  • VBA技术资料MF200:只能通过按钮关闭工作簿
  • 2024年研赛-华为杯数模竞赛C题论文首发+论文讲解+代码分享
  • JavaWeb——前端工程化(2/3):Vue项目简介(创建、目录结构、启动、配置端口)
  • 用java语言写一个表的查询操作
  • Java 每日一刊(第14期):抽象类和接口
  • 【OSS安全最佳实践】降低因操作失误等原因导致数据丢失的风险
  • 从Yargs源码学习中间件的设计
  • 考研数学精解【6】
  • [OpenGL]使用OpenGL绘制带纹理三角形
  • 不同编程语言的互相调用
  • js 一个数组合并到一个数组
  • 群晖套娃:群晖+飞牛fnOS二合一,群晖nas安装飞牛fnOS系统实录(飞牛fnOS初体验,如何挂载网盘视频,轻松实现影视刮削)
  • PHP项目中Vendor错误导致项目失败的解决方案
  • 检索索引对象中的重复值、删除重复值pandas.Index.duplicated
  • Python 3 元组