3. 类模板
类模板是用来生成类的模版。它的主要作用是用来编写与类型无关的通用类模板,在需要时在根据类型生成相应的类。
类模板定义的语法
template <typename 类型参数名1 [=默认类型1], typename 类型参数名2 [=默认类型2], ...>
class 类模板名 {
...
};
说明
- 类型参数名常用
T开头,如:T、T1、T2 - 类型参数的缺省参数 默认类型 可以省略。
- 模板是声明不占用存储空间,一般写在头文件中。
- 在使用类模板时,C++会在编译阶段自动生成对应的类代码。
- 关键字
typename可以使用 关键字class替换。 - 一个
template <...>类型声明的有效范围是一个函数模板(或类模板)的定义语句。
函数模板使用的方法
类模板名<实参类型1, 实参类型2, ...> 对象名;
说明
- 在使用类模板时,必须给出 <实参类型列表>,如果不给出实参类型名则使用 默认类型 替换。。
以下类是只能存储 100 个整型数据的静态数组封装的类。代码如下:
class StaticArray {
public:
StaticArray() : data_cnt(0) {}
void push_back(const int &value) { data[data_cnt] = value; data_cnt++; }
int size() { return data_cnt; }
int & operator[] (int index) { return data[index];}
private:
int data_cnt;
int data[100];
};
下面我们将 StaticArray 改写成 类模板,其中存储的类型用 T 代替,改写后的代码如下:
template <typename T=int>
class StaticArray {
public:
StaticArray() : data_cnt(0) {}
void push_back(const T &value) { data[data_cnt] = value; data_cnt++; }
int size() { return data_cnt; }
T & operator[] (int index) { return data[index];}
private:
int data_cnt;
T data[100];
};
示例
完整的类模板的示例代码如下:
// filename: class_template.cpp
#include <iostream>
using namespace std;
template <typename T=int>
class StaticArray {
public:
StaticArray() : data_cnt(0) {}
void push_back(const T &value) { data[data_cnt] = value; data_cnt++; }
int size() { return data_cnt; }
T & operator[] (int index) { return data[index];}
private:
int data_cnt;
T data[100];
};
int main(int argc, char * argv[]) {
// 创建存储 int 类型的静态数组 int_arr
StaticArray<> int_arr; // 使用 T 的默认值int
// 创建存储 string 类型的静态数组 str_arr
StaticArray<string> str_arr;
int_arr.push_back(11);
int_arr.push_back(22);
cout << "int_arr.size(): " << int_arr.size() << endl;
cout << "int_arr[0]: " << int_arr[0] << endl;
cout << "int_arr[1]: " << int_arr[1] << endl;
str_arr.push_back("hello");
str_arr.push_back("laowei");
str_arr.push_back("weimingze");
cout << "str_arr.size(): " << str_arr.size() << endl;
cout << "str_arr[0]: " << str_arr[0] << endl;
cout << "str_arr[1]: " << str_arr[1] << endl;
cout << "str_arr[2]: " << str_arr[2] << endl;
return 0;
}
编译和运行结果如下:
weimz@mzstudio:~$ g++ -o class_template class_template.cpp
weimz@mzstudio:~$ ./class_template
int_arr.size(): 2
int_arr[0]: 11
int_arr[1]: 22
str_arr.size(): 3
str_arr[0]: hello
str_arr[1]: laowei
str_arr[2]: weimingze
实验
尝试编写一个动态数组的类模板。