C++中到底在声明中还是定义中指定默认参数
来源:互联网 发布:淘宝下载安装2015旧版 编辑:程序博客网 时间:2024/06/07 18:03
【学习于C语言中文网,请勿转载】
除了函数定义,你也可以在函数声明处指定默认参数。不过当出现函数声明时情况会变得稍微复杂,有时候你可以在声明处和定义处同时指定默认参数,有时候你只能在声明处指定,请看下面的例子(示例1):
- #include <iostream>
- using namespace std;
- void func(int a, int b = 10, int c = 36);
- int main(){
- func(99);
- return 0;
- }
- void func(int a, int b = 10, int c = 36){
- cout<<a<<", "<<b<<", "<<c<<endl;
- }
main.cpp 代码:
- #include <iostream>
- using namespace std;
- void func(int a, int b = 10, int c = 36);
- int main(){
- func(99);
- return 0;
- }
- #include <iostream>
- using namespace std;
- void func(int a, int b = 10, int c = 36){
- cout<<a<<", "<<b<<", "<<c<<endl;
- }
99, 10, 36
修改后的代码是可以编译通过的,这有点让人摸不着头脑,为什么将 func() 的定义放到其他源文件中就不一样了呢?
这是因为C++ 规定,在给定的作用域中只能指定一次默认参数。对于示例1,func() 的定义和声明位于同一个源文件,它们的作用域也都是整个源文件,这样就导致在同一个文件作用域中指定了两次默认参数,违反了 C++ 的规定。
对于示例2,func() 的声明位于
main.cpp
,作用域也是main.cpp
,而 func() 的定义位于module.cpp
,作用域也是module.cpp
,func() 的声明和定义位于不同的作用域,相互之间不影响。C语言有四种作用域,分别是函数原型作用域、局部作用域(函数作用域)、块作用域、文件作用域(全局作用域),C++ 也有这几种作用域。继续对代码进行修改,将 func() 定义处 b、c 的默认值分别设置为 5、57,而声明处 b、c 的默认值不变,依然为 10、36。编译并运行程序,发现输出结果与上面一样,这说明编译器使用的是当前作用域中的默认参数。站在编译器的角度看,它不管当前作用域中是函数声明还是函数定义,只要有默认参数就可以使用。
多次声明同一函数
在多文件编程时,我们通常的做法是将函数声明放在头文件中,并且一个函数只声明一次,但是多次声明同一函数也是合法的。不过有一点需要注意,在给定的作用域中一个形参只能被赋予一次默认参数。换句话说,函数的后续声明只能为之前那些没有默认值的形参添加默认值,而且该形参右侧的所有形参必须都有默认值。
为了说明问题,我们不妨对 main.cpp 中的代码稍作修改:
- #include <iostream>
- using namespace std;
- //多次声明同一个函数
- void func(int a, int b, int c = 36);
- void func(int a, int b = 5, int c);
- int main(){
- func(99);
- return 0;
- }
阅读全文
1 0
- C++中到底在声明中还是定义中指定默认参数
- C/C++中默认参数在哪指定?函数声明还是定义?默认参数需放在右边
- C++ 函数声明中指定,默认参数
- C/C++笔试系列--默认参数在哪指定?函数声明还是定义?
- 默认参数在哪指定?函数声明还是定义?
- C++默认参数在声明还是定义确定?
- 在程序中向水晶报表传参数,以及在程序中指定报表源
- DW-在浏览器中预览“首选参数中指定的浏览器在指定位置不存在”
- 用grep在子目录中指定的文件类型中查找
- 在C/C++语言中声明和定义的区别
- 类声明和定义中const、inline、默认参数、explicit、static、virtual的出现频率
- 类声明和定义中const、inline、默认参数、explicit、static、virtual的基本使用方法
- c++ 中默认参数的函数声明和定义的注意事项
- C++类的声明与实现中容易忽视的重定义默认参数的错误
- 类声明和定义中const、inline、默认参数、explicit、static、virtual的出现频率
- 在浏览器中预览“首选参数中指定的浏览器位置已经不存在。请确认”首选参数“指向正确的文件
- 在/etc/fstab文件中指定的文件系统加载参数中, 参数一般用于CD-ROM等移动设备。----百度2016研发工程师笔试题(六)
- 在C语言中模拟含有默认参数的函数
- IO模型与Java IO
- Linux下使用grep 进行全匹配匹配
- 第五章movetest3.s例子
- POJ 3728 The merchant(在线倍增LCA)
- SDK11 新特性之ColorNamed
- C++中到底在声明中还是定义中指定默认参数
- 在EasyDarwin进行实时视频转发的两种模式
- 获取指定时间的前n天或后n天
- Glide使用简介与源码分析
- Linux下下载安装Python
- 页面延迟加载效果
- IOS Xcode 8.3 设置启动页
- 华东、华北、华南的城市
- 无密码SCP