命名空间
在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; }
浙公网安备 33010602011771号