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

【C++】—通俗易懂的理解C++中的模板

在这里插入图片描述

文章目录

  • 前言:
  • 💞1.函数模板
    • 💞1.1 函数模板的概念
    • 💞1.2 函数模板的格式
    • 💞1.3 函数模板的原理
    • 💞1.4 函数模板的实例化
    • 💞1.5 模板参数的匹配原则
  • 💞2.类模板
    • 💞1.1 类模板的概念
    • 💞1.2 类模板的格式
    • 💞1.3 类模板的优点
  • 最后:

前言:

模板就相当于我们高中写作文时套用的作文模板,在大多数情况下是可以通用的。那么我们要是在编程中也想利用这种方式呢?那就不得不提起泛型编程——编写与类型无关的通用代码,是代码复用的一种体现。模板只是泛型编程的基础。模板又可以分为函数模板和类模板。

💞1.函数模板

💞1.1 函数模板的概念

  函数模板代表了一个函数的家族,这个函数不受类型的限制,比如可以传int类型也可以传double类型,在使用时被参数化,根据实参的类型而产生特定类型的函数。

💞1.2 函数模板的格式

template< typename T>
返回值类型 函数名(参数列表)
{}

template<typename T>
void Swap(T& left, T& right)
{
	T tmp = left;
	left = right;
	right = tnmp;
}

🎯注意:template是定义模板参数的关键字,也可以使用class但不能用struct代替class

💞1.3 函数模板的原理

函数模板并不是一个函数,而是编译器按使用方式而生成特定类型函数的一个摸具。
在这里插入图片描述
在编译阶段,编译器会根据传来的实参类型来生成出对应的类型函数以供使用。

💞1.4 函数模板的实例化

不同类型的参数使用模板时,称为函数模板的实例化,模板参数实例化又分为隐式实例化显式实例化

 🍒 隐式实例化:让编译器根据实参来推演出对应的函数类型

template<typename T>
T Add(T& a, T& b)
{
	return a + b;
}
int main()
{
	int x = 1; int y = 2;
	Add(x, y);  //隐式实例化

	double m = 2.0; double n = 3.0;
	Add(m,n); //隐式实例化

	//但不能像下面这样传,一个传int类型,一个传double类型,因为模板参数列表中只有一个T,编译器无法确定T为int还是double
	//Add(x,m);

	//如果非要传如何处理呢? 1.强制类型转化一下 2.使用显式实例化

	return 0;
}

 🍒 显式实例化:在函数名后加上指定类型

int main()
{
	int i = 10;
	double l = 30.0;

	Add<int>(i,l); //显式实例化

	return 0;
}

💞1.5 模板参数的匹配原则

1. 非模板函数和模板函数可以同时存在,模板函数可以被实例化成这个非模板函数,在调用时编译器会优先调用非模板函数

int Add(int left, int right)
{
	return left + right;
}

template<typename T>
T Add(T left, T right)
{
	return left + right;
}

int main()
{
	Add(1, 2);//调用非模板函数
	
	Add<int>(1,2);//调用编译器特化的Add版本

	return 0;
}

2.对于非模板函数和能实例化出同类型的模板函数,编译器会优先调用非模板函数,不会从模板函数产生一个实例。如果模板函数可以产生一个更匹配的函数,那么将选择模板函数。

//非模板函数int加法函数
int Add(int left, int right)
{
	return left + right;
}
//通用的加法函数
template<typename T1,typename T2>
T1 Add(T1 left, T2 right)
{
	return left + right;
}

int main()
{
	Add(1,2); //与非模板函数匹配,不需要函数模板实例化

	Add(1,2.0);//模板函数可以生成更加匹配的函数,编译器会根据实参生成更加匹配的Add函数。

	return 0;
}

3. 模板函数不支持自动类型转换,但普通函数可以进行自动类型转换

💞2.类模板

💞1.1 类模板的概念

  类模板允许程序员编写与类型无关的代码,通过使用类模板,就可以生成特定类型的类,而无需为每种类型都编写特定的代码。

💞1.2 类模板的格式

template < typename T>
class 类模板名
{
 类中成员定义
};

//类模板
template<class T>
class Point 
{
public:
	T x, y;
	Point(T a,T b)
		:x(a)
		,y(b)
	{}

	T distanceFromOrigin()
	{
		return std::sqrt(x * x + y * y);
	}
};

Print类模板中有两个变量xy,它们都是类型T.构造函数接受两个参数来初始化xydistanceFromOrigin计算并返回点到原点的距离。

要使用类模板,我们需要指定模板参数的类型,并且创建该类型的对象。例如:

int main()
{
	Point<int> a(3, 4);
	cout << a.distanceFromOrigin() << endl;

	Point<double> b(2.5,3.5);
	cout << b.distanceFromOrigin() << endl;

	return 0;
}

💞1.3 类模板的优点

&emsp;类模板的好处是提高了类型的安全性,减少了代码的重复量。通过使用类模板,我们可以编写与类型无关的代码,并在需要时生成特定的类。

最后:

以上就是对c++模板的介绍,如有错误望各位大胆指出,如果这篇文章帮助到了你,记得关注,点赞,收藏, 欲知下篇如何,关注我,请尽请期待


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

相关文章:

  • css中 global 和 deep(两个样式穿透) 区别
  • 堡垒机——基础
  • Educational Codeforces Round 170 D 题纯 DP 思路
  • 新兴的安全职业挑战
  • 滚雪球学Redis[4.3讲]:Redis Cluster的架构与优化探究:从原理到实践
  • 【Rockchip android10 Root Permission root权限】
  • 30 天 Python 3 学习计划
  • 【Flutter】Dart:泛型
  • TDD(测试驱动开发)是否已死?
  • LabVIEW提高开发效率技巧----事件触发模式
  • MFC给编辑框(Edit)控件增加文件拖入的支持
  • LabVIEW离心泵监测系统
  • 如何使用ssm实现超市管理系统
  • C语言[函数调用数据传输]
  • itertools.chain() 函数详解
  • 从RNN讲起(RNN、LSTM、GRU、BiGRU)——序列数据处理网络
  • 《鸟哥的Linux私房菜基础篇》---2 Linux的档案与目录
  • C++一个很好的计时方法
  • 益安宁丸,国药准字,值得信赖
  • 猜数字小游戏