学科分类
目录
C++基础

在类模板外部定义成员函数

在前面的学习过程中,类模板的成员函数都是在类的内部实现的,类模板的成员函数可以在类模板的定义中定义(inline函数),也可以在类模板定义之外定义(此时成员函数定义前面必须加上template及模板参数),在类模板外部定义成员函数的方法如下所示:

template<模板形参表>
函数返回类型 类名<模板形参名>::函数名(参数列表){}

template是类模板的声明,在实现成员函数时,也要加上类作用域,而且在类名后要用<>指明类的模板形参。例如有下列类模板的定义:

template<typename T1, typename T2>
class B
{
public:
  T1 a;
  T2 b;
  T1 func(T1 a, T2& b);
};

上述代码中,如果在类模板外定义类B的成员函数func(),其实现如下所示:

template<typename T1, typename T2>
T1 B<T1,T2>::func(T1 a, T2& b){}

类模板成员函数本身也是一个模板,类模板被实例化时它并不自动被实例化,只有当它被调用或取地址时,才被实例化。需要注意的是当在类外面定义类的成员函数时,template后面的模板形参应与要定义的类模板形参一致。

为了读者更好的掌握在类模板外定义其成员函数,接下来我们通过一个小案例来演示在类模板外定义类的成员函数,具体代码如例1所示。

例1

 1    #include <iostream>
 2    using namespace std;
 3    template<typename T>  //类模板
 4    class Array
 5    {
 6    private:
 7        int size;
 8        T* ptr;
 9    public:
 10        Array(T arr[], int s);
 11        void show();
 12    };
 13    template<typename T> //类模板外定义其成员函数
 14    Array<T>::Array(T arr[], int s)
 15    {
 16        ptr = new T[s];
 17        size = s;
 18        for (int i = 0; i < size; i++)
 19        {
 20            ptr[i] = arr[i];
 21        }
 22    }
 23    template<typename T> //类模板外定义其成员函数
 24    void Array<T>::show()
 25    {
 26        for (int i = 0; i < size; i++)
 27            cout << *(ptr + i) << " ";
 28        cout << endl;
 29    }
 30    int main()
 31    {
 32        char cArr[] = { 'a', 'b', 'c', 'd', 'e' };
 33        Array<char> a1(cArr, 5);  //创建类模板的对象
 34        a1.show();
 35    
 36        int iArr[10] = { 1, 2, 3, 4, 5, 6 };
 37        Array<int> a2(iArr, 10);
 38        a2.show();
 39        system("pause");
 40        return 0;
 41    }

运行结果如图1所示。

图1 例1运行结果

在例1中,类Array的构造函数有一个数组类型参数,则在创建类对象时,第一个对象用char类型的数组去初始化,第二个对象用int类型的数组去初始化,然后调用show()函数,两个数组的结果都成功输出。

注意:类模板在实例化时,带有模板形参的成员函数并不会跟着实例化,这些成员函数只有在被调用时才会被实例化。

点击此处
隐藏目录