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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41026740/article/details/84501544

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

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

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

类模板具有以下特征:

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

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

详细内容请参考以下代码

代码示例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;
}

猜你喜欢

转载自blog.csdn.net/qq_41026740/article/details/84501544