C++——模版

前言:哈喽小伙伴们好久不见,这是2024年的第一篇博文,我们将继续C++的学习,今天这篇文章,我们来习一下------模版。


目录

一.什么是模版

二.模版分类

1.函数模版

2.类模板

总结


一.什么是模版

说起模版,我们都很容易想到套模版这个词汇:给你一个固定的格式,然后按照这个格式去完成你的作品之类的

而我们C++中的模版也确实如此,它包括函数模版和类模版两种,它的格式为:

template<typename/class T1,.......>

void fun(T1 .....)

其中template是定义模版的关键字 ,而typename和class则是定义模版参数的关键字 ,二者都可以使用,模版的参数可以不止一个T1就代表一个要套用模版的参数类型而T1并不是固定的写法,而是因为类型的英文为type而一般情况下都默认为T

要注意的是定义模版之后,要使用模版的函数要紧挨定义,二者中间不能有任何其他代码


二.模版分类

1.函数模版

我们经常使用swap交换函数 这个简单的函数,但是有一个问题是,普通的函数只能定义单一的参数类型,就算可以使用typedef来重定义在改变类型时我们也需要不断的修改,这依然不是很方便。

所以我们引入了函数模版 这个概念,使用函数模版定义的函数,无论传入任意类型的参数,都可以实现其功能

下面我们就以swap交换函数为例来介绍模版的具体用法:

cpp 复制代码
#include<iostream>
using namespace std;
template<typename T>
void Swap(T& a, T& b)
{
	T temp = a;
	a = b;
	b = temp;
}
int main()
{
	int a = 1;
	int b = 2;
	Swap(a, b);
	cout << a << ' ' << b << endl;
	double x = 1.1;
	double y = 2.2;
	Swap(x, y);
	cout << x << ' ' << y << endl;

}

如上,套用模版的函数,其参数类型即为T,随后在使用时,我们只需要将要交换的数据传入,T便会接收并自动转换为该实参的类型,即可完成不同类型的实参共用一个函数的结果:

但是这样的写法,却只能满足相同类型实参直接的交换,如果想要操作不同类型的实参,则需要模版函数也存在同样数量的参数类型数量:

cpp 复制代码
#include<iostream>
using namespace std;

template<typename T1,typename T2>

void Add(T1 a, T2 b)
{
	cout<< a + b <<endl;
}
int main()
{
	int a = 1;
	double b = 2.2;
	Add(a, b);

	return 0;
}

在调用函数模版时,T1便会接受a的类型,T2则接收b的类型,结果如下:

除此之外,一个模版函数还可以与一个同名的非模版函数同时存在,这类似于函数重载

cpp 复制代码
#include<iostream>
using namespace std;

template<typename T1,typename T2>

void Add(T1 a, T2 b)
{
	cout<< a + b <<endl;
}
void Add(int a, int b)
{
	cout << a + b << endl;
}
int main()
{
	int a = 1;
	int c = 2;
	double b = 2.2;
	Add(a, c);
	Add(a, b);

	return 0;
}

当这种情况存在时,Add函数会默认先去调用非模版参数去判断参数类型是否一致,一致则使用该非模版函数,不一致则去调用模版函数


2.类模板

类模版的写法就和函数模版类似了,其作用都是将一些类型不确定或是经常改变的变量的类型用模版去代替。比如我们实现一个顺序表:

cpp 复制代码
template<typename T>
class Qlist
{
public:
	void Pushback(T& a, T n)
	{
		....
	}
private:
	T* _a;
	int _size;
	int _capacity;
};
int main()
{
	Qlist<int> q;
	return 0;
}

我们只需要在创建顺序表时给出数据类型即可


总结

模版的内容比较简单,就分享到这里。

喜欢博主文章的小伙伴记得一键三连,我们下期再见!

相关推荐
vyuvyucd19 小时前
C++ vector容器完全指南
c++
liulilittle19 小时前
XDP VNP虚拟以太网关(章节:三)
网络·c++·网络协议·信息与通信·通信·xdp
leiming619 小时前
c++ find_if 算法
开发语言·c++·算法
yuanmenghao19 小时前
自动驾驶中间件iceoryx - 内存与 Chunk 管理(三)
数据结构·c++·算法·链表·中间件·自动驾驶
_OP_CHEN19 小时前
【算法基础篇】(四十三)数论之费马小定理深度解析:从同余性质到乘法逆元
c++·算法·蓝桥杯·数论·acm/icpc
茶猫_20 小时前
C++学习记录-旧题新做-链表求和
数据结构·c++·学习·算法·leetcode·链表
广州服务器托管20 小时前
[2026.1.6]WINPE运维版20260106,带网络功能的PE维护系统
运维·开发语言·windows·计算机网络·个人开发·可信计算技术
a努力。20 小时前
京东Java面试被问:双亲委派模型被破坏的场景和原理
java·开发语言·后端·python·面试·linq
王老师青少年编程20 小时前
信奥赛C++提高组csp-s之并查集(案例实践)1
数据结构·c++·并查集·csp·信奥赛·csp-s·提高组
冰暮流星20 小时前
javascript赋值运算符
开发语言·javascript·ecmascript