1.概念
命名空间的出现是为了防止标识符的重定义,比如在合并多个文件后,可能会出现多个文件
使用了同一个变量名。再比如你的变量名与某一函数相同。(命名空间中可以定义函数)
2.原理:
为什么会出现重定义这样的问题?因为在同一个作用域中不能定义同名变量。而命名空间可以为其中一个变量在当前作用域中另外开辟一个作用域,这样他梦们之间的作用域不同,也就可以再次使用这个标识符了,你可以想象为将重定义的两个变量中的一个关起来.
特别注意的是,命名空间针对的是全局变量,不能在main函数中使用它
3.了解
1.namespace是命名空间的关键字,xx是自己起的名字
2.命名空间可以嵌套定义,这样可以放在多个命名空间之间的重定义
2.在同一个大项目下,同名的命名空间会自动合并成一个命名空间
4.使用
共有三种方式去使用命名空间中的变量
1.通过作用域限定符“::”来使用
要注意的是:对于结构体,要将xx::置于结构体名字之前不能置于struct之前,因为struct不是结构体名字而是关键字。
2.使用using xx:y将命名空间xx中的成员y引入
每次使用命名空间中的成员时,都要写成xx::a,这样会比较麻烦。
因此我们使用using xx::a,将命名空间中的a变量放出来(注意:a的作用域仍然不是全局,只是能打上全局变量的标签),当作全局变量使用(局部变量优先)
然而,此时命名空间外不能有同名变量,否则就与放出来的a重定义了.
3.使用using namespace xx将命名空间xx引入
类似于第二种方法,第三种方法会将命名空间中的变量全部解放出来(注意:a的作用域仍然不是全局,只是能打上全局变量的标签),但这样会失去命名空间的意义所以一般不用
补充一下:1.在如果把命名空间中的变量当作参数传给同一命名空间的函数,就算不用作用域限定符限定函数,也会优先调用和参数在同一命名空间的函数.
2.命名空间只影响作用域不会影响本来的生命周期