为什么默认实参总是放在函数声明中
来源:互联网 发布:远程桌面数据加密错误 编辑:程序博客网 时间:2024/05/01 23:52
转自: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
相信看了以上的分析,我们就不难理解为什么默认实参一般都是放在函数的声明中的,而在定义中并不指定默认实参了。
0 0
- 为什么默认实参总是放在函数声明中
- 为什么默认实参总是放在函数声明中
- 为什么默认实参总是放在函数声明中
- 函数声明--默认实参
- STL之二: 为什么模板函数的声明与实现都放在.h文件中
- 模板类成员函数的定义和声明为什么要放在一个文件中
- 模板类成员函数的定义和声明为什么要放在一个文件中
- 模板类成员函数的定义和声明为什么要放在一个文件中
- C/C++中默认参数在哪指定?函数声明还是定义?默认参数需放在右边
- 学习笔记之C++为什么将函数声明或者类的定义放在.h文件中,而将其实现放在原文件中
- 从汇编角度看为什么模板函数声明和定义要放在头文件上
- Python - 在定义函数时,为什么默认参数不能放在必选参数前面?
- C++中模板定义与声明为什么放在同一个文件中
- 函数默认实参
- 默认实参,constexpr函数
- 函数的默认实参
- 为什么在C语言中函数的声明很重要
- 函数声明放在头文件中,函数的定义放在实现文件中,然后在主函数中调用
- Jmeter 的使用
- Leftmost Digit
- JAVA 图形界面swing 创建按钮、文本域
- (Java)字符串处理--equals()和equalsIgnoreCase()
- sidekiq在 Plain Ruby 项目中的使用
- 为什么默认实参总是放在函数声明中
- Restore SQL Server database in same SQL server with different name
- 如何确定抽样统计的最小样本量(附:随机抽样统计的抽样误差Excel计算表格)
- UVA 216 - Getting in Line
- email正则表达式
- Java实现 输出 任意两个数之间的斐波那契序列
- 菜鸟的安卓实习之路----解析网络XML文件
- 使用vs为按钮添加后台点击事件
- 如何确定抽样统计的最小样本量(附:随机抽样统计的抽样误差Excel计算表格)