转自:http://blog.csdn.net/thefutureisour/article/details/8064061
对于函数的默认实参,我们一般都是放在函数的声明中的,而在定义中并不指定默认实参:
在头文件中声明函数:
//test.h
void func(int i = 0);
而在对应的源文件中实现函数:
//test.cpp
void func(int i){}//什么也不做
如果我们将默认实参从声明中删除,而在定义中添加,或者是声明和定义中都添加,不论值是否相同,都会报错。
但是,c++并没有规定必须是这样,c++的规定是:一个函数的默认实参既可以在定义中,也可在声明中指定,但在一个文件(准确的说,是一个作用域)中只能为一个形参指定默认实参一次。(那为什么将默认实参从声明中删除,而在定义中添加会报错呢?原因是:声明中并没有指出这个函数有默认参数,见下)所以,我们可以这样写:
- int func1(int i = -1){return i;}
- int main()
- {
- cout<<func1();
- }
这里就是在定义中指定的默认实参。 甚至我们可以这样写:
- int main()
- {
- int func1(int i = 1 );
- cout<<func1();
- }
- int func1(int i = -1){return i;}
在全局作用域中,指定的默认值是-1,但是在main函数的作用域中,指定的默认值为1。
现在回到刚才提出的问题:
1.为什么默认实参从声明中删除,而在定义中添加会报错。因为当主函数(main.cpp)与头文件(test.h)相结合时,通过头文件的声明,得知func函数需要一个int类型的参数,(声明中并没有指出这个函数有默认参数),所以当编译main.cpp时,会报错:
d:\myprograms\c++\test\test\main.cpp(9): error C2660: “func”: 函数不接受 0 个参数
2.为什么在声明和定义中都添加,也会报错。原因是因为书上说的:但在一个文件(准确的说,是一个作用域)中只能为一个形参指定默认实参一次。当编译的时候,头文件回和源文件结合,这时,就会出现多次指定默认形参的情况,编译器报错:
d:\myprograms\c++\test\test\test.cpp(3): error C2572: “func”: 重定义默认参数 : 参数 1
相信看了以上的分析,我们就不难理解为什么默认实参一般都是放在函数的声明中的,而在定义中并不指定默认实参了。