函数重载

函数重载


1.C++允许在同一范围中声明几个同名函数(可以是不同的功能),但是这些同名函数的形式参数(指参数的个数、类型或者顺序)
必须不同,即函数的参数列表不同以用来区分进入不同的函数


2.重载作用
2.1 是程序的可读性提高,解决绞尽脑汁想名字的问题,
2.2 在运算过程中可能会遇到数据类型的强制转换,得到非期望的结果  如 2.2+2.2 如果是 void(int int),那么答案为4而不是 4.4 



#include <iostream>


using namespace std;




int  AA(int  n,int m)
{
     return m+n;
}


double  AA(double n,double  m)
{
     return n+m;
}


int main()
{
  cout << AA(2,2)<<"  ";
  cout <<AA(2.3,2.3);


    return 0;
}
输出结果 4  9


3.构成函数重载的条件


void print(int a ,string b); //参数个数不同
void print(string a ,int b);//参数顺序不同
void print(int a int b int c); //参数个数不同




  4.重载函数的匹配原则: 
  4.1.将所有同名函数作为候选者 
  4.2.尝试寻找可行的候选函数 
  4.3.精确匹配实参 
  4.4.通过默认参数能够匹配实参 
  4.5.通过默认类型转换匹配实参 没有找到严格匹配的函数,但是可以通过隐式转化,找到适合的重载函数
  4.6.匹配失败 
  4.7.最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。
  4.8.无法匹配所有候选者,函数未定义,编译失败。 


例:


#include<iostream>
#include<stdio.h>
using namespace std;
void count(int a)   //参数类型为int
{
    cout << "void count(int a)" << endl;
}
void count(string a)//参数类型
{
    cout << "void count(string a)" << endl;
}
int main()
{
    double min = 0.5;
    count(min); //实参为double类型
    getchar();
    return 0;
}


通过隐式转换可以将double转为int,然后调用参数类型为int 的函数。 
但是要注意一个问题,就是隐式转换的规则。 
而且要注意int到long和double,double到int和float的隐式转换,会引发二义性(ambiguous)。就是有两个都可行的选择,计算机无法替你做选择。(计算机也有选择困难症啊。。。。)例:


#include<iostream>
#include<stdio.h>
using namespace std;
void count(double a)//形参类型为double
{
    cout << "void count(double a)" << endl;
}
void count(long b)//形参类型为long
{
    cout << "void count(long b)" << endl;
}
int main()
{
    int min = 10;
    count(min);//实参类型为int
    getchar();
    return 0;
}


此时无法通过编译。显示 error C2668: “count”: 对重载函数的调用不明确。即,ambiguous。

猜你喜欢

转载自blog.csdn.net/qq_41199502/article/details/80301694