一、学习笔记
1.类模板的格式
(1)声明
template<typename T> /* 使用T表示某种类型,比如: */ class AAA { private: T obj; public: void test_func(T& t); ..... };
(2)定义
template<typename T>
void AAA<T>::test_func(T& t) ....
注意:函数模板和类模板都是typename, 函数模板中template<typename T1, typename T2> 指定两个变量也是可以的。
2.类模板的使用
(1)可以在实例化对象的时候再实例化类模板,eg:
AAA<int> a;
AAA<double> b;
(2)也可以事先实例化:
template AAA<int>;
再使用:
AAA<int> a;
3.类模板的重载(也称为定制,特例化)
(1)声明
template<> class AAA<int> { ...... public: void test(void); };
(2)定义
void AAA<int>::test(void) ...
定做的AAA<int>中的内容可以和模板AAA完全不一样!
4.函数参数若为引用,若想传入一个数值,函数参数应该定义为const引用
5.只有在使用类模板定义类的时候才会生成对应的代码
5.C++中的链表操作和容器里面大量使用到了类模板。
6.函数模板和类模板应该放在头文件中,因为其只是编译指令,编译器在编译的时候根据这些指令来生成代码,只有把它放在头文件中才能供更多的文件使用。
二、例子
#include <iostream> using namespace std; template<typename T> //模板类 class Person { T a; public: void set(const T &a); void get() { cout << "Person: a = " << this->a << endl; } }; template<typename T> void Person<T>::set(const T &a) { this->a = a; } template<> class Person<int> { //这个模板类的一个特例化 int a; public: void set(const int &a); void get() { cout << "Person<int>: a = " << this->a << endl; } }; void Person<int>::set(const int &a) { this->a = a; } int main() { Person<int> p1; p1.set(100); p1.get(); Person<double> p2; p2.set(3.14); p2.get(); return 0; } /* Person<int>: a = 100 优先调用特例化的模板类 Person: a = 3.14 */