- 前言
- 一、函数重载是什么?
- 二、函数重载的作用
- 三、函数重载的满足条件
- 四、函数重载的注意事项
- 1.引用作为重载条件
- 2.函数重载碰到默认参数
- 3.函数的返回值不可以作为函数重载的条件
- 总结
前言
最近学习了函数重载,里面有许多易错的,我平时遇到的一些错误,都总结在了下面,希望可以对你们有所帮助。
一、函数重载是什么?
重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个函数完成不同的功能。 这就是重载函数。 重载函数常用来实现功能类似而所处理的数据类型不同的问题。 不能只有函数返回值类型不同。
二、函数重载的作用函数名可以相同,提高复用性
三、函数重载的满足条件1.同一个作用域下
2.函数名称相同
3.函数参数类型不同或者个数不同或者顺序不同
注意必须同时满足以上三点才可以,缺一不可
代码如下(示例):
//函数个数不同 #includeusing namespace std; void fun() { cout << "fun 的调用" << endl; } void fun(int a)//函数个数不同 { cout << "fun(int a) 的调用" << endl; } int main() { fun(); fun(10); system("pause"); return 0; }
//函数类型不同 #includeusing namespace std; void fun(int a) { cout << "fun(int a) 的调用" << endl; } void fun(double a)//函数类型不同 { cout << "fun(double a) 的调用" << endl; } int main() { fun(10); fun(3.14); system("pause"); return 0; }
//函数类型顺序不同 #include四、函数重载的注意事项 1.引用作为重载条件using namespace std; void fun(int a,double b) { cout << "fun(int a,double b) 的调用" << endl; } void fun(double a ,int b)//函数顺序不同 { cout << "fun(double a,int b) 的调用" << endl; } int main() { fun(10,3.145); fun(3.14,10); system("pause"); return 0; }
代码如下(示例):
//引用作为重载条件 #include2.函数重载碰到默认参数using namespace std; void fun(int &a) { cout << "fun(int &a) 的调用" << endl; } void fun(const int &a)//引用作为重载条件 { cout << "fun(const int &a) 的调用" << endl; } int main() { int a = 3; fun(10);//调用参数为const int &a的函数,因为10是常数,const就是修饰常数的 fun(a);//调用参数为int &a的函数,因为a是变量 system("pause"); return 0; }
代码如下(示例):
//函数重载 默认参数 #includeusing namespace std; void fun(int a) { cout << "fun(int a) 的调用" << endl; } void fun(int a,int b = 10)//默认参数 { cout << "fun(int a,int b = 10) 的调用" << endl; } int main() { fun(10); fun(10,20); system("pause"); return 0; }
这样的代码初学重载的人很容易弄错,他们会以为我这里不是发生重载了嘛,参数个数也不一样呀,为啥会报错呢,下面我们来看一下这个的运行结果,如下图
上面说这里对重载的调用不明确,那么到底是怎么回事儿呢,我们来一起看一看,我们在调用fun(10)的时候,因为在fun(int a ,int b = 10)这个函数的形参中已经有了默认的参数了,这个时候这个10就不知道是要传给fun(int a)这个函数还是传给fun(int a ,int b = 10)这个函数了,所以造成了错误,我们会误认为是重载的条件发生了问题,但是究竟原因是调用不明确出的问题,不然我们可以测试一下,把默认函数值去掉会怎样,见如下代码及运行结果
//去掉默认参数后 #includeusing namespace std; void fun(int a) { cout << "fun(int a) 的调用" << endl; } void fun(int a,int b) { cout << "fun(int a,int b = 10) 的调用" << endl; } int main() { fun(10); fun(10,20); system("pause"); return 0; }
答案是可以正常调用的,所以更加验证了我刚才的话,造成错误的原因是调用不明确造成的。
代码如下(示例):
#includeusing namespace std; void fun(int a) { cout << "fun(int a1) 的调用" << endl; } int fun(int a) { cout << "fun(int a2) 的调用" << endl; return a; } int main() { fun(10); fun(10,20); system("pause"); return 0; }
这个代码显然是错误的,我们来看看错误是怎样说的
上面报了许多错,说fun重定义了,还有无法重载按返回值类型区分的函数,可见函数的返回值不可以作为函数重载的条件。
函数重载是可以提高复用性的,一般在功能相似的时候使用。



