C++模版初阶

1.函数模版

1.写法与作用

cpp 复制代码
template<class T>
T add(T a, T b)
{
	return a + b;
}

模版本质是为了适应指定类型,而不用写多个函数重载完成同一功能。

这个加法函数就可以适应int、double等类型的加法。

2.推导实例化

cpp 复制代码
//推导实例化
int a = 0, b = 0;
double c = 3.0, d = 4.0;
int e = add(a, b);
double f = add(c, d);

在这里模版函数会识别实参的类型来推导那个T类型是什么类型。

3.显式实例化

cpp 复制代码
//显式实例化
int a = 0, b = 0;
double c = 3.0, d = 4.0;

//指定T类型为int类型
int e = add<int>(a, b);
//指定T类型为double类型
double f = add<double>(c, d);

2.类模版

cpp 复制代码
template<class T>
class Stack
{
public:
	//实现了可以用栈存储不同类型的数据的功能
	Stack(int n = 4)
		:_array(new T[n])
		,_size(0)
		,_capacity(n)
	{}

	~Stack()
	{
		delete[] _array;
		_array = nullptr;
		_size = _capacity = 0;
	}

	void Push(const T& x);

private:
	T* _array;
	size_t _capacity;
	size_t _size;
};


//声明与定义分离,需要指定类域与类模版
 template<class T>
void Stack<T>::Push(const T& x)//用引用减少拷贝构造,提高效率
{
	if (_size == _capacity)
	{
		T* tmp = new T[_capacity * 2];
		memcpy(tmp, _array, sizeof(T) * _size);
		delete[] _array;

		_array = tmp;
		_capacity *= 2;
	}

	_array[_size++] = x;
}


int main()
{
	// 类模板都是显示实例化
	Stack<int> st1; // int
	st1.Push(1);
	st1.Push(2);
	st1.Push(3);

	Stack<double> st2; // double
	st2.Push(1.1);
	st2.Push(1.1);
	st2.Push(1.1);

	Stack<double>* pst = new Stack<double>;
	//...
	delete pst;

	return 0;
}
相关推荐
张槊哲几秒前
函数的定义与使用(python)
开发语言·python
北辰浮光9 分钟前
[Mybatis-plus]
java·开发语言·mybatis
超爱笑嘻嘻13 分钟前
shared_ptr八股收集 C++
c++
我想进大厂32 分钟前
图论---朴素Prim(稠密图)
数据结构·c++·算法·图论
我想进大厂37 分钟前
图论---Bellman-Ford算法
数据结构·c++·算法·图论
光而不耀@lgy43 分钟前
C++初登门槛
linux·开发语言·网络·c++·后端
lkbhua莱克瓦241 小时前
用C语言实现——一个中缀表达式的计算器。支持用户输入和动画演示过程。
c语言·开发语言·数据结构·链表·学习方法·交友·计算器
Mr__Miss1 小时前
面试踩过的坑
java·开发语言
啊丢_1 小时前
C++——Lambda表达式
开发语言·c++
Chh07152 小时前
《R语言SCI期刊论文绘图专题计划》大纲
开发语言·r语言