zoukankan      html  css  js  c++  java
  • 重载(上)——函数签名和重载

    函数签名:函数的名称及其参数类型组合在一起,就定义了一个唯一的特性,称为函数签名。(不包括返回类型)

    在编写包含函数调用的语句时,编译器就会使用该调用创建一个函数签名。再把它与函数原型/或定义中可用的函数签名集比较。如果找到匹配的函数名,就建立所调用的函数。

    重载:多个相同函数名,不容的参数个数或者类型的形式叫做函数的重载。

    attention:重载和引用参数

    #include <iostream>
    double larger(double a,double b);
    long& larger(long& a,long& b);
    using namespace std;
    void main()
    {

    cout<<"lager of 1.5 and 2.5 is"<<larger(1.5,2.5)<<endl;
    int value1=35;
    int value2=45;
    cout<<"lager of "<<static_cast<long>value1<<" and "<<static_cast<long>value2<<" is "<<larger(value1,value2)<<endl;
    getchar();

    }
    double larger(double a,double b)
    {
    cout<<"double version:";
    return a>b?a:b;
    }
    long& larger(long& a,long& b)
    {
    cout<<"long ref version:";
    return a>b?a:b;
    }

    本来第二个进行了static_cast<long>之后输出期望是 "long ref version" ,为什么会是这个结果呢?

    参数不是value1和value2,而是包含相同值的临时位置,这两个值转换为long类型。在幕后,编译器没有准备使用临时地址来初始化引用,这太冒险了。larger()中的代码可以自由控制它对引用参数进行的操作,在理论上,两个引用参数都可以修改和返回。因为以这种方式使用临时位置不是很明智,所以编译器不使用。

    该如何处理这个问题?

    1 可以把value1 value2申明为long类型

    2 如果环境不允许这么做,还可以把引用参数申明为const:   long& larger(const long& a,const long& b). 一定要在函数原型和定义处同时修改,通知编译器不能修改参数,于是编译器就允许调用这个版本,而不是参数为double的版本。

  • 相关阅读:
    MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用
    MVC5+EF6 入门完整教程十
    MVC5+EF6 入门完整教程九
    MVC5+EF6 入门完整教程八
    MVC5+EF6 入门完整教程七
    MVC5+EF6 入门完整教程六
    MVC5+EF6 入门完整教程五
    MVC5+EF6 入门完整教程四
    MVC5 + EF6 完整入门教程三
    从前端的UI开始
  • 原文地址:https://www.cnblogs.com/Daringoo/p/4392514.html
Copyright © 2011-2022 走看看