C语言定义了3个层次的作用域:文件、函数和复合语句。
C++ 引入了类的作用域,类是在文件内的。
在不同的作用域中,可以定义相同名字的变量,互不干扰,编译器能够区别它们。
1、命名空间的概念
C语言中,只有一个全局作用域,所有全局标识符共享一个作用域,因此绝对不能重名。
但随着系统越来越复杂,通常不会仅由一个人来开发,不同的人开发同一个系统,不可避免地会出现变量或函数的命名冲突,当将所有人的代码结合到一起时,就会因为变量或函数重名,导致编译失败。
因此,C++提出了命名空间的概念:
- 命名空间将全局作用域分成不同的部分;
- 不同命名空间的标识符可以同名,不会发生冲突;
- 命名空间可以嵌套。
namespace Name1
{
namespace Name2
{
/*...*/
}
/*...*/
}
全局作用域也叫默认命名空间。
2、举例说明
比如现在有一个小学,学校里有六个年级,每个年级有三个班级。
现在一位老人来这个学校找到校长,要找一位叫张三的学生,感谢他在公共汽车上给自己让座。
现在校长(编译器)要找张三,但学校里有很多叫张三的人,怎么确定是哪个张三呢?
这时如果知道张三是哪个年纪,哪个班级,那么很快就能确定是谁。
假设是三年级二班的张三,那么这个三年级二班就是命名空间。
namespace grade
{
namespace class
{
student zhang_san;
}
}
C++的命名空间,就是一种为了避免命名冲突的机制。
3、使用方式
C++的命名空间,有两种使用方式:
- 导入整个命名空间:using namespace name;
- 只导入命名空间中的某个变量:using name::variable
// 导入整个std命名空间到当前作用域
using namespace std;
// 只导入cout到当前作用域
using std::cout;