命名空间

在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致许多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或者名字污染。

一、命名空间的定义

定义命名空间,需要使用关键字namespace关键字,后面跟着命名空间的名字,然后接一对{}即可,{}中即为命名空间中的成员。

1、普通命名空间的定义

命名空间例可以定义变量亦可以定义函数。

例如下面的例子中,访问a时需要加上作用域限定符 : : ,即N1: :a

namespace N1
{
    int a;    //定义变量
    int add(int left,int right)    //定义函数
    {
         return left+right;
    }
}

 

2、命名空间的嵌套

在N1命名空间中嵌套了N2命名空间。

此时访问b时需要这样访问:N1: :N2: :b (即两层命名空间)

namespace N1
{
    int a;    //定义变量
    int add(int left,int right)    //定义函数
    {
         return left+right;
    }
    namespace N2
    {
        int b;
        int sub(int left,int right)
        {
            return left-right;
        }
    }
}

 

3、同一个工程中允许存在多个相同名称的命名空间

编辑器最后会合成同一个命名空间中。

namespace N1
{
    int Mul(int left, int right)
    {
        return left * right;
    }
}

 

二、命名空间的使用

命名空间里的成员应该如何使用呢?命名空间里的成员相当于有一个域的封装,所以在访问的时候需要加上域作用限定符(: :)。
请看下面的代码在访问a时会出错:

namespace N
{
    int a = 10;
    int b = 20;
    int Add(int left, int right)
    {
        return left + right;
    }
    int Sub(int left, int right)
    {
        return left - right;
    }
}
int main()
{
    printf("%d\n", a);    // 该语句编译出错,无法识别a
    return 0;
}

 

1、加命名空间名称以及作用域限定符

应用场景:命名空间中的某个成员在文件中偶尔被使用到,在变量名前加上域作用限定符即可:

int main()
{
    printf("%d\n",N::a);
    return 0;
}

 

2、使用using 关键字将命名空间中的成员引入

此方法只会展开部分指定的命名空间中的成员。例如下面的代码,只展开了N命名空间中的b成员,因此访问b时可以不用受命名空间的限制,但是a还是受命名空间的限制的。
应用场景:命名空间中某个成员在文件中多次被用到,只需展开该成员的命名空间,使用using N: :a,可能会冲突

using N::b;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    return 0;
}

 

3、使用using namespace命名空间名称引入

此方法可以将全部命名空间的内容都展开。
应用场景:命名空间中许多成员都要在当前文件中被使用using namespace N,但是冲突的概率比较高。

例如下面的代码,将命名空间N全部展开,因此访问a和b时都不受命名空间的限制。

using namespace N;
int main()
{
    printf("%d\n", a);
    printf("%d\n", b);
    return 0;
}

 

posted on 2020-03-27 14:55  我得去图书馆了  阅读(234)  评论(0)    收藏  举报