benxintuzi

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

using 关键字的使用主要分为两种类型:using declaration(using 声明)和using directive(using 命令):

using 声明:引入特定名称空间中的一个成员。

using 命令:使特定名称空间中的所有名字可见。

 1 namespace Myspace
 2 {
 3     int a = 10;
 4     double b = 100.0;
 5     const int c = 1000;
 6 }
 7 
 8 int var = 0;
 9 // 位置1
10 
11 int main()
12 {
13     // 位置2
14     double b = 200.0;
15     int d = c + 1;
16     ++a;
17     ++::a;
18 
19     return 0;
20 }

 

将using 声明和using 命令分别插入<位置1>和<位置2>,会发生什么情况呢?如下分析:

(1)   在<位置1>插入using 声明:

 1 namespace Myspace
 2 {
 3     int a = 10;
 4     double b = 100.0;
 5     const int c = 1000;
 6 }
 7 
 8 int a = 0;
 9 // 位置1: 插入using 声明
10 using Myspace::a;       /** error: 'a' is already declared in this scope */
11 using Myspace::b;
12 using Myspace::c;
13 
14 int  main()
15 {
16     // 位置2
17     double b = 200.0;   /** 局部 b */
18     int d = c + 1;      /** d = Myspace::c + 1 */
19     ++a;                /** 二义性 */
20     ++::a;              /** ++a */
21 
22     return 0;
23 }

说明:

将名称空间Myspace中所有成员的using 声明放在<位置1>,则a、b、c立即在<位置1>处变为可见,接着程序中有定义了变量a,此时,必然会发生重定义错误。main函数中的局部变量b则会屏蔽全局变量Myspace::b,因此可以编译通过。

 

(2)   在<位置2>插入using 声明:

 1 namespace Myspace
 2 {
 3     int a = 10;
 4     double b = 100.0;
 5     const int c = 1000;
 6 }
 7 
 8 int a = 0;
 9 // 位置1
10 
11 int  main()
12 {
13     // 位置2: 插入using 声明
14     using Myspace::a;
15     using Myspace::b;
16     using Myspace::c;
17 
18     double b = 200.0;   /** error: redeclaration of 'double b' */
19     int d = c + 1;      /** d = Myspace::c + 1 */
20     ++a;                /** ++Myspace::a */
21     ++::a;              /** ++a */
22 
23     return 0;
24 }

说明:

将a、b、c的using 声明移到<位置2>,此时,b相当于定义了两次,编译错误。此时的a有两个值,++a表示访问函数局部的a,也就是Myspace::a,因为Myspace::a把全局的a屏蔽掉了。而++::a意为显示访问全局变量。

 

(3)   在<位置1>插入using 命令:

 1 namespace Myspace
 2 {
 3     int a = 10;
 4     double b = 100.0;
 5     const int c = 1000;
 6 }
 7 
 8 int a = 0;
 9 // 位置1: 插入using 命令
10 using namespace Myspace;
11 
12 int  main()
13 {
14     // 位置2
15     double b = 200.0;   /** 局部 b */
16     int d = c + 1;      /** Myspace::c */
17     ++a;                /** reference to 'a' is ambiguous*/
18     ++::a;              /** ++a */
19 
20     return 0;
21 }

说明:

++a由于不知调用Myspace::a还是a,因此,出现二义性,可以考虑改为++Myspace::a,而++::a意义非常明确。

 

(4)   在<位置2>插入using 命令:

 1 namespace Myspace
 2 {
 3     int a = 10;
 4     double b = 100.0;
 5     const int c = 1000;
 6 }
 7 
 8 int a = 0;
 9 // 位置1
10 
11 int  main()
12 {
13     // 位置2: 插入using 命令
14     using namespace Myspace;
15 
16     double b = 200.0;   /** 局部 b */
17     int d = c + 1;      /** Myspace::c */
18     ++a;                /** reference to 'a' is ambiguous*/
19     ++::a;              /** ++a */
20 
21     return 0;
22 }

说明:

解释同(3)。

 

 

posted on 2015-09-08 15:34  benxintuzi  阅读(373)  评论(0编辑  收藏  举报