15.2 类模板概念与类模板的定义、使用

一:类模板概念

用类模板来实例化一个特定的类。
编译器不能为类模板推断参数类型,所以为了使用类模板,我们必须在类模板名后边用<>来提供额外的信息,这些信息就是对应模板参数列表里面的这些参数。实现同一套代码,可以应付不同的数据类型,这样就显得精简多了。

二:类模板的定义

template<typename 形参名1,typename 形参名2,…typename 形参名n>
class 类名
{
//
}

实例化类模板的时候,必须要有类的全部信息,包括类模板中成员函数的函数体
创建一个myvector.h

myvector tmpvec; //这个时候,编译器就给我们生成了一个具体的类,
myvector tmpvec2;
myvector tmpvec3;

myvector是类模板名,他不是一个类名,类模板是用来实例化类(类型)用的。
所以 myvector,myvector才是类型名(实例化了的类型)。
所以,一个实例化了的类型总会用尖括号<>包含模板参数。

三:类模板的成员函数

类模板成员函数,可以写在类模板定义中{},那么这种写在类模板定义的成员函数会被隐式声明为inline函数。
类模板一旦被实例化之后,那么这个模板的每个实例都会有自己版本的成员函数。
所以 类模板的成员函数具有和这个类模板相同的模板参数(这句话的核心意思:类模板的成员函数是有模板参数的)
如果你要把类模板成员函数的定义(函数体)写在类模板定义的外边,那么这个成员函数的模板参数就体现出来了。
定义在类模板之外的成员函数必须以关键字template开始,后面接类模板参数列表
同时,在类名后面要用尖括号<>把模板参数列表里面的所有的模板参数名列出来,如果是多个模板参数用,分隔
一个类模板虽然可能有很多成员函数,但是,当你实例化模板之后,如果你后续没有使用到某个成员函数的话,则这个成员函数不会被实例化。
说白了,就是一个实例化的模板,它的成员函数只有在使用的时候才会被实例化。

四:模板类名字的使用

template<typename T>
class Myvector
{
public:
	Myvector<T>()
	{
	};
	~Myvector<T>()
	{
	};
	Myvector& operator=(const Myvector& myvector);
public:
	void myfunc();
};

template<typename T>
Myvector<T>& Myvector<T>::operator=(const Myvector<T>& myvector)
{
	return *this;
}

template<typename T>
void Myvector<T>::myfunc()
{
}

五:非类型模板参数的使用

非类型模板参数也是有限制的
<1>浮点型不能作为非类型模板参数 比如float double
<2>类类型一般也不允许做非类型模板参数

template<typename T, int size = 10>
class MyArray
{
public:
	MyArray()
	{
	};
	MyArray(T arr)
	{
		this->arr[0] = arr;
	}
public:
	void printArr();
private:
	T arr[size];
};

template<typename T, int size>
void MyArray<T, size>::printArr()
{
	cout << size << endl;
	cout << arr[0] << endl;
}

int main()
{
	MyArray<int, 100> myarray(10);
	myarray.printArr();
	MyArray<int, 100> array1;
	array1.printArr();
	MyArray<int> array2;
	array2.printArr();
	cin.get();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值