3. 类模板

类模板是用来生成类的模版。它的主要作用是用来编写与类型无关的通用类模板,在需要时在根据类型生成相应的类。

类模板定义的语法

template <typename 类型参数名1 [=默认类型1], typename 类型参数名2 [=默认类型2], ...>
class 类模板名 {
    ...
};

说明

函数模板使用的方法

类模板名<实参类型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

实验

尝试编写一个动态数组的类模板。