C++初阶–类型模板

文章目录

  • 泛型编程
  • 函数模板
    • 使用
    • 通用加法函数
    • 多模板参数
    • 必须用实例化
  • 函数模板的原理
  • 类模板
    • 使用
  • 注意事项

泛型编程

先看一个例子:

这是一些对于Swap重载的函数,区别是类型不同;
虽然能够重载使用,但代码复用率比较低,如果我们让别人直接调用我们的函数,只使用整形类型的Swap(),那么其他函数就有点浪费了;
而且代码的维护性比较低,一个出错可能会导致重载都出错。

所以在C++中,就有了模板的概念。
类似于你给一个普通模板,填入不同的数据,然后进行套用;
在编程中我们称之为泛型编程

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。

模板可以分类为:

函数模板

函数模板是实现泛型编程的一种方式。通过函数模板,可以编写一种通用的函数,可以适用于多种类型的数据,可以在不同的上下文中进行重复使用。

语法格式:
template < typrname T >
返回值类型 函数名(参数列表)
{
函数内容
}

在上述格式中,template < typrname T > 表示定义了一个模板,T是一个占位符类型,它可以代表任何类型。

使用

#include<iostream>
using namespace std;

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

//模板的演示
int main()
{
	int a = 1, b = 2;
	double c = 1.2, d = 3.4;

	Swap(a, b);
	Swap(c, d);

	return 0;
}

注意:

通用加法函数

template<class T>
T Add(T a, T b)
{
	return a + b;
}

int main()
{
	int a = 1, b = 2;
	cout<<Add(a, b)<<endl;
	double c = 1.2, d = 2.4;
	cout << Add(c, d) << endl;

//显示实例化
	cout<<Add<int>(1, 2)<<endl;
	cout<<Add<double>(2, 3.44)<<endl;
	return 0;
}

实例化

注意

我们可以使用多模板参数。

多模板参数

template<class X,class Y>
void func(const X& x, const Y& y)
{
	cout << x <<" " << y << endl;
}


//多模板参数
int main()
{
	func(1, 2.2);
	func(1, 1);
	func(2.2, 2.2);
}

必须用实例化

template<class T>
T* f(int n)
{
	T* p = new T[n];
	return p;
}

函数模板的原理

当你使用函数模板进行函数调用时,编译器会根据传入的参数类型来确定需要实例化的模板参数类型。编译器会查找匹配的模板定义,并将实际的参数类型替换为函数参数类型,生成对应的函数代码。

类模板

template<class T1, class T2, ..., class Tn>
class 类模板名
{
 // 类内成员定义
};

使用

template<class T>
class Stack
{
private:
	T* _a;
	int _top;
	int _capacity;
public:
	Stack(int capacity = 4)
		:_a(new T[capacity]),
		_top(0),
		_capacity(capacity)
	{
		cout << "Stack(int capacity = 4)" <<endl;
	}

	~Stack()
	{
		cout << "~Stack()" << endl;

		delete[] _a;
		_a = nullptr;
		_top = 0;
		_capacity = 0;
	}
};

int main()
{
	Stack<int> s1;
	Stack<double> s2;

	return 0;
}

注意事项


文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年12月12日
下一篇 2023年12月12日

相关推荐