首先我们来看什么是命名空间
命名空间是C++引入的一个概念,其关键字是namespace
我们可以把一些变量,函数放进命名空间里,比如C++里面的头文件,库函数,stl都放进了std的命名空间里
那命名空间有什么用呢?我们来看下面这个例子
这里我们定义了一个全局的rand变量,然后我们想打印它,但是缺报错了,这是为什么呢?
因为rand在c语言中的stdlib.h这个头函数中被定义成了一个函数,因此和我们定义的rand冲突了。
这个问题就很麻烦,因为C++中,变量、函数以及后面要学习到的类都是大量存在的,这些变量、函数和类的名称若在全局作用域中,可能会和C++库中的名称冲突。
我们在解决这个问题之前,首先要理解全局作用域的概念和局部作用域的概念
局部作用域是指在函数内部定义的
全局作用域是指在函数外面定义的
比如这两个变量a,一个是全局变量,一个是局部变量,我们在进行访问是首先访问的是局部变量
那么怎么在局部作用域中访问全局变量呢,这时候就可以用C++中的域访问限定符了
::是作用域限定符
::前面什么都不加访问的就是全局变量
现在我们回到一开始的问题,如何解决rand的命名冲突问题呢?
我们可以自己定义一个命名空间域,然后把rand放进去,调用的时候指定域名即可
这样的话就没有问题了;
变量的搜索顺序:局部域->全局域->命名空间域(如果不展开不会去搜索)
命名空间的三种使用方式
1.命名空间名称+域作用限定符
就是上图这种情况
2.将命名空间全部展开 using namespace 命名空间名称
这种方式会把命名空间全部展开,这样就相当于全部放到全局作用域中了,这样的话就就会和一开始的情况一样,可能会和库里里面的名称冲突,所以在以后得项目中不推荐这样写,如果是写编程题或者日常使用可以
3.将命名空间的某些成员展开
命名空间可以嵌套
总结:命名空间的出现是为了解决命名冲突的问题