数据结构——类模板
类模板
类模板是一种用于创建通用类的机制,它可以让程序员编写一次类,然后让它适用于多种数据类型,在实际编程中非常实用。
优点:使用类模板时,可以为同一个类使用不同的数据类型,这使得代码更加灵活。例如,一个通用的栈类模板可以用于int、double、char等不同类型,而不需要为每种类型分别定义栈类。
定义方式
1 2 3 4 5 6 7 8 9
| template <class T> class MyStack { public: private: T* data; int top; };
|
template 关键字用于声明类模板
函数声明与定义
类内定义
如果是在类内进行函数定义,则不需添加template<>,如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| // 类模板 template <class T1,class T2> class Data { private: T1 a; T2 b; public: Data(T1 a, T2 b){ this->a = a; this->b = b; cout << "Data的有参构造" << endl; } void showData() { cout << a << " " << b <<endl; } };
|
类外定义
如果成员函数在类外定义
- 在每个成员函数前必须添加
template<>。
- 作用域需要添加
<>修饰。
1 2 3 4 5
| template<class T1,class T2> void Data<T1,T2>::showData() { cout << a << " " << b << endl; }
|
友元函数
1 2 3 4 5 6 7 8 9
| friend void MyPrint(Data<T3, T4> &ob);
template <typename T3,typename T4> void MyPrint(Data<T3, T4> &ob) { cout << "函数模板友元:" << ob.a << " " << ob.b << endl; }
|
模板类分文件书写问题
方案一
将类的声明和成员函数的定义全部写在一个.h文件中,如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #ifndef _DATA_H_ #define _DATA_H_ #include <iostream> using namespace std;
template <class T1, class T2> class Data { private: T1 a; T2 b; public: void showData(); };
template<class T1, class T2> void Data<T1, T2>::showData() { cout << a << " " << b << endl; }
#endif
|
方案二
若将函数的定义写在.cpp文件中,main.cpp中调用时,一定要同时include”.h”和“.cpp”文件,否则编译错误
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include <iostream> using namespace std;
#include "Data.h" #include "Data.cpp" int main() { Data<int, char> ob2(100,'A'); ob2.showData(); return 0; }
|
参考文献
【035】深入理解C++类模板(最全讲解):从基础到实战-CSDN博客