C++函数默认值与函数重载
Posted 嵌入式情报局
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++函数默认值与函数重载相关的知识,希望对你有一定的参考价值。
ID:嵌入式情报局
1函数默认参数
我们知道C语言中的形参个数与调用时候使用的实参个数必须要一一对应,如果一方个数少了,参数类型不一致就会导致编译告警或报错。
而对于C++函数可以为函数参数提供默认的参数值,你可以在调用的时候选择性的传入实参,一旦没有传入实参,那么以默认值传递。
先看一个简单的例子 :
#include <iostream>
#include <stdio.h>
int Add(int a = 1,int b = 2)
{
return(a + b);
}
int main(int argc, char** argv) {
printf("Add1 = %d
",Add());
printf("Add2 = %d
",Add(2));
printf("Add3 = %d
",Add(2,5));
return 0;
}
运行结果如下:
其实函数默认参数就是在声明的位置为函数形参提供默认值,以后你就可以对有默认值的参数不再提供具体的实参。
C++函数默认参数注意如下几点:
1)函数参数从左自右,一旦为其中一个参数提供默认值,其右边的所有参数均需要提供默认值,否则会编译失败!
为什么呢?小哥的理解是因为你所传递的实参都是以从左自右连续传递的。
2)一般都只在函数声明部分来提供默认值,如果只有函数定义也可以只在定义处提供默认值,但注意不能够声明和定义都提供默认值,也不能在不同的声明中提供默认值,编译器会认为重复定义。
2函数重载
C++中重载是一种非常重要的属性,在以后的编程中也是随处可见,所谓重载就是一个标识重复使用但由于搭配不同而调用不同方法的现象。
那么对于函数重载就是调用同一个函数名称,根据参数不同而调用不同的方法。
在C语言中我们经常有一些尴尬的处境,比如函数参数类型一换,凉凉,可能整个函数名称都要换一个,更可怕的是这个函数名还不知道怎么起。
所以C++提供了函数重载的特性,比如下面的例子:
#include <iostream>
#include <stdio.h>
int Add(int a ,int b);
float Add(float a ,float b);
int main(int argc, char** argv) {
printf("Add1 = %d
",Add(2,5));
printf("Add2 = %.4f
",Add(2.5f,2.1f));
return 0;
}
int Add(int a ,int b )
{
printf("调用int add
");
return(a + b);
}
float Add(float a ,float b )
{
printf("调用float add
");
return(a + b);
}
最后获得结果如下:
上面的程序都是调用的函数名add,但是由于函数根据参数类型不同进行重载,从而调用了不同的add函数的具体实现,这与我们现实生活是非常贴近的,比如我们playball()玩球函数,传入不同的球类型就可以了,而并没有必要修改函数名称。
来总结一下函数重载的条件,一句话 : 参数个数、类型、类型顺序不同均可以进行参数重载,返回值类型不同不构成重载条件。
其中类型顺序可能很多朋友认为写错了,其实并没有,比如下方就不满足重载条件。
int Add(int a ,int b);
int Add(int b ,int a );
3默认参数与重载
对于函数重载主要是根据参数来进行函数的具体实现匹配,如果存在歧义那么肯定就会编译失败,其实有些规则你不需要太多的记忆,一旦自己分不太清楚该调用哪个函数实现,多半就是存在歧义,会导致编译失败,如下警告 :
//可函数重载
int Add(int a ,int b);
int Add(int a ,int b,int c);
//函数重载存在歧义
int Add(int a ,int b);
int Add(int a ,int b,int c = 1);
不可重载编译器一般会报类似于如下错误:
[Error] call of overloaded 'Add(int, int)' is ambiguous
C++函数重载规则:
C++编译器对于函数重载优先执行精准匹配,如果没有精准匹配,就会查找是否存在默认值的匹配,还是没有的话,就会执行默认强制类型转化来进行匹配,最后检查是否存在函数调用的二义性,如果有则编译失败否则成功。
5最后
推荐好文 点击蓝色字体即可跳转
☞
☞
☞
☞
长按右侧二维码
即可获取更多精彩内容
以上是关于C++函数默认值与函数重载的主要内容,如果未能解决你的问题,请参考以下文章