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

【轻敲stl的大门】函数模板和类模板

image-20221024160250226

文章目录

  • 泛型编程---模板
  • 函数模板
  • 类模板
      • 最后我在这里祝各位佬10.24程序员节快乐呀~~

(可以不看)背景

某一天你的老板叫你把几个数据交换一下,其中有整数、小数,名字等等。于是你开始码字,不一会功夫就做完了一个整形的和浮点型交换函数。

image-20221023184024368

于是你想把代码实现给老板看看反向有没有问题,老板看完后咔咔给你几个大嘴巴子说:“这个太麻烦拉,我还要用眼睛去看小数和整数来区分的使用函数接口,那如果是小数和和整数,名字交换呢?那是不是又得加一个接口?那我还需要你干嘛?我自己去excel表上搞算了!

这时候你慌了,你被老板批评得找不着北了。这时候就需要函数模板又或者是类模板上场拉!

泛型编程—模板

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。

image-20221023185525157

函数模板

语法:template< typename T>

{template-模板关键字关键字typename-(或者是class但不能用struct)定义模板参数关键字

T:自定义模板的名字}

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

2.它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器。(编译器化身打工人,我则是懒狗)

3.在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。

4.用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化

隐式实例化:让编译器根据实参推演模板参数的实际类型

image-20221023190637941

 template<typename S>
 
 void swap(S& x, S& y)
 {
	 S tmp = x;
	 x = y;
	 y = tmp;
 }

 int main()
 {
	 int a = 5, b = 7;
	 double c = 3.40, d = 5.20;
	 swap(a, b);
	 swap(c, d);
	 //swap(a, d);---错误实例
	 //为什么不能让int类型和double类型互换?推演模板实例化在调用参数之前,这时候推演模板实例化模板参数(S)只有一个,出现两个参数类型编译器不知道要推演哪一个则会报错;这时候还轮不到调用参数的隐式转化(整形提升-数据截断等等);
	// 就算是发生参数的隐式类型转化,参数a会先拷贝出一份临时变量然后再传给函数进行调用参数x-临时变量具有常性,那么参数x要加const,但参数x引用加const又怎么交换呢?
	 return 0;
 }

那么当出现两种参数类型时,我们应该怎么做呢?

这里有三种解决方案。

1.强制转化(显示类型转化)

image-20221024144320417

2.显示实例化

语法:函数< 要显示实例化的参数类型>(参数1,参数2…)

image-20221024145054549

3.多个参数模板

image-20221024145908493

另:函数模板和相同函数可以同时存在吗?可以!

但是我们通过调试发现当出现相同类型的函数和函数模板时编译器会优先选择函数!(得出结论函数也是懒狗)

image-20221024150623607

而且调用模板的地址是相同的!看具体满足的需求来优先调用函数还是函数模板!

image-20221024155501212

类模板

类模板一般显示实例化

1.类模板自定义格式:template<class T1, class T2, …, class Tn>

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

比如:Stack-类名;Stack< int >-类型

image-20221024154325752

这里贴一份代码强化理解

template<typename T>
class Stack
{
public:
	Stack(int capacity = 4)//构造函数
	{
		cout << "Stack(int capacity = )" << capacity << endl;

		_a = (T*)malloc(sizeof(T) * capacity);
		if (_a == nullptr)
		{
			perror("malloc fail");
			exit(-1);
		}

		_top = 0;
		_capacity = capacity;
	}


	~Stack()//析构函数
	{
		cout << "~Stack()" << endl;

		free(_a);
		_a = nullptr;
		_top = _capacity = 0;
	}

	void Push(T x)
	{
		// ....
		// 扩容
		_a[_top++] = x;
	}

private:
	T* _a;
	int _top;
	int _capacity;
};

最后我在这里祝各位佬10.24程序员节快乐呀~~

相关文章:

  • 网络安全红队常用的攻击方法及路径
  • IMX6ULL学习笔记(10)——通过TFTP烧录Linux内核
  • 【C++】STL —— String类不会怎么办? 看文档(万字详解)
  • Spring中@Autowired注解实现原理
  • 干货!手把手教你穿透内网
  • 人家网站都免费了,你还用Python去爬?
  • 2023年上半年软考中、高级 了解一下
  • Android 13 新特性及适配指南
  • 分布式事务Seata源码解析十:AT模式回滚日志undo log详细构建过程
  • 链路状态路由协议 OSPF (一)
  • 利用Redis实现分布式长效缓存
  • c# 的一些简单用法
  • 【QT开发专题-天气预报】16.更新 UI 界面
  • D-star算法简介及相关思考
  • Java POI Word 转 PDF
  • Apache Pulsar 2.1 重磅发布
  • Consul Config 使用Git做版本控制的实现
  • Date型的使用
  • Java超时控制的实现
  • Linux后台研发超实用命令总结
  • Material Design
  • Netty源码解析1-Buffer
  • Redis学习笔记 - pipline(流水线、管道)
  • socket.io+express实现聊天室的思考(三)
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • Windows Containers 大冒险: 容器网络
  • 二维平面内的碰撞检测【一】
  • 浮动相关
  • 两列自适应布局方案整理
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • NLPIR智能语义技术让大数据挖掘更简单
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • (4) PIVOT 和 UPIVOT 的使用
  • (C语言)逆序输出字符串
  • (二)JAVA使用POI操作excel
  • (二)windows配置JDK环境
  • (算法)Game
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)iOS字体
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)大道至简,职场上做人做事做管理
  • (转)大型网站架构演变和知识体系
  • .Net 8.0 新的变化
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .py文件应该怎样打开?
  • // an array of int
  • @SentinelResource详解
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务