为什么默认实参总是放在函数声明中

分类: C/C++小知识 228人阅读 评论(0) 收藏 举报
对于函数的默认实参,我们一般都是放在函数的声明中的,而在定义中并不指定默认实参:
在头文件中声明函数:
//test.h
void func(int i = 0);
而在对应的源文件中实现函数:
//test.cpp
void func(int i){}//什么也不做
如果我们将默认实参从声明中删除,而在定义中添加,或者是声明和定义中都添加,不论值是否相同,都会报错。
但是,c++并没有规定必须是这样,c++的规定是:一个函数的默认实参既可以在定义中,也可在声明中指定,但在一个文件(准确的说,是一个作用域)中只能为一个形参指定默认实参一次。所以,我们可以这样写:
  1. int  func1(int i = -1){return i;}  
  2.   
  3. int main()  
  4. {  
  5.       
  6.     cout<<func1();  
  7. }  

这里就是在定义中指定的默认实参。 甚至我们可以这样写:
  1. int main()  
  2. {  
  3.     int func1(int i = 1 );  
  4.     cout<<func1();  
  5. }  
  6.   
  7. 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

相信看了以上的分析,我们就不难理解为什么默认实参一般都是放在函数的声明中的,而在定义中并不指定默认实参了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值