15.2.5 空间内的屏蔽

    在一个空间内变量可见域的规则,如内部变量对外部变量的屏蔽等是和第6章中介绍的内容一致的。通过以下示例代码15.6来形象地说明这一点。

    代码15.6 空间内外同名实体的屏蔽关系ShieldSample


    <—————————————-文件名:example1506.cpp—————————————> 01 #include<iostream> 02 using namespace std; 03 extern int num=0;//外部变量num的定义性声明 04 namespace B//创建名称空间B 05 { 06 int num=2;//B中声明的num 07 } 08 namespace A//创建名称空间A 09 { 10 int num=1;//A中声明的num 11 void dispA() 12 { 13 int num=3; 14 cout<<"dispA函数中的num:"<<num<<endl; 15 cout<<"A中的num:"<<A:num<<endl; 16 cout<<"B中的num:"<<B:num<<endl; 17 cout<<"外部的num:"<<:num<<endl; 18 } 19 } 20 int main() 21 { 22 A:dispA(); 23 return 0; 24 }

    【代码解析】代码第13行,在名称空间A的dispA函数中声明的局部变量num屏蔽了A中的num,此时,如果要在dispA函数中的语句“int num=3;”后访问A中的num,必须使用A:num的形式。全局变量num由定义性声明语句“extern int num=0;”创建,如果要访问该全局变量,必须使用全局说明符的形式:num。

    这同第6章中介绍的内容是一致的,可以说名称空间多少有些类似于代码块,或者说是种特殊的代码块,而且把整个程序也看成是一种特殊的无名名称空间,全局extern变量就在这个特殊空间里,要访问extern变量,要使用“:extern变量名”的形式。

    注意

    可以将namespace中的实体声明为extern型,但这并没有实际意义。例如,将代码15.6中namespace B中的num声明改为“extern int num=2”,程序输出并无变化。