在声明或定义函数时,可以选择给参数一个具体的值(常数或者宏定义),之后调用函数时就可以选择不传该参数。
某些函数中有这样一种形参,当函数多次被调用时他们往往都被赋予一个相同值,我们把这个反复出现的值称为默认实参;在声明该函数时,可以选择直接对默认实参对应的形参赋值,之后再选择调用该函数时,就可以不传这个参数。
实现:
如果不给参数的话就是默认实参,给参数的话按参数跑程序。
当一个函数有多个缺省参数时,必须满足:
声明与定义函数时:
void fun1(int a=10, int b =10, int c)
{
;//错误,默认实参必须放在右侧,c必须放在a,b的左边
}
void fun2(int a, int b = 10, int c = 10)
{
;//正确
}
调用函数时:
void fun(int a, int b = 10, int c = 10)
{
;
}
int main()
{
//错误,因为原函数有一个参数需要传递
fun();
//正确, 形参a被赋值为10
fun(10);
//正确, 形参a被赋值为10,b被赋值为20
fun(10, 20);
//错误,不可跳过b直接给c赋值
fun(10, , 30);
return 0;
}
//text.h
void fun(int a, int b, int c);
//main.cpp
#include"text.h"
int main()
{
fun(1,1,1);
return 0;
}
//text.cpp
#include"text.h"
void fun(int a = 10, int b = 10, int c = 10)
{
;
}
//错误,当函数声明与实现不在同一文件时,只能在声明处使用默认参数
//text.h
void fun(int a=10, int b=10, int c=10);
//main.cpp
#include"text.h"
int main()
{
fun(1,1,1);
return 0;
}
//text.cpp
#include"text.h"
void fun(int a , int b , int c )
{
;
}
//正确
同c语言一样,一个cpp程序从源码到一个可执行的二进制文件需要经历预处理,编译,汇编,链接四个阶段.
//text.h
void fun(int a, int b, int c);
//main.cpp
#include"text.h"
int main()
{
fun(1,1,1);
return 0;
}
//text.cpp
#include"text.h"
void fun(int a = 10, int b = 10, int c = 10)
{
;
}
//错误,当函数声明与实现不在同一文件时,只能在声明处使用默认参数
以这份代码为例
执行到链接过程时,
main.o文件中会有一份void fun(int a, int b, int c);
text.o文件中会有一份void fun(int a = 10, int b = 10, int c = 10);
执行链接过程时:
由于此时两个文件中有一份函数名,参数类型,返回值类型一模一样的函数,将这两个文件合并时就会发生重定义的错误.