c++类模板用法讲解

在编写类模板的程序时,把类模板的成员函数的声明和实现分别写在了头文件和源文件中,导致了

出现编译出错的现象,现弄清楚了原因,特写此篇,供大家参考学习。

c++中每一个对象所占用的空间大小,是在编译的时候就确定的,在模板类没有真正的被使用之前,

编译器是无法知道模板类中使用模板类型的对象所占用的空间大小的。只有模板被真正使用的时候,

编译器才知道,模板套用的是什么类型,应该分配多少空间。这也是模板类称之为模板而不是泛型的原因。

既然是在编译的时候,根据套用的不同类型进行编译,那么,套用不同类型的模板类实际上就是两个不同的

类型,也就是说,vector<int>和vector<char>是两个不同的数据类型,他们共同的成员函数也不是一个

函数,只不过具有相似的功能。

因而模板类在套用不同类型之后,会被编译出不同代码。

所以模板类的实现,脱离具体的使用,是无法单独的编译的;也就是说把声明和实现分开的做法是不可取的

必须把实现全部写在头文件里面。为了代码清晰,可以把实现写在类的外面。

下面是具体的代码实现:

以简单的冒泡排序为例写的类模板.h头文件如下:

template<class T>
class SortClass{
public:
    //冒泡排序初级版:两两比较相邻记录的关键字
    void BubbleSort0(T data[], int n)
    {
        for(int i=0;i<n;++i)
        {
            for(int j=i+1;j<n;++j)
            {
                if(data[i]>data[j])
                {
                    swap(data[i],data[j]);
                }
            }
        }
    }
private:
    void swap(T &a, T &b)
    {
        T temp;
        temp = a;
        a=b;
        b=temp;
    }
};

这种写法是把类模板的成员函数实现写在了类里。

还可以把类模板的成员函数实现写在类外。代码如下:

template<class T>
class SortClass{
public:
    void BubbleSort0(T data[], int n);
private:
    void swap(T &a, T &b)
    {
        T temp;
        temp = a;
        a=b;
        b=temp;
    }
};

//这个类模板的成员函数实现
template<class T>
void SortClass<T>::BubbleSort0(T data[], int n)
{
    for(int i=0;i<n;++i)
    {
        for(int j=i+1;j<n;++j)
        {
            if(data[i]>data[j])
            {
                swap(data[i],data[j]);
            }
        }
    }
}

下面是对类模板的成员函数的调用c++代码:

#include<iostream>
#include"sortImple.h"

using namespace std;

int main()
{

    SortClass<int> s;
    int a[10]={9,4,2,7,3,1,5,8,6,0};
    cout<<"排序前数组的元素值"<<endl;
    for(int i=0;i<10;++i)
        cout<<a[i]<<" ";
    cout<<endl;
    s.BubbleSort0(a,10);
    cout<<"排序后数组的元素值"<<endl;
    for(int i=0;i<10;++i)
        cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}

程序输出如下:


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值