在一个作用域中(在一对大花括号里面),变量的名字是不能重复定义的;还有变量的名字不能和库里面的关键字或者函数同名;最后,在一个项目中,多个头文件可能定义多个变量,可能会出现变量重名的情况。C语言中无法解决变量重命名的情况,所以C++为了解决变量名冲突的问题,使用了命名空间的概念。
C++中有四个域:类域、命名空间域、全局域、局部域。
编译搜索变量的顺序:局部域->全局域 -> 展开了命名空间域 or 指定访问命名空间域。
要想在局部变量存在的时候访问全局变量的值的话,使用 **:*符号
定义一个命名空间:
没有对命名空间域没有被展开,也没用指定命名空间域,编译的时候是不会在命名空间域中查找变量的。
对命名空间域的展开:
可见对命名空间域的展开,相当于命名空间里面的变量就变成了全局变量。可想而知,对命名空间域的展开对于一个大型的项目来说是很不友好的,因为在大型项目中,一开始写代码的时候,不会出现变量冲突,但是当对某一个命名空间域展开的时候,一旦出先变量名字冲突,修改起来就很麻烦。
所以,有时候我们可以指定命名空间域。
对于 :: 来说,前面没有为空白字符表示的全局域的变量;前面加命名空间的名字的时候,访问的就是该名字的命名空间里面的变量。
这样子就可以很好解决了rand变量和库里函数rand()的命名冲突了。
一个命名空间里面的定义量大的时候,可能会出现命名空间的嵌套。
std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
当我们需要大量输出的时候的时候,需要每次添加std::,会显得很麻烦。所以,我们可以对特定的命名空间里面的常用变量进行展开使用
**解释:**显示屏幕上
它可以自动识别显示的类型。
<<流插入运算符
>>流提取运算符符