C++的函数模板和类模板

函数模板 : 就是允许编写依次函数定义然后用于不同数据类型,而不用每种类型单独编写函数
( 可以类比C语言中的宏定义来对比认知 )
使用 template 关键字进行模板定义

#include <iostream>
#include <string>

using namespace std;
const int ARRAY_LEN = 10;

template <typename T>
/*  或者 template <class T> (typename 和 class 在模板定义中是等价的)
*	T : 函数中数据类型可以是 T; 即该模板参数
*	[注意!!!] 在template语句与函数模板定义语句之间不允许插入别的语句
*/
T getArrayMaxValue(T* array, int size)
{
	cout << "模板重载函数 1 调用" << endl;
	T max = array[0];
	for (size_t i = 1; i < size; i++)
	{
		if (max < array[i]) {
			max = array[i];
		}
	}
	return max;
}
// 和一般函数一样,函数模板也可以重载
template <class T>
T getArrayMaxValue(T* array, int size, int second)
{
	cout << "模板重载函数 2 调用" << endl;
	T max = array[0];
	for (size_t i = 1; i < size; i++)
	{
		if (max < array[i]) {
			max = array[i];
		}
	}
	return max;
}
// 函数模板与同名的非模板函数也可以重载。
// (调用顺序: find非模板函数,找到则调用,没有找到则find函数模板,实例化产生一个匹配的模板参数)
int getArrayMaxValue(int* array, int size, int second)
{
	cout << "非模板函数调用" << endl;
	int max = array[0];
	for (size_t i = 1; i < size; i++)
	{
		if (max < array[i]) {
			max = array[i];
		}
	}
	return max;
}

类模板 : 与函数模板类似,就是创建一个通用类,可以实例化各种数据类型

template <class T>
class MyStack
{
public:
	MyStack()
	{

	}
	~MyStack()
	{

	}
	void myStackInit(void)
	{
		top = 0;
	}
	void myStackPush(T element)
	{
		if (top == ARRAY_LEN)
		{
			cout << "栈空间元素已满,入栈失败" << endl;
			return;
		}
		stack[top++] = element;
	}
	T myStackPop()
	{
		if (0 == top)
		{
			cout << "栈空间元素为空,出栈失败" << endl;
			return 0;
		}
		return stack[--top];
	}
	void display()
	{
		for (size_t i = 0; i < top; i++)
		{
			cout << "stack[" << i;
			cout << "] = " << stack[i] << endl;
		}
	}
private:
	T stack[ARRAY_LEN];
	int top;
};

函数模板和类模板测试代码 :

void templateTest()
{
	int* value_p = new int[10] {
		1,2,6,7,3,67,23,78,56,45
	};
	cout << "value_p max vlaue = " << getArrayMaxValue(value_p, ARRAY_LEN) << endl;

	double* value_p1 = new double[10] {
		1.4, 2.9, 2.8, 3.8, 38.7, 67.0, 2.3, 78.9, 56.8, 1.8
		};
	cout << "value_p1 max vlaue = " << getArrayMaxValue(value_p1, ARRAY_LEN, 0) << endl;

	cout << "value_p max vlaue = " << getArrayMaxValue(value_p, ARRAY_LEN, 0) << endl;

	delete[] value_p;
	delete[] value_p1;

	cout << "\r\n测试类模板...................\r\n" << endl;

	MyStack<string> mystack;
	mystack.myStackInit();
	mystack.myStackPush("小白");
	mystack.myStackPush("小黑");
	mystack.myStackPush("小绿");
	mystack.myStackPush("小黄");
	mystack.myStackPush("小紫");
	mystack.myStackPush("小蓝");
	mystack.myStackPush("小青");
	mystack.myStackPush("小棕");
	mystack.myStackPush("小马");
	mystack.myStackPush("小牛");
	mystack.myStackPush("小狗");
	mystack.myStackPop();
	mystack.myStackPop();
	mystack.myStackPop();
	mystack.myStackPop();
	mystack.myStackPop();
	mystack.myStackPop();
	mystack.myStackPop();

	mystack.display();
}

 运行结果 :

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值