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

Posted 一棵灬胡杨树

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    

以上是关于C++——函数模版与类模版的主要内容,如果未能解决你的问题,请参考以下文章

[C++潜心修炼] 模版与泛型编程

C++认识模版函数

linux下练习 c++ 函数模版例子

C++模版编程实现Haskell的函数模式匹配特性

函数 的 重载 和 函数 模版

c++中的函数模版