C++基础:模板:函数模板和类模板

模板:

为了代码重用,代码就必须是通用的;通用的代码就必须不受数据类型的限制。

那么我们可以把数据类型改为一个设计参数。这种类型的程序设计称为参数化(parameterize) 程序设计。

软件模块由模板(template) 构造。包括函数模板(function template)和类模板(class template)。


建议阅读C++ Templates 1--7 章

1.函数模板:

例1:

template<typename Type>
Type Max(Type a, Type b)
{
	cout<<typeid(Type).name()<<endl;     //查看类型
	return a > b ? a : b;
}

int main()
{
	Max(1,2);
	Max(1.2,2.3);    //模板可以自动推演参数的类型

	//Max(1,2.3);   //错误,参数的类型不同,会引起模板的二义性,模板不支持隐式转换
	Max(1,(int)2.3);
	Max<int>(1,2.3);  //显式提供参数类型

	return 0;
}

例2:

template<typename Type1, typename Type2>  
Type1 Max(Type1 a, Type2 b)
{
	return a > b ? a:b;
}
int main()
{
	Max(1,1.2);   //参数类型不同
}

例3:

class Test
{
public:
	bool operator>(const Test &t)
	{
		return true;
	}
};

temple<typename Type>
Type Max(Type a, Type b)
{
	return a > b ? a : b; 
}

int main()
{
	Test t1, t2;
	Max(t1, t2);

	return 0;
}


由函数模板生成的函数叫模板函数;
模板调动效率不高:因为系统底层需要根据类型的不同生成相对应的模板函数;

2.类模板与线性表

#include <iostream>
using namespce std;

template<typename Type>
class List;

template<typename Type>
class ListNode
{
	friend class List<Type>;
public:
	ListNode():data(Type()),next(NULL)    //零初始化
	{}
	ListNode(Type d, ListNode<Type> *n = NULL)
		:data(d),next(n)
	{}
	~ListNode()
	{}
private:
	Type data;
	ListNode<Type> *next;
};

template<typename Type>
class List
{
public:
	List();
	bool push_back(Type x);
	void show_list()const;
private:
	ListNode<Type> *first;
	ListNode<Type> *last;
	size_t          size;
};

template<typename Type>
List<Type>::List()
{
	first = last = (ListNode<Type>*)malloc(sizeof(ListNode<Type>));
	last->next = NULL;
	size = 0;
}

template<typename Type>
bool push_back(Type x)
{
	ListNode<Type> *s = (ListNode<Type>*)malloc(sizeof(ListNode<Type>));
	if(s == NULL)
	{
		return false;	
	}
	s->data = x;
	s->next = NULL;
	last->next = s;
	last = s;
	size++;

	return true;
}

template<typename Type>
void List<Type>::show_list()const
{
	ListNode<Type> *P = first->next;
	while(p != NULL)
	{
		cout<<p->data<<"-->";
		p = p->next;
	}	
	cout<<"Nul."<<endl;
}

int mian()
{
	List<int> mylist;
	for(int i = 1; i < 10; ++i)
	{
		mylist.push_back(i);
	}

	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值