命名空间
在 C++ 开发中,命名空间是解决标识符冲突的重要手段。理解其查找顺序和展开规则非常关键。
查找顺序
编译器解析标识符时遵循以下优先级:
- 当前局部域:优先查找函数内部或块作用域内的定义。
- 全局域:若局部未找到,则在全局范围内搜索。
- 其他命名空间:默认不会自动跳转到其他命名空间中查找,除非显式指定。
展开方式
命名空间的引入主要有三种形式:
- 指定访问:使用
::作用域解析运算符,如std::cout。 - 全展开:使用
using namespace std;将整个命名空间引入当前作用域(注意避免污染全局环境)。 - 指定展开某一个:仅引入特定成员,如
using std::cout;,这种方式更推荐,既方便又安全。
注意事项
- 不同域中可以定义同名的变量、函数或类型,通过作用域区分。
- 两个私有命名空间同时展开且名称相同时,会直接报错冲突。
- 一个私有命名空间和全局域同时展开通常不会冲突,仍按上述查找顺序执行。
- 不同文件中定义了同一个命名空间,它们会被合并视为同一个命名空间。
输入与输出
C++ 的标准 IO 基于流(Stream)机制,通过 iostream 库提供。核心操作符包括流插入 << 和流提取 >>。
#include <iostream>
int main() {
int i = 0;
double j = 1.11;
// 自动识别类型并输出
std::cout << i << " " << j << '\n' << std::endl;
return 0;
}
实际编写时,建议始终包含头文件并使用 std:: 前缀,或者在文件顶部明确声明 using namespace std;。注意换行符 \n 与 std::endl 的区别,前者不强制刷新缓冲区,性能更高。
缺省参数
缺省参数允许在函数声明时指定参数的默认值,调用时可省略部分实参。但必须遵守严格的规则:
- 从右向左:缺省值必须从函数的最右侧参数开始依次设置,不能跳跃。
- 声明与定义:通常只在函数声明处给出缺省值,定义处不再重复指定,以免产生歧义。
- 传递顺序:调用时必须按顺序传参,不能跳过中间参数。
示例:
;
();
(, );
(, , );


