命名空间
在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;
}