C++——函数模版与类模版

一、函数模版

我们都知道C++有一个重要的特性就是代码复用。为了实现这个代码复用,代码就必须得有通用性,也就是说代码不受数据类型的影响,并且可以自动适应数据的类型变化。模版其实就是C++支持参数化程序设计的工具,通过模版可以实现参数多态性。说白了就是将程序所处理的对象的类型参数化,使得程序可以用于处理多种不同类型的对象。

下面我们来看一个例子:

int abs(int x)
{
    return x < 0 ? -x : x;
}

double abs(double x)
{
    return x < 0 ? -x : x;
}

很显然这两个函数只是参数类型不一样,功能完全一样。所以我们需要一个通用的代码使得开发效率提高。
函数模版的定义如下:

template <模版参数表>
类型名 函数名(参数表)
{
    //函数体
}

所有函数模版的定义都是用关键字template开始,模版参数表可以包括下面内容:

  1. class(或typename)标识符,指明可以接受一个类型参数,类型参数可以是内置类型或者自定义类型。
  2. template<参数表>class标识符,指明可以接受一个类模版名作为参数。

知道了这些我们就可以将上面的程序用函数模版写出来:

#include <iostream>
using namespace std;

template <typename T>

T abs(T x)
{
    return x < 0 ? -x : x;
}

int main()
{
    int x = -5;
    double y = -5.5;
    cout<<abs(x)<<endl;
    cout<<abs(y)<<endl;
    return 0;
}

在上面这段程序中调用abs函数时,编译器就会从实参的类型推导出函数模版的类型参数。当调用abs(x)时,因为实参x为int类型,所以推导出模版中类型参数T为int。

当主函数第一次调用abs的时候,执行的实际上是由函数模版生成的函数:

int abs(int x)

Notes:模版函数与重载是密切相关的。从函数模版产生的相关函数都是同名的,编译器用重载的方式点用相应的函数。

虽然函数模版的使用形式和函数类似,但是两者有本质的区别,这主要表现在以下几个方面:

  1. 函数模版本身在编译的时候不会生成任何目标代码,只有由模版生成的实例会生成目标代码
  2. 被多个源文件引用的函数模版必须和函数体一起放在头文件中,不能只将声明放在头文件中。
  3. 函数指针也只能指向模版的实例,而不能指向模版本身。

二、类模版

类模版的使用可以为类定义一种模式,使得类中的某些数据成员、成员函数的参数、返回值或者局部变量可以取任意一种类型。

类模版声明的形式为:

template <m模版参数表>
class  类名
{
    类成员声明.
}

其中类成员声明的方法与普通类的定义几乎相同,只是在它的各个成员(数据成员和函数成员)中通常要用到模版的类型参数T。

如果需要在类模版以外定义其成员函数,则要采用以下的形式:

template<模版参数表>
类型名 类名<模版参数标识符列表> :: 函数名(参数表)

Notes:一个类模版自身并不是一个类。只有当被其他代码引用的时候,模版才根据引用的需要生成具体的类。

使用一个模版类来建立对象时,应按如下形式声明:

模版名<模版参数表>对象名1,.....对象名n;

举个例子:

#include <iostream>
using namespace std;

template<typename T>    //模板声明,其中T为类型参数
class Cmp{
public:
    Cmp(T i,T j)
    {
        x = i;
        y = j;
    }
    T max()
    {
        return (x>y)?x:y;
    }
private:
    T x,y;
};

上述求最大值代码的主函数可以改下成下面的样子:

int main()
{
    Cmp<int>c1(3,7);
    Cmp<double>c2(12.34,56.78);
    Cmp<char>c3('a','x');
    cout<<"其中的最大值是:"<<c1.max()<<endl;
    cout<<"其中的最大值是:"<<c2.max()<<endl;
    cout<<"其中的最大值是:"<<c3.max()<<endl;
    return  0;
}    

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值