一、类模板:
1.什么是类模板?
template<typename T> class Myclass { public: T index; T func(); };
类模板相比于普通的类,实现了对类的复用,这里的T可以作为变量或者函数返回值的类型
2.怎么使用类模板?
使用类模板声明一个类对象叫做类模板的实例化,为什么叫做实例化呢?因为T是不确定的。
Myclass<int> myclass;
这样就实例化(声明)了一个类模板的对象,这个myclass的成员的类型是确定的int类型
3.类模板还可以怎么使用?
a.(缺省)默认类型
有时我们使用某个模板类,大部分的情况只使用一种类型比如int,所以不想每次声明类对象时都写一遍**<int>
**,而在需要使用其它类型时再声明,类模板提供了这样的操作:参数指定默认类型
template<typename T = int> class Myclass { };
我们只需要为template的参数指定**typename T = int
**,这样就为这个类模板制定了默认类型,
此时,我们不指定类型
Myclass myclass;
这里的**myclass
的成员类型就是默认**的int
b.特化:为特定类型制定类的内容
我们看看特化的结果:
特化前:
template<typename T> class Myclass { public: T index; T func(); };
使用这个类模板创建出的所有对象的成员和成员函数都是一样的,这一点似乎是大家的共识
但是如果我们有一个需求:我希望使用char这个类型创建的类模板的对象,它的成员不是 char index
和 char func()
,而是我自定义的其它的成员和函数。而其它类型创建出来的对象的成员都是一样的
特化就可以满足这个需求:
特化后:
template<> class MyClass<char> { private: char c; char *s; public: Myclass(); char myfunc(); };
这样一来,使用char这个类型创建的类模板的对象,它的成员就变成我们通过特化来重定义的成员了。