【类模板】类模板的基本范式
一、类模板的概念
类模板与一般的模板一样,都是通过给定的模板参数,生成具体的类,也就是实例化一个特定的类。这个概念和函数模板差不多。
例如,在 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静态成员函数
具体如下: