C++模板初阶

 感谢大佬的光临各位,希望和大家一起进步,望得到你的三连,互三支持,一起进步

个人主页LaNzikinh-CSDN博客

收入专栏:C++_LaNzikinh篮子的博客-CSDN博客

其他专栏:c语言基础_LaNzikinh篮子的博客-CSDN博客

数据结构习题_LaNzikinh篮子的博客-CSDN博客

初阶数据结构_LaNzikinh篮子的博客-CSDN博客

文章目录


前言

我们前面讲了C ++中内存的管理,对比了他和C语言动态开辟空间和内存之间的优点与缺点,那为什么C++比C语言要好很多呢?今天我们来学到这个模板概念就一个更深刻的认知了。说到模板就要提到泛型编程


一.泛型编程

泛型编程是一种软件工程方法论,强调使用高度抽象的方式编写算法和数据结构,使得同一套代码可以适用于多种数据类型。这种编程范式在许多现代编程语言中都得到了支持,允许开发者编写更加灵活、可重用的代码,同时保持类型的安全性。

例子:如何实现一个通用的交换函数呢?

C语言中

void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
void Swap(double& left, double& right)
{
double temp = left;
left = right;
right = temp;
}
void Swap(char& left, char& right)
{
char temp = left;
left = right;
right = temp;
}
......

如果在C语言中要是一个通用交换函数的话,就非常的冗余,要把每个类型都写下来,非常的麻烦,但是在C++中,可以利用泛型编程的思想,用模板来写,就会轻松很多

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

几行代码直接搞定 

二.模板

模板的意思就是字面的意思,去创造一个模板,然后不管你是什么类型的东西,都可以直接使用

在C++中,模板分为2类,一种是函数模板,一种是类模板

2.2函数模板

在进入函数模板之前,我们先要知道模板的一个关键字template,在写模板前都要写这个关键字,然后就是typename,用来规定类型参数名,也可以使用class

原理:函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。 所以其实模板就是将本来应该我们做的重复的事情交给了编译器

2.3函数模板的实例化

函数模板的实例化分为两种,一种就是隐式实例化一种就是显示实例化,那什么是函数模板的实例化呢?用不同类型的参数使用函数模板时,称为函数模板的实例化

该语句不能通过编译,因为在编译期间,当编译器看到该实例化时,需要推演其实参类型通过实参a1将T推演为int,通过实参d1将T推演为double类型,但模板参数列表中只有一个T, 编译器无法确定此处到底该将T确定为int或者double类型而报错。

解决方法一:显示实例化

显式实例化:在函数名后的<>中指定模板参数的实际类型

如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。

解决方法二:强制类型转换

2.4类模板

如果我要实现一个栈,我要存放很多类型,我总不可能写很多个栈,你要存放哪个类型我就放在哪个栈里面,这样子的话就会非常的麻烦,这个时候呢,类模板就可以派上用场了,我直接写一个栈的模板,不管你是什么类型,全都可以用。

template<typename T>
class Stack
{
public:
	Stack(size_t capacity = 4)
	{
		_array = new T[capacity];
		_capacity = capacity;
		_size = 0;
	}
	void Push(const T& data);
private:
	T* _array;
	size_t _capacity;
	size_t _size;
};

注意:模版不能声明和定义分离到两个文件.h 和.cpp会出现链接错误。

2.5类模板的实例化

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的 类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

Stack<int> st1; 
Stack<double> st2;

stack是类名,st1,st2才是类


总结

在C++中模板里面还有很多的性质和知识,在我们学了更多的知识之后再进行补充和讲解。

  • 61
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 41
    评论
评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaNzikinh篮子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值