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++中模板里面还有很多的性质和知识,在我们学了更多的知识之后再进行补充和讲解。

相关推荐
ONE_PUNCH_Ge2 小时前
Go 语言变量
开发语言
幼稚园的山代王2 小时前
go语言了解
开发语言·后端·golang
晚风残2 小时前
【C++ Primer】第六章:函数
开发语言·c++·算法·c++ primer
满天星83035772 小时前
【C++】AVL树的模拟实现
开发语言·c++·算法·stl
weixin_456904273 小时前
基于.NET Framework 4.0的串口通信
开发语言·c#·.net
ss2733 小时前
手写MyBatis第107弹:@MapperScan原理与SqlSessionTemplate线程安全机制
java·开发语言·后端·mybatis
Mr_WangAndy3 小时前
C++设计模式_行为型模式_责任链模式Chain of Responsibility
c++·设计模式·责任链模式·行为型模式
麦麦鸡腿堡4 小时前
Java的动态绑定机制(重要)
java·开发语言·算法
时间之里4 小时前
【c++】:Lambda 表达式介绍和使用
开发语言·c++
Tiger_shl4 小时前
C# 预处理指令 (# 指令) 详解
开发语言·c#