C++模板初阶

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

个人主页LaNzikinh-CSDN博客

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

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

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

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

文章目录


前言

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


一.泛型编程

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

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

C语言中

cpp 复制代码
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++中,可以利用泛型编程的思想,用模板来写,就会轻松很多

cpp 复制代码
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类模板

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

cpp 复制代码
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类模板的实例化

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

cpp 复制代码
Stack<int> st1; 
Stack<double> st2;

stack是类名,st1,st2才是类


总结

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

相关推荐
名字还没想好☜3 小时前
Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式
开发语言·数据库·python·字符串格式化·f-string
·薯条大王4 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
一壶浊酒..6 小时前
Scrape Webpack练习
开发语言·javascript·webpack
命运之光7 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
命运之光7 小时前
【C语言完整代码】图书管理系统:图书馆场景下的增删改查实战
c语言·开发语言
猿长大人8 小时前
C# | Serilog 新手入门
开发语言·c#·.net·log
hansang_IR8 小时前
【题解】LC:倍增 / 区间并查集(Range Parallel Unionfind)
c++·算法·并查集
东东最爱敲键盘8 小时前
day7.c++继承
c++
在世修行9 小时前
从零打造 C# 工业视觉检测系统(七):串口通信 SerialPort 封装与开发
开发语言·c#·modbus rtu·rs232/rs485
沫璃染墨9 小时前
《从零入门Linux系统篇(十五):系统工具篇·六——GDB调试器详解:从程序执行控制到高级调试技巧》
linux·运维·服务器·c语言·c++