C++——类模板相关知识

本文章将对类模板的相关内容进行说明,如有不足,欢迎指正。

类模板的知识点可以分为以下几点:

 1.  类模板
 2. 类模板中成员方法的模板
 3. 类模板中成员方法的模板的特例化
 4. 拷贝构造函数的模板和特例化

 

类模板具有以下特征:

1. 类模板如果不使用,则不会进行实例化

2. 类模板中成员方法的模板特例化不允许在类外实现,因为其绝对依赖于模板

补充:

代理:一个类的成员是另一个类成员的子集。
模板类型列表中可以传递:类型  class  typename
                                           整型常量(int char short long一般为不带小数的)10 20
                                           模板
函数模板  实例化的时候可以不加类型参数
类模板    实例化的时候必须加类型参数
模板具有类型自推功能
利用模板的类型自推功能,推演出参数类型,实例化类模板

 

详细内容请参考以下代码

代码示例1:

//用类模板实现数组的增删改查
template <typename T>
class Carry
{
private:
	T* _arr;
	int _len;
	int _sizeVal;

public:
	Carry(int resize = 2) //resize是给的默认值
	{
		cout<<"Carry(int resize = 2)"<<endl;
		_arr = new T [resize];
		_len = resize;
		_sizeVal = 0;
	}

	~Carry()
	{
		cout<<"~Carry()"<<endl;
		delete []_arr;
	}

	Carry(const Carry &src)
	{
		cout<<"Carry(const Carry &src)"<<endl;
		_arr = new T[src._len];
		_sizeVal = src._sizeVal;
		_len = src._len;
		copyFrom(src);
	}

	//深拷贝时把原来空间里的值拷贝到新空间里
	void copyFrom(const Carry &src)
	{
		cout<<"void copyFrom(const Carry &src)"<<endl;
		for(int i=0; i<src._sizeVal; i++)
		{
			_arr[i] =  src._arr[i];
		}
	}

	Carry &operator = (const Carry &src)
	{
		cout<<"Carry &operator = (const Carry &src)"<<endl;
		if(&src == this)
		{
			return *this;
		}
		if(_arr != NULL)
		{
			delete []_arr;
		}

		_arr = new T[src._len];
		_sizeVal = src._sizeVal;
		_len = src._len;
		copyFrom(src);
	}

	void pushBack(T val)
	{
		cout<<"void pushBack(T val)"<<endl;
		if(isFull())
		{
			reSize();
		}
		//_arr[_sizeVal] = val;
		//_sizeVal ++;
		_arr[_sizeVal++] = val;
	}

	/*
	void insert(int sit, T val)
	{
		if(isFull())
		{
			reSize();
			return false;
		}
		_len ++;
		return true;
	}
	*/
	bool popBack()
	{
		cout<<"bool popBack()"<<endl;
		if(isEmpty())
		{
			return false;
		}
		_sizeVal --;
		return true;
	}

	/*
	bool deleteSit(int sit)
	{
		if(isEmpty)
		{
			return false;
		}
		sit -= 1;
		_len --;
		return true;
	}
	*/

	T getBack()
	{
		cout<<"T getBack()"<<endl;
		if(isEmpty())
		{
			return T();
		}
		//return _arr[_sizeVal];
		//_sizeVal--;
		return _arr[_sizeVal--];
	}

	
	void show();
/*
	{
		cout<<"void show()"<<endl;
		for(int i=0; i<_sizeVal; i++)
		{
			cout<<_arr[i]<<"  ";
		}
		cout<<endl;
	}
*/
/*
	int find(T val);
	{
		cout<<"int find(T val)"<<endl;
		for(int i=0; i<_sizeVal; i++)
		{
			if(arr[i] == val)
			{
				return i;
			}
		}
		return -1;
	}
*/

	//类模板要带类型参数
	template<typename U>
	int find(U val);
/*
	{
		cout<<"template<typename U> int find(U val)"<<endl;
		for(int i=0; i<_sizeVal; i++)
		{
			if(arr[i] == val)
			{
				return i;
			}
		}
		return -1;
	}
*/

/*	template<>
	int find<char*>(char* val);
	{
		cout<<"	template<> int find<char*>(char* val)"<<endl;
		for(int i=0; i<_len; i++)
		{
			if(strcmp(arr[i], val) == 0)
			{
				return i;
			}
		}
		return -1;
	}
*/

	bool isFull()
	{
		cout<<"bool isFull()"<<endl;
		return _sizeVal == _len;
	}

	bool isEmpty()
	{
		cout<<"bool isEmpty()"<<endl;
		return _sizeVal == 0;
	}

	void reSize()
	{
		cout<<"void reSize()"<<endl;
		T *tmp = new T[_len + (_len >> 1)];

		for(int i=0; i<_len; i++)
		{
			tmp[i] = _arr[i];
		}
			delete[]_arr;
			_arr = tmp;
			_len = _len + (_len >> 1);
	}
};

//在类外实现的类模板
template<typename T>
void Carry<T>::show()
{
	for(int i=0; i<_sizeVal; i++)
	{
		cout<<_arr[i]<<"  ";
	}
	cout<<endl;
}

template<typename T>
template<typename U>
int Carry<T>::find(U val)
{
	for(int i=0; i<_sizeVal; i++)
	{
		if(_arr[i] == val)
		{
			return i;
		}
	}
	return -1;
}

/*
template<typename T>
template<>
int Carry<T>::find<char*>(char* val)
{
	for(int i=0; i<_sizeVal; i++)
	{
		if(strcmp(arr[i], val) == 0)
		{
			return i;
		}
	}
	return -1;
}
*/

int main()
{
	Carry<int> arr1;
	for(int i=0; i<10; i++)
	{
		arr1.pushBack(i);
	}
	int sit = arr1.find(10);
	cout<<sit<<endl;
	arr1.show();

	Carry<char*> arr2;
	arr2.pushBack("hello");
	arr2.pushBack("world");
	arr2.pushBack("sweetygirl");
	char str[] = {'s','w','e','e','t','y','g','i','r','l','\0'};
	sit = arr2.find(str);
	cout<<sit<<endl;
	arr2.show();

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值