C++:类模板

零构造/零初始化:
把内存单元全部初始化为0

int main()
{
	
	typedef char * CHAR;
	char *c = CHAR();
	
	int a = int();
	double b = double();
	cout << a << endl;
	cout << b << endl;
	return 0;
}


类模板的特例化:
完全特例化
部分特例化
 

#include<iostream>

using namespace std;

//Node<_vty> 如果在类中 构造函数和析构函数 可以缺省类型参数
//类外以及其他地方不要缺省

template<typename T>
class CLink;
template<typename _Vty>
class Node  //此时Node是一个类模板名  
{
	
public:
	Node<_Vty>(_Vty val=_Vty()):value(val),pnext(NULL)//_Vty val=_Vty() 零构造 零初始化
	{}       //Node<_Vty> 构成类名
	~Node<_Vty>()//析构 
	{}
	 //template<typename E>  //这里的友元是一对多  
	 //friend class CLink;//访问Node
	friend class CLink<_Vty>;//一对一
private:
	_Vty value;//值类型
	Node<_Vty>* pnext;//模板名+类型参数
};

template<typename T>
class CLink
{
public:
	CLink<T>()
	{
		cout << "实例化" << endl;
		phead = new Node<T>();//此时 <T>不可省略  在Node类的类外
	}
	~CLink<T>()
	{
		Node<T>* pCur = phead;
		Node<T>* pnext = pCur;
		while (pCur!=NULL)//pCur->pNext != NULL 最后一个删除不了
		{
			pnext = pCur->pnext;
			delete pCur;
			pCur = pnext;
		}
		phead = NULL;
	}
	void Insert(T val)//头插
	{
		Node<T>* pnewnode = new Node<T>(val);
		pnewnode->pnext = phead->pnext;
		phead ->pnext = pnewnode;
	}
	void Delete(T val)
	{
		Node<T>* pfront = Find(val);
		if (pfront != NULL)
		{
			Node<T>* pCur = pfront->pnext;
			pfront->pnext = pCur->pnext;
			delete pCur;
		}
	}
	void Show()
	{
		Node<T>* pCur = phead->pnext;
		while (pCur != NULL)
		{
			cout << pCur->value<<" ";
			pCur = pCur->pnext;
		}
		cout << endl;
	}
//private:
	
	Node<T>* Find(T val);

	template<typename E>  //提供模板的版本
	Node<E>* Find(E val)
	{
		Node<E>* pCur = phead;
		while (pCur->pnext != NULL)//前驱
		{
			if (pCur->pnext->value == val)
			{
				return pCur;
			}
			pCur = pCur->pnext;
		}
		return NULL;
	}

	template<>//针对某个函数进行特例化
	Node<const char*>* Find(const char* val)
	{
		cout << "函数特例化" << endl;
		Node<const char*>* pCur = phead;
		while (pCur->pnext != NULL)//前驱
		{
			if (strcmp(pCur->pnext->value, val) == 0)
			{
				return pCur;
			}
			pCur = pCur->pnext;
		}
		return NULL;
	}
private:
	Node<T>* phead;
};

template<typename T>// 类模板名+类型  构成 类名
Node<T>* CLink<T>::Find(T val)
{
	cout << "函数调用" << endl;
	Node<T>* pCur = phead;
	while (pCur->pnext != NULL)//前驱
	{
		if (pCur->pnext->value == val)
		{
			return pCur;
		}
		pCur = pCur->pnext;
	}
	return NULL;
}


/*类模板的实例化,选择性实例化,未调用不实例化*/
int main()
{
	CLink<int> link1;// 板使用时必须指定类型, 不支持推演
	//有两个类的实例化  CLink<int>  Node<int>
	CLink<double> link2;
	CLink<const char *> link3;
	link3.Insert("hello");
	link3.Insert("world");
	link3.Find("hello");
	link3.Find<const char*>("hello");//函数特例化
	//link3.Delete("hello");
	link3.Show();
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值