命名空间
在学习命名空间之前,我们先引入一个在C语言中不存在的运算符——(::),冒号运算符,在日常开发中我们可能会遇到很多变量,那怎么保证每一个变量名都不一样呢?而且我们也没办法保证不跟头文件里包括的变量相冲突呢?于是C++中就引入了冒号运算符。首先,让我们来看一段代码
#include<iostream> using namespace std; int a = 100; //定义一个全局变量 void func() { int a = 10; //定义一个局部变量 cout<<a<<endl; cout<<::a<<endl; } int main(int argc, const char** argv) { func(); return 0; }
我们来分析一下这段代码,很明显,在func()函数里第一个a会输出10,因为就近原则嘛,那我们如果我们要用定义的那个全局变量a怎么办呢?这时候就要用到冒号运算符了,在变量a前面加上::,我们看下运行结果:
这就是冒号运算符的作用,如果在冒号运算符前什么都不加的话,则默认为全局变量,当然还可以加别的命名空间。
这里我们先举个例子:假如说现在同一辅导员手下带的班里有两个人叫小明,但他们不属于同一个班,如果说辅导员要找小明,是不是就有点冲突了,于是就想了一个办法,给他们加上班级来以示区分,于是就成了A班小明和B班小明。在C++中就是如此,用namespace来开辟两个不同的空间来存放名字相同的变量,在引用该变量时,只要加上空间名就可以了,接下来,上代码。
#include<iostream> using namespace std; namespace A{ int a = 100; } namespace B{ int a = 10; } void test01(){ cout<<A::a<<endl; cout<<B::a<<endl; } int main(int argc, const char** argv) { test01(); return 0; }
看下运行结果:
可以看到,我们输出了相同变量名的不同值。但我们一定要注意,命名空间一定要定义在全局变量内,否则会报错。
另外命名空间还有以下特点:
- 命名空间可以重名,后来的命名空间就是对前面命名空间的补充。通过上面截图我们可以看到,在定义了两个B,一个中含a,一个中含b,在后面引用B的时候,就会自动多了b这个变量,就是后面再定义跟之前命名空间一样的,就会作为前面的一个补充。
- 命名空间内可以定义变量、函数、结构体和类。
3.命名空间可以嵌套,比如说在我们定义的B中定义一个C,接下来我们要用C中的成员时就需要先引用B再引用C。
好了,今天就先写到这里,我们就先简单了解一下命名空间,后面等深入了解了再讲。