一、类模板的概念
类模板与一般的模板一样,都是通过给定的模板参数,生成具体的类,也就是实例化一个特定的类。这个概念和函数模板差不多。
例如,在
C
+
+
C++
C++中的
s
t
d
:
:
v
e
c
t
o
r
std::vector
std::vector容器就是一个经典的类模板,如
s
t
d
:
:
v
e
c
t
o
r
<
i
n
t
>
std::vector<int>
std::vector<int>,其中
<
i
n
t
>
<int>
<int>表示实例化出一个
i
n
t
int
int类型的
v
e
c
t
o
r
vector
vector容器。
引入类模板是十分必要的,具体如下:
二、类模板的基本范式
具体而言,类模板一般含有以下元素:
1.成员变量
2.成员函数
3.自定义类型表
4.构造函数和析构函数
5.运算符重载
6.迭代器接口
这里实现一个自定义的 m y v e c t o r myvector myvector容器,基本代码如下:
template<typename T>
class myvector {
public:
//类型表
typedef T* myiterator; //迭代器名称(指针)
public:
//构造函数
myvector() {};
myvector(myvector const&){};
//赋值运算符
myvector& operator=(myvector const&); //也可以写成myvector<T>operator(myvector<T>const&)
public:
//成员函数
void myfunc();
//静态成员函数
static void my_static_func();
public:
//迭代器接口
myiterator begin();
myiterator end();
};
通常,在类内的函数可以不用添加
<
T
>
<T>
<T>类型名,可以省略。
而在类外实现的话就必须加上
t
e
m
p
l
a
t
e
<
T
>
template<T>
template<T>,并且函数名也要带上
<
T
>
<T>
<T>,如下,这里实现了静态函数和普通函数的类外实现:
//类外实现
template<typename T>
void myvector<T>::myfunc() { //类外实现需要补充参数<T>
std::cout << "调用了myvector的成员函数\n";
}
template<typename T>
void myvector<T>::my_static_func() {
std::cout << "调用了myvector的静态成员函数\n";
}
更多细节如下:
三、类模板的实例化
与函数模板不一样,类模板中的成员函数只有被调用的时候才会被实例化,其中构造函数在创建对象的时候被实例化调用。
我们可以用
d
u
m
p
b
i
n
dumpbin
dumpbin工具来查看是否实例化了类模板函数:
我们这里只创建类,而不调用类内函数
void Test() {
myvector<int>vec;
}
可以发现:成功实例化了
m
y
v
e
c
t
o
r
<
i
n
t
>
myvector<int>
myvector<int>的构造函数,而没有实例化类内函数。
让我们在调用类内部的函数看看:
void Test() {
myvector<int>vec;
vec.myfunc();
myvector<int>::my_static_func();
}
现在,我们实例化了三个函数:
1.构造函数
2.myfunc成员函数
3.my_static_func静态成员函数
具体如下: