默认参数就是我们在定义函数的时候,有时候传入的参数大多数情况下都是使用同一个值,这个时候就需要定义默认参数的值来达到简化函数调用的目的。
个人理解他可以间接实现函数重载的效果。下面来看下各个语言的写法。
c的写法
c中没有默认参数值的概念,不过可通过宏定义间接实现默认参数值的效果。
#include <stdio.h>
//在宏定义中,宏参数名前加上#表示为一个字符串
//定义DEFARG宏,后面的判断表达式表示如果存在name的值,则为name,不存在则name的值为defval
#define DEFARG(name, defval) ((#name[0]) ? (name + 0) : defval)
int _f1(int i) {
return 2 * i;
}
//定义_f1为f1函数,并将定义的DEFARG宏作为参数
#define f1(arg0) _f1(DEFARG(arg0, 0))
int _f2(int i, int j) {
return i + j;
}
#define f2(arg0, arg1) _f2(DEFARG(arg0, 0), DEFARG(arg1, 1))
int main() {
printf("%d\n", f1());
printf("%d\n", f1(1));
printf("%d\n", f2(,));
printf("%d\n", f2(2,));
printf("%d\n", f2(, 3));
printf("%d\n", f2(4, 5));
return 0;
}
//这个方法存在一个问题,对于有多个参数的函数,调用时需要将参数列表中的每个”,“写出来,不过这样也带来一个好处,可以把默认参数放在非默认参数之前。
c++的写法
#include <stdio.h>
//直接在传入参数后面添加等号值表示默认参数
//默认参数从右向左定义,也就是说void printNums(int firstnum=10, int secondnum)这种写法是错误的
void printNums(int firstnum, int secondnum = 10) {
printf("firstnum is %d\n", firstnum+secondnum);
}
int main() {
printNums(2);
printNums(2, 12);
}
python的写法
def get_nums(firstname=3, secondname = 10):
print("sum is " + str(firstname+secondname))
if __name__ == "__main__":
get_nums()
get_nums(2)
get_nums(2, 12)
对比总结:
- c、java和go不能实现默认参数值,虽然c可以间接实现,但是在实际当中实现这个默认参数的过程就花费了不少时间,个人不赞同郑重方法。有这时间还不如复制几行然后稍微更改下。
- c++和python的默认参数实现写法大致相同,需要注意的是,c++的默认参数必须从右向左定义。