栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++模板

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++模板

为了提高代码的复用率,C++中引入了模板--告诉编译器一个模版,让编译器根据不同的类型利用该模板来生成代码。

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本,以此来提高代码的复用率。

模板格式:template,T1,T2...就会根据所传实参的类型来产生特定的版本。typename是定义模板的关键字,也可用class来代替,如template等。

1.函数模板

用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。 隐式实例化:编译器根据实参类型推导模板参数的类型 显示实例化:在函数名后加<>来指定模板参数的实际类型 注意:模板参数必须要和模板相邻,模板函数的声明和定义必须在同一个文件。 如果传入了两个不同类型的参数就会导致编译器无法推导参数类型从而报错, 此时有两种处理方式:1. 用户自己来强制转化  2. 使用显式实例化  3.设置两个不同的模板参数。 一个非模板函数可以和一个同名的函数模板同时存在,如果条件相同时,会优先调用非模板函数, 但是如果模板可以生成一个更好的函数话,就会调用模板生成的函数。

由于普通函数制定了参数类型,所以会自动进行类型转换。

2.类模板

类模板的成员函数本身也是模板函数!!!

类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中,类模板名字不是真正的类,而实例化的结果才是真正的类。
template
class Stack
{
public:
	Stack(T capicty=10)
		:_top(0)
		, _a(nullptr)
		, _capicty(10)
	{
		if (capicty > 0)
		{
			_capicty = capicty;
			_a = new T[_capicty];
		}
	}

	~Stack()
	{
		delete[]_a;
		_top = _capicty = 0;
	}

	void stackpush(T n);//判断在同一文件内声明和定义是否可以分离

	const T& stacktop()
	{
		if (_top <= 0)
		{
			cout << "error" << endl;
			return 0;
		}
		return _a[_top - 1];
	}

	void stackpop()
	{
		if (_top <= 0)
		{
			cout << "error" << endl;
		}
		else
			_top--;
	}
	
	bool empity()
	{
		return _top == 0;
	}

private:
	T* _a;
	int _top;
	int _capicty;
};

//类模板中函数放在类外进行定义时,需要加模板参数列表
template
void Stack::stackpush(T n)
{
	if (_top == _capicty)
	{
		T* tmp = new T[_capicty * 2];
		memcpy(tmp, _a, sizeof(T) * _top);
		_a = tmp;
	}
	_a[_top] = n;
	_top++;
}

int main()
{
    Stack st(5);
    return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1037262.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号