【C++】模板(二)——类模板

本文详细介绍了C++中的类模板,包括如何定义类模板、实例化类模板以及类模板的特化和局部特化。类模板提供了一种泛型编程的方法,允许创建适用于多种数据类型的类。实例化时,类模板会根据指定的类型参数生成具体的类。类模板的特化则是针对特定类型提供定制的实现,局部特化则是在多个类型参数中针对一部分进行特化。通过类模板,开发者可以编写更加灵活和高效的代码。
摘要由CSDN通过智能技术生成

定义类模板

首先声明类模板,方法和声明函数模板一致。

template<typename T>
class Vector
{
	T* _elems;
	int _size, _capacity;
	const int DEFAULT_CAPACITY = 3;
	public:
	Vector(int c=DEFAULT_CAPACITY, ...)
	...
};

类模板与普通类功能大多数一致,除了多出一个类型参数T。在类模板外部定义成员函数时,需要使用类模板完整的类型限定符,下面定义构造函数:

template<typename T>
Vector<T>::Vector(int c, ...)
{
	...
};

定义上面的类模板后,该类的类型为Vector<T>。类模板的成员函数相当于模板函数。

使用类模板继承:

template<typename T>
class Base
{
};
template<typename T>
class Derived: public Base<T>
{
};

继承时也应该使用完整的类型限定符Base<T>

实例化类模板

定义一个类模板的实例对象:

Vector<int> intVector;

在类模板内部,会以int来实例化类型参数T。当我们调用它的成员函数时,成员函数也会被实例化(成员函数只会在被调用时才会被实例化)。

比如上面定义一个对象时,调用了默认构造函数,构造函数就会被实例化出一个int类型的版本。

而不被对象调用的成员函数,就不会对应的将其实例化,这样可以节省空间和时间成本。

但对于静态成员,在实例化一个类模板对象时,这些静态成员都会被实例化。

可以借助类型定义关键字typedef,更方便的使用类模板:

typedef Vector<int> IntVector;
IntVector intVector;	//与上面的定义相同

由这两种方式定义的对象可以互相赋值。

类模板的特化

类模板的特化与模板函数的重载相似,都是为了优化基于某种特定类型的实现。下面的方式特化一个类模板:

template<>
class Vector<double>
{
	...
};

特化的类模板内部不能出现被特化的类型参数T,必须使用特化的类型进行替代。与模板函数重载类似,特化类的实现可以与原类模板不同。

局部特化

局部特化多用于有多个类型参数的情况,指的是多个类型参数间的局部。

如下面的类模板:

template <typename T1, typename T2>
class MyClass 
{
	...
};

可以对其进行以下的局部特化:

  1. 两个模板参数具有相同类型:
template <typename T>
class MyClass<T,T>
{
};
  1. 只特化其中一个模板参数:
template<typename T>
class MyClass<T,int>
{
};
  1. 两个模板参数都特化为指针:
template<typename T1,typename T2>
class MyClass<T1*,T2*>
{
};

下面的实例对象:

Myclass<int,float> mif;        //使用 MyClass<T1,T2>
MyClass<float,float> mff;    //使用 MyClass<T,T>
MyClass<float,int> mfi;        //使用 MyClass<T,int>
MyClass<int*,float*> mp;        //使用 MyClass<T1*,T2*>

但上面的几种特化也会导致二义性的问题,比如当实例对象传入两个相同的指针时,他们对第一种和第三种特化同等程度的匹配。

这就需要特化一个传入两个相同指针的新特化类来解决:

template<typename T>
class MyClass<T*, T*>
{
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值