【C++期末开卷资料】5 模板

5 模板

5.1 模板的概念

模板是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现真正的代码服用。

5.2 函数模板和模板函数

  1. 函数模板的一般说明形式如下:

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

    template是一个声明模板的关键字,它表示声明一个模板。class(或typename)表示任何类型的意思。

  2. 函数模板的使用

    当编译系统发现有一个函数调用:

    函数名(模板实参表)

    将根据模板实参表中的类型生成一个函数即模板函数。该模板函数的函数体与函数模板的函数定义体相同

template<typename T>
T getmax(T a, T b) 
{
    if (a > b)
        return a;
    else return b;
}
/*char getmax(char a, char b) {
    if (a > b)
        return a;
    else return b;
}
string getmax(string a, string b) {
    if (a > b)
        return a;
    else return b;
}
float getmax(float a, float b) {
    if (a > b)
        return a;
    else return b;
}
int getmax(int a, int b) {
    if (a > b)
        return a;
    else return b;
}
*/
int main()
{
    cout << getmax('a', 'b') << endl; //实例化为char getmax(char,char)
    cout << getmax(1.3, 2.1) << endl; //实例化为float getmax(float , float )
    cout << getmax("fdfdfd", "gfdfdfd");//实例化为string getmax(string , string)
    return 0;
}
  1. 用户定义的参数类型

    模板类与Student类的结合(比如需要重载>号,,比较学生类的依据)

5.3 类模板与模板类

定义类模板的一般格式

template<类型形参列表>
class 类模板名
{
	类模板体定义
};
列表如:<typename T1,typename T2,...>

类模板的成员函数可以放在类模板的定义体中,与普通成员函数定义方法一样,也可以放在类模板的外部定义,类模板的成员函数其实都是函数模板,其定义如下

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

类模板的使用

先确定类模板的实例,即模板类

然后再用该类定义对象,其格式如下

类模板<类型实参名> 对象名

【案例】设计一个类模板,有数据成员T data[size],有最大值的方法getMax()和排序的方法sort(),模板参数T可以实例化成int、char、double、float、string等。

template<typename T,int size>
class Data {
    T data[size];
public:
    Data() 
    {
        cout << "input " << size << " datas"<<endl;
        for (int i = 0; i < size; i++) 
            cin >> data[i];
    }
    void show() 
    {
        cout << size << " datas:" << endl;
        for (int i = 0; i < size; i++) {
            cout << data[i]<<"\t";
        }
        cout << endl;
    }
    T getMax();
    void insertsort();
};
template<typename T,int size>
T Data<T, size>::getMax() {
    T max = data[0];
    for (int i = 1; i < size; i++) {
        if (data[i] > max) {
            max = data[i];
        }
    }
    return max;
}
template<typename T, int size>
void Data<T, size>::insertsort() {
    T temp;
    int i, j;
    for (i = 1; i <= size - 1; i++) {//当前要插入data[i]到有序序列data[0,...,i-1
        temp = data[i];
        for (j = i - 1; j >= 0; j--) {
            if (data[j] > temp)
            {
                data[j + 1] = data[j];
            }
            else break;
        }
        data[j + 1] = temp;
        show();
    }
}
int main()
{
    Data<int, 5> d;
    d.show();
    cout << d.getMax() << endl;
    cout << "after sort:" << endl;
    d.insertsort();
    d.show();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值