首页 > 代码库 > C++语言笔记系列之二十——模版

C++语言笔记系列之二十——模版

1.任意输入两个数x和y,输出最大值max。
int max(int x, int y)
{return x>y?x:y;}
2.函数模版
(1)用一种或者多种通用类型去表示函数——函数模版。
(2)函数模版由于没有具体的数据类型,所以函数模版不可运行。
(3)作用:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。
注:函数模版在调用时必须用具体的类型来替代,使之转换为一个具体函数。
3.函数模版的定义:
template <class T>
A.模版定义的关键词:template
<class T>用来说明一个通用类型T。
B.class T只用来表示一种类型,也可以表示多个通用类型:
<class T1, class T2, class T3, ..., class Tn>
4.函数模版的调用
(1)将函数模版作为一个函数调用。
(2)系统将自动按照调用表达式实参的类型来替代函数模版中的通用类型,使之转化为一个具体函数然后执行。
example 1

#include <iostream.h>

template <class T>
T max(T x, T y)
{return x>y?x:y;}
int main()
{
    int x = 3, y = 4;
    double d1 = 2.3, d2 = 3.4;
    long l1 = 32L, l2 = 35L;
    cout<<max(x, y)<<endl;
    cout<<max(d1, d2)<<endl;
    cout<<max(l1, l2)<<endl;
}
程序输出:
4
3.4
35
分析:由于实参x,y为int类型,系统自动将模版中的类型T用int来替代。
函数转化:int max(int x, int y) {return x>y?:x:y;}

example 2

#include <iostream.h>

template <class T>
void exchange(T &x, T &y, T &z)
{
    T t;
    if(x>y) {t = x; x = y; y = z;}
    if(x>z) {t = x; x = z; z = t;}
    if(y>z) {t = y; y = z; z = t;}
}
5.函数模版的重载
(1)函数模版允许隐性类型转换。
(2)函数模版重载时不允许重载为一个模版——函数模版的重载只可以是一个具体的显性函数。
(3)函数模版的重载只可以在函数模版不可调用时,系统将自动的通过隐式类型转换后调用函数模版时重载。
example 3

#include <iostream.h>

template <class T>
T max(T x, T y)
{
    cout<<"This is T max()."<<endl;
    return x>y?x:y;
}
double max(int x, double y)
{
    cout<<"This is double max()."<<endl;
    return x>y?x:y;
}
int main()
{
    int x1 = 2, x2 = 3;
    double d1 = 2.3, d2 = 3.4;
    long l1 = 3L, l2 = 5L;
    cout<<max(x1, x2)<<endl; //调模版
    cout<<max(l1, l2)<<endl; //调模版
    cout<<max(x1, l2)<<endl; //调重载
    cout<<max(x1, d2)<<endl; //调重载
    cout<<max(d1, d2)<<endl; //调模版
}
程序输出:
This is T max().
3
This is T max().
5
This is double max().
5
This is double max().
3.4
This is double max().
3.4
模版的重载只能够有一个具体的函数。
6.类模版
template <class T>
class Tany
{
    T x, y;
public:
    Tany(T xx, T yy):x(xx),y(yy) {}
    T getx() {return x;}
    T gety() {return y;}
};
类模板的具体化实现:
(1)通过类模板创建对象时由具体类型替代模版类型。
(2)类模版对象的定义
类名<具体类型>对象名(初始化列表)
若有多个通用类型必须表示多个具体类型
例如:Tany <int> objint(3, 4);
      Tany <double> objdouble(3.4, 5.6);