• using 关键字的使用


    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)。

     

  • 相关阅读:
    简单字典操作
    字符串操作
    2017年10月7日
    循环列表练习
    Zabbix4.0系统告警"Zabbix agent on Zabbix server is unreachable for 5 minutes"
    Zabbix4.0系统告警“Zabbix server is not running”
    FreeRADIUS使用了在Cisco IOS配置示例的管理访问
    Cisco AAA Configuration
    使用工具Csvde导出域中所有用户信息
    McAfee Agent卸载方法
  • 原文地址:https://www.cnblogs.com/benxintuzi/p/4791899.html
Copyright © 2020-2023  润新知