Linux C/C++——命名空间

  命名空间

  在学习命名空间之前,我们先引入一个在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;
}

看下运行结果:

可以看到,我们输出了相同变量名的不同值。但我们一定要注意,命名空间一定要定义在全局变量内,否则会报错。

  另外命名空间还有以下特点:

  1. 命名空间可以重名,后来的命名空间就是对前面命名空间的补充。通过上面截图我们可以看到,在定义了两个B,一个中含a,一个中含b,在后面引用B的时候,就会自动多了b这个变量,就是后面再定义跟之前命名空间一样的,就会作为前面的一个补充。
  2. 命名空间内可以定义变量、函数、结构体和类。

  3.命名空间可以嵌套,比如说在我们定义的B中定义一个C,接下来我们要用C中的成员时就需要先引用B再引用C。

  好了,今天就先写到这里,我们就先简单了解一下命名空间,后面等深入了解了再讲。

原文地址:https://www.cnblogs.com/953-zjf/p/namespace.html