首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【C++】—通俗易懂的理解C++中的模板

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

作者头像
_孙同学
发布2024-10-21 21:07:17
发布2024-10-21 21:07:17
3490
举报
文章被收录于专栏:技术分享技术分享

前言:

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

💞1.函数模板

💞1.1 函数模板的概念

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

💞1.2 函数模板的格式

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

代码语言:javascript
复制
template<typename T>
void Swap(T& left, T& right)
{
	T tmp = left;
	left = right;
	right = tnmp;
}

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

💞1.3 函数模板的原理

函数模板并不是一个函数,而是编译器按使用方式而生成特定类型函数的一个摸具。

在编译阶段,编译器会根据传来的实参类型来生成出对应的类型函数以供使用。

💞1.4 函数模板的实例化

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

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

代码语言:javascript
复制
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;
}

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

代码语言:javascript
复制
int main()
{
	int i = 10;
	double l = 30.0;

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

	return 0;
}

💞1.5 模板参数的匹配原则

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

代码语言:javascript
复制
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.对于非模板函数和能实例化出同类型的模板函数,编译器会优先调用非模板函数,不会从模板函数产生一个实例。如果模板函数可以产生一个更匹配的函数,那么将选择模板函数。

代码语言:javascript
复制
//非模板函数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 类模板名 {  类中成员定义 };

代码语言:javascript
复制
//类模板
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计算并返回点到原点的距离。

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

代码语言:javascript
复制
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++模板的介绍,如有错误望各位大胆指出,如果这篇文章帮助到了你,记得关注,点赞,收藏, 欲知下篇如何,关注我,请尽请期待

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言:
  • 💞1.函数模板
    • 💞1.1 函数模板的概念
    • 💞1.2 函数模板的格式
    • 💞1.3 函数模板的原理
    • 💞1.4 函数模板的实例化
    • 💞1.5 模板参数的匹配原则
  • 💞2.类模板
    • 💞1.1 类模板的概念
    • 💞1.2 类模板的格式
    • 💞1.3 类模板的优点
  • 最后:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档