【C++ 06】模板初阶

本文详细介绍了C++中的泛型编程,包括函数模板的概念、格式及其实例化(隐式和显式),以及类模板的定义、实现和实例化过程。通过实例展示如何使用模板提高代码复用性和适应性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🌈 Ⅰ 泛型编程

1. 泛型编程引入

  • 假设当前要实现交换两个变量的功能,那么就得根据实参的数据类型来对该函数进行重载。
  • 重载的函数只是数据类型不同而已,但是一旦要交换新类型的变量就得多重载一份函数。
  • 此时就需要使用 泛型编程 来将繁琐的流水线编程简单化。
void Swap(int& x, int& y)
{
	int tmp = x;
	x = y;
	y = tmp;
}

void Swap(double& x, double& y)
{
	double tmp = x;
	x = y;
	y = tmp;
}

void Swap(char& x, char& y)
{
	char tmp = x;
	x = y;
	y = tmp;
}

2. 泛型编程概念

  • 编写的代码与数据类型无关,任何数据类型都能使用编写的功能称为泛型编程。
  • 泛型编程是代码复用的一种手段,模板是泛型编程的基础。

🌈 Ⅱ 函数模板

1. 函数模板概念

  • 一个函数模板代表了一个单独的功能,一个函数模板就能够对某一个功能所有类型的数据实现。
  • 函数模板与参数的类型无关,只有在被使用时会进行参数化,根据实参的类型来完成函数的特化类型版本。

2. 函数模板格式

1. 函数模板格式

  • template:用来定义模板的关键字。
  • typename:用来定义模板参数的关键字。
template<typename T1, typename T2, ... , typename Tn>

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

2. 函数模板示例

template<typename T>	// T 可以表示任何数据类型

void Swap(T& x, T& y)	// 根据万用类型 T 创建函数模板
{
	T tmp = x;
	x = y;
	y = tmp;
}

在这里插入图片描述

3. 函数模板原理

  • 在上述示例中,Swap 函数压根就不存在。
  • 交换 int 型的和交换 char 型的调用的并不是同一个函数。
  • 函数模板只是一个模板,本身不是函数,而是编译器在知道了你要交换什么类型的数据,然后根据实参类型利用函数模板现场生成了一个交换具体类型的函数。
  • 如果在已经有了现成的具体函数,编译器会调用现成的函数
    • 前提是现成的函数要够好用,如果实参是 double ,现成函数的形参却是 int ,编译器还是会自己根据模板推演出一份 double 类型的函数。
  • 编译器根据 实参类型 + 函数模板 自动生成函数称为函数模板隐式实例化

在这里插入图片描述

4. 函数模板显式实例化

  • 隐式实例化:编译器根据实参和模板自动生成函数。
  • 显式实例化:指定模板参数的类型,并且强制调用模板。
    • 格式:函数名<指定模板参数类型>(实参);
Swap<double>(d1, d2);	// 指定模板参数为 double,并且编译器必须使用模板

🌈 Ⅲ 类的模板

1. 类模板定义格式

  • 类模板的定义和函数模板的大差不差,只不过两种模板实现的东西不同罢了。
template<typename T1, typename T2, ... , typename Tn>

class 类模板名
{
	该模板的成员变量和成员函数
};

2. 类模板实现示例

  • 定义一个用于实现数据结构中的栈的类模板 stack 模具。
  • stack 并不是具体的类,而是编译器根据被实例化的类型去生成具体类的模具。
template<typename T>

class stack
{
public:
	stack(){...}
	
	void push(const T& x)
	{
		// ...
	}
	~stack(){...}
	
private:
	T* _data;
	int _top;
	int _capacity;
};

2. 类模板的实例化

注意事项

  • 与函数模板的实例化不同,类模板实例化必须在类模板的名字后跟<>,然后将实例化的类型放在 <> 里。
  • 类模板的名字并不是真正的类,而实例化后的结果才算是真的类。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值