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

c++中的模板(1) -- 什么是模板

我们在写代码的时候,会遇到这样一个疑问,我们封装函数目的是为了封装一些常用的功能,实现这些功能,由于数据类型的规定带来的不方便。

比如:  以交换两个变量中的值为例。 

/*
  需求:  封装一个函数,用来实现交换变量之间的数据。
  我们将要交换的变量,作为参数传入到函数中,进行交换。

  但是,由于变量的数据类型不同,导致函数的参数类型也不同(但是我们必须传入与参数类型一致的数据),
  所以,我们需要重载多个swap函数,来兼容多种类型的交换
*/

void Swap(int& a, int& b) {
	int tmp = a;
	a = b;
	b = tmp;
}

void Swap(float& a, float& b) {
	float tmp = a;
	a = b;
	b = tmp;
}

void Swap(char& a, char& b) {
	char tmp = a;
	a = b;
	b = tmp;
}

int main(void) {
	// 整数类型
	int i1 = 10;
	int i2 = 20;

	Swap(i1,i2);

	cout << "i1=" << i1 << endl;
	cout << "i2=" << i2 << endl;

	// 浮点类型
	float f1 = 10.1f;
	float f2 = 20.1f;

	// 字符类型
	char c1 = 'a';
	char c2 = 'b';

    system("pause");

	return 0;
}

上面的代码,我们很明显能够发现一个问题:    实现了多个函数,但是函数实现其实没有什么区别,包括函数的形参。 都只是由于我们要处理的数据的类型不一样,就写了这么多的函数,但是其实函数实现都相差不多,这就导致我们写了很多重复的代码

那么如何能够让我们上面的代码进行优化呢?   

这就需要使用到c++的模板了。 

/*
  使用模板实现变量交换
*/

template <typename T>
void Swap(T& a, T& b) {
	T tmp = a;
	a = b;
	b = tmp;
}

template <typename T>
void printS(T& a,T& b) {
	cout << a << endl;
	cout << b << endl;
}

int main(void) {
	// 整数类型
	int i1 = 10;
	int i2 = 20;

	Swap(i1,i2);
	cout << "整形交换打印:" << endl;
	printS(i1,i2);

	// 浮点类型
	float f1 = 10.1f;
	float f2 = 20.1f;

	Swap(f1, f2);
	cout << "浮点数交换打印:" << endl;
	printS(f1, f2);

	// 字符类型
	char c1 = 'a';
	char c2 = 'b';

	Swap(c1, c2);
	cout << "字符交换打印:" << endl;
	printS(c1,c2);

    system("pause");
	return 0;
}

 上面代码,我们使用了模板,与上面代码进行对比,你会发现上面三个函数实现的功能,我们使用一个函数就实现了。很明显使得代码更加的简洁,当然更重要的是给我们带来了方便。

什么是模板?

从上面的例子不难看出,模板就是定义了一个虚拟类型,这个类型可以用来表示基本数据类型以及自定义的类型。

使用了模板定义的虚拟类型,我们就可以使用一段代码来处理不同数据类型的数据了

模板所支持的类型是宽泛的,没有限制的,我们可以使用任意类型来替换,这种编程方式称为泛型编程。

为什么要有模板? 

c++最开始设计的时候是没有模板的,由于数据结构在我们平时使用的很频繁,所以就希望在c++中封装一些关于数据结构常用的操作。 

但是,面临着一个问题,因为数据结构是一些对数据的处理,而且可以处理任何类型的数据(普通类型以及自定义类型等),但是c++是强类型语言,进行相应的操作,必须严格定义所需处理数据的类型(其实就是相应处理,只能处理固定类型),但是我们所要实现的数据结构,应该是可以处理任何的类型的。

 这样,c++就推出了模板的概念,就像上面一样,使用了模板,一个函数处理就能处理多种类型数据。


http://www.kler.cn/a/233746.html

相关文章:

  • 【mysql】使用宝塔面板在云服务器上安装MySQL数据库并实现远程连接
  • python高效处理大数据:将Excel10万数据分批插入MySQL数据库的实战代码
  • 【QT】QSS
  • 轻松上手:使用Docker部署Java服务
  • Qt 实现文件监控程序
  • vue3项目中内嵌vuepress工程两种实现方式
  • Kotlin和Java 单例模式
  • 【Linux】Shell编程
  • 【ASP.NET Core 基础知识】--部署和维护--日志记录和错误处理
  • C++中类的6个默认成员函数【构造函数】 【析构函数】
  • Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
  • k8s-常用工作负载控制器(更高级管理Pod)
  • 基于 SpringBoot 和 Vue.js 的权限管理系统部署教程
  • 备战蓝桥杯---动态规划之背包问题引入
  • 基于opencv-python模板匹配的银行卡号识别(附源码)
  • 基于tomcat运行jenkins常见的报错处理
  • Linux---线程
  • uv机器电机方向极性
  • Go 语言 for 的用法
  • 《剑指 Offer》专项突破版 - 面试题 36 : 详解后缀表达式(C++ 实现)
  • 计算机毕业设计 | SSM超市进销存管理系统(附源码)
  • 鸿蒙原生应用再添新丁!央视新闻 入局鸿蒙
  • 24 SEMC相关
  • VSTO打包Word插件WPS也支持
  • Go语言每日一练——链表篇(四)
  • 自动化测试工具