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;
}
相关推荐
小灰灰搞电子2 分钟前
Qt 重写QRadioButton实现动态radioButton源码分享
开发语言·qt·命令模式
by__csdn8 分钟前
Vue3 setup()函数终极攻略:从入门到精通
开发语言·前端·javascript·vue.js·性能优化·typescript·ecmascript
喵了meme17 分钟前
C语言实战5
c语言·开发语言
廋到被风吹走42 分钟前
【Java】常用设计模式及应用场景详解
java·开发语言·设计模式
Sammyyyyy1 小时前
DeepSeek v3.2 正式发布,对标 GPT-5
开发语言·人工智能·gpt·算法·servbay
Luna-player1 小时前
在前端中,<a> 标签的 href=“javascript:;“ 这个是什么意思
开发语言·前端·javascript
小草cys1 小时前
项目7-七彩天气app任务7.4.2“关于”弹窗
开发语言·前端·javascript
小鸡吃米…1 小时前
Python PyQt6教程三-菜单与工具栏
开发语言·python
aini_lovee2 小时前
寻找 MAC 协议的 MATLAB 仿真
开发语言·macos·matlab
獭.獭.2 小时前
C++ -- STL【unordered_set和unordered_map的使用】
c++·stl·unordered_map·unordered_set