• 重载(Overloading)以及模板(Template)


    继续《C++ premier plus》的学习

    (1)函数重载,通俗来说,就是相同的函数名字名下,存在多个函数,要使得这成立,各个同名函数必须形参列表(也称为“签名”,signature)不同,形参相同,仅仅返回值不同,不能用作函数重载。

    (2)如果某个调用,匹配多个函数,编译器是如何选择的?

    原则是选择最匹配的(exact match)函数,例如有如下三个函数原型

    void stove(double & r1);                          //matches modifiable lvalue

    void stove(const double & r2);                 //matches modifiable and non-modifiable lvalue, and rvalue

    void stove(double && r3);                       //matches rvalue

    并且有如下语句:

    double x = 55.5;

    const double y = 32.0;

    stove(x);                      //使用stove(double & )

    stove(y);                      //使用stove(const double &)

    stove(x+y);                  //使用stove(double &&)

    (3)模板(template)并不是函数的定义,而是告诉编译器如何自动去定义函数的规则,定义两个数据交换的函数模板可以写成如下形式

    例子: template <typename T>

    void swap(T &a, T &b)

    {

         T temp;

          temp = a;

          a = b;

          b = temp;

    }

    上述代码中,关键词“typename”可以换成“class”,因为C++ 98标准创立以前,使用的是“class”,因此两种写法都是正确的

    (4)模板重载

    当两个模板名字相同,参数列表不同,即可以重载,方法与函数重载类似,不再赘述,值得提出的是,模板的参数列表允许出现其他类型的具体参数,如

    整型,浮点型,等等。

    (5)关于优先级

    假设一个函数调用匹配了多个函数(exact match),编译器会选择最佳匹配,这个过程称为“重载决策”,如果多个函数中只有一个非模板函数,则选择非模板函数;如果所有函数均为模板函数,选择更具体化(more specialized)的那个;如果有两个或以上同等匹配的非模板函数(模板函数),他们同样具体化,那么编译器将会报错。举例如下,

    template <typename T>                                            //模板A

    void ShowArray(T arr[], int n);

    template <typename T>                                          // 模板B

    void Show Array(T * arr[], int n);

    有如下语句:

    int a[4] = {1, 2, 3, 4};

    double * pd[3];

    for (int i = 0; i < 3; i++)

          *pd[i] = i;

    ShowArray(a, 4);                             //调用模板A

    ShowArray(pd, 3);                           //调用模板B

    上述例子中,第一次调用ShowArray(),选用模板A,T只用被解释成int 类型即可,因此编译器选择模板A;第二次调用ShowArray(), 选用模板A,T需要被解释成double *类型(指向double类型数据的指针),选用模板B,T只需要被解释成double数据类型,因此B比A更具体化,所以选用模板B

  • 相关阅读:
    sping AOP核心思想及实现原理
    springmvc RequestMappingHandlerMapping初始化详解
    springmvc RequestMappingHandlerAdapter初始化详解
    POJ 3169 Layout
    POJ 3264
    POJ 3461 Oulipo
    二分图判定 POJ-2492
    最小生成树 prim算法
    初级BFS
    哈夫曼建树
  • 原文地址:https://www.cnblogs.com/csucat/p/4579258.html
Copyright © 2020-2023  润新知