函数重载
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。
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。