C++函数模板与类模板

模板

定义:

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

分类:

       函数模板、 类模板。

作用:

       模板用于表达逻辑结构相同, 但具体数据元素类型不同的数据对象的通用行为。

理解(对比函数重载):

       重载函数: 如果同一作用域内的几个函数名字相同但形参列表不同,我们称之为重载函数。 这些函数接受的形参类型不一样, 但是执行的操作非常类似。

1: int max(int x, int y) { return x > y ? x : y ; }
2: float max(float x, float y) { return x > y ? x : y ; }
3: double max(double x, double y) { return x > y ? x : y ; }
模板: 模板把类型参数化, 即把上面的int/float/double定义为参数。

函数模板

定义:

        函数模板, 就是建立一个通用函数, 其函数类型形参类型不具体指定, 用一个虚拟的类型来代表。 这个通用函数就称为函数模板。

注意:
  • 凡是函数体相同的函数都可以用这个模板来代替, 不必定义多个重载函数。
  • 在调用函数时, 系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。
声明形式:
template <类型形式参数表(class/typename)>
返回类型 函数名 (形参列表)
{
    函数体
}
示例:
//函数模板
//功能:比较两个值的大小,并返回较大的值
template <typename T>
T max(T a, T b)
{
    return a > b ? a : b;
}
函数调用:
res = max<int>(2, 5); //显式类型调用, 这里T为int类型
res = max(10, 3); //自动数据类型推导, 这里T为int类型
res = max('a', 'c'); //自动数据类型推导, 这里T为char类型
函数模板与模板函数
函数模板
//函数模板
//功能:比较两个值的大小,并返回较大的值
template <typename T>
T max(T a, T b)
{
    return a > b ? a : b;
}
模板函数:

        当函数模板被调用时, 编译器会生成相应的模板函数。


这里写图片描述

注意:
  • 函数模板的声明由模板说明函数定义组成, template为模板关键字。
  • 模板说明中的类型形式参数(T)在函数定义中至少出现一次
  • 函数参数列表中可以使用类型形式参数(T), 也可以使用一般类型参数(int/char等)。
函数模板重载

       函数模板也可以被重载

       非模板函数可以和同名的函数模板同时存在, 也可以和相同类型的模板函数同时存在。 当所有的条件都相同时, 编译器会优先选择非模板函数

       如果函数模板可以产生一个更好的匹配, 则选择函数模板。

#include<iostream>

using namespace std;

//函数模板
//功能:比较两个值的大小,并返回较大的值
template <typename T>
T max(T a, T b)
{
    cout << "函数模板" << endl;
    return a > b ? a : b;
}

//函数模板的重载
char max(char a, char b)
{
    cout << "非模板函数" << endl;
    return a > b ? a : b;
}


//参数列表中也使用一般类型的参数
//T在函数定义中c定义中至少出现一次
template <typename T>
void compare(T a, int n)
{
    if (a > n)
        cout << a << "大于" << n << endl;
    else if(a == n)
        cout << a << "等于" << n << endl;
    else
        cout << a << "小于" << n << endl;

}

int main()
{
    cout << "10和8中较大的值为:" << max(10, 8) << endl;
    cout << "2.5和4.7中较大的值为:" << max<float>(2.5, 4.7) << endl;
    cout << "c 和 d中较大的值为: " << max('c', 'd') << endl;

    //max(10.5, 8); 

    compare(62.5, 100);
    compare(-2, 0);
    compare('a', 97);

    return 0;
}

类模板

定义:

       与函数模板的定义类似。 建立一个通用类,用来处理功能相同, 但数据类型不同的多个类。

声明形式(包含模板说明和类声明):
template <类型形式参数表(class/typename)>
class 类名
{
    类的数据成员和成员方法
}
示例:
//类模板
template <typename T>
class Cube
{
private:
    T a_;
public:
    Cube(T a = 0)
    {
        a_ = a;
    }
    ~Cube(){}
    T area()
    {
        return a_ * a_ * 6;
    }
    T volumn();
};

//在类模板外部定义成员函数时, 需要加上模板说明,在类名后面加上<T>
template<typename T>
T Cube<T>::volumn()
{
    return a_ * a_ * a_;
}
用类模板定义对象与使用:
//在定义对象时,要为类型形参T,显式地指定类型实参
    //类型实参 --- int
    Cube<int> cube1(2);
    cout << cube1.area() << endl;
    cout << cube1.volumn() << endl;
    //类型实参 --- double
    Cube<double> cube2(1.5);
    cout << cube2.area() << endl;
    cout << cube2.volumn() << endl;
注意:
  • 模板说明中的类型形式参数(T)在类定义中至少出现一次
  • 参数列表中也可以使用一般类型参数
template <typename T, int N>
  • 在类模板外部定义成员函数时, 需要加上模板说明
  • 用类模板定义对象时, 必须为模板形参显式指定类型实参
#include<iostream>

using namespace std;

//类模板
template <typename T>
class Cube
{
private:
    T a_;
public:
    Cube(T a = 0)
    {
        a_ = a;
    }
    ~Cube(){}
    T area()
    {
        return a_ * a_ * 6;
    }
    T volumn();
};

//在类模板外部定义成员函数时, 需要加上模板说明,在类名后面加上<T>
template<typename T>
T Cube<T>::volumn()
{
    return a_ * a_ * a_;
}

int main()
{
    //在定义对象时,要为类型形参T,显式地指定类型实参
    //类型实参 --- int
    Cube<int> cube1(2);
    cout << cube1.area() << endl;
    cout << cube1.volumn() << endl;
    //类型实参 --- double
    Cube<double> cube2(1.5);
    cout << cube2.area() << endl;
    cout << cube2.volumn() << endl;
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值