• [C++] namespace命名空间和using用法


    命名空间namespace:指标识符的各种可见范围。

    C++标准程序库中的所有标识符都被定义在一个std的namespace,这就是程序开始添加 using namespace std; 的原因。

    很多人共同完成一套代码,不可能不出现标识符命名相同的问题,为了解决冲突问题,产生了命名空间namespace。

    命名空间包括又名命名空间和无名命名空间

    一、有名命名空间

    有名命名空间的定义格式:

    namespace 空间名 {
        code
    }
    
    // 有名命名空间的嵌套定义
    namespace 空间名1 {
        code
        namespace 空间名2 {
            code
        }
    }

    有名命名空间的使用格式:

    // 直接使用"::"连接空间名和code
    空间名:: code;    // code为变量或函数

    有名命名空间取别名为了方便使用,定义格式如下:

    namespace 别名 = 空间名;

    using 指令使用格式:

    // 表示后面代码都使用此命名空间,如果属空于本空间,无需再使用"::"连接空间名和code
    using namespace 空间名; // 空间名支持嵌套
    
    //最常用的std空间
    using namespace std;

    举例:

    #include <iostream>
    // 使用std命名空间下的变量
    using namespace std;
    
    int a = 5;
    
    namespace A {
        int a = 10;
    
        // 命名空间支持嵌套定义
        namespace B {
            int a = 15;
            int b = 20;
        }
    
        // 命名空间可以重复定义,相当于扩充
        namespace B {
            int x = 30;
            int y = 35;
        }
    }
    
    namespace C {
        int a = 25;
        // 错误,命名空间不能嵌套声明
    //    namespace D;
    }
    
    int main(void)
    {
        // 如果不写using namespace std,就必须加前缀std::
        std::cout << "Hello World!" << std::endl;
        cout << endl;    // 换行
    
        cout << "a = " << a << endl;
        cout << "A::a = " << A::a << endl;
        cout << "A::B::a = " << A::B::a << endl;
        cout << "C::a = " << C::a << endl;
    
        // 错误,提示变量b没有声明
    //    cout << "b = " << b << endl;
    
        cout << endl;
    
        // 命名空间取别名
        namespace AB = A::B;
        cout << "AB = A::B" << endl;
        cout << "AB::a = " << AB::a << endl;
        cout << "AB::b = " << AB::b << endl;
    
        cout << endl;
    
        // 后面的代码使用A::B命名空间下的变量
        using namespace A::B;
        cout << "使用A::B命名空间" << endl;
        cout << "b = " << b << endl;
        cout << "x = " << x << endl;
        cout << "y = " << y << endl;
    
        return 0;
    }

    执行结果:

    二、无名命名空间

    命名空间不仅可以避免名称冲突,还可以是代码保持局部性,从而保护代码不被他人非法使用。

    在当前的编译单元直接使用无名命名空间中的成员,但是在当前编译单元之外,它是不可见的

    无名命名空间定义格式:

    namespace {
        code
    }

    举例:

    #include <iostream>
    // 使用std命名空间下的变量
    using namespace std;
    
    // 如果定义与无名命名空间相同,则会产生冲突报错
    //int a = 5;
    
    namespace {
        int a = 10;
        int b = 20;
    
        namespace B {
            int a = 30;
            int b = 40;
        }
    
        int add(int a, int b)
        {
            return (a + b);
        }
    }
    
    int main(void)
    {
        // 默认使用无名命名空间中的变量和空间
        cout << "a = " << a << endl;
        cout << "b = " << b << endl;
        cout << "B::a = " << B::a << endl;
        cout << "B::b = " << B::b << endl;
    
        cout << endl;
    
        cout << "a + b = " << add(a, b) << endl;
        cout << "B::a + B::b = " << add(B::a, B::b) << endl;
     
        return 0;
    }

    执行结果:

    总结:

    1、命名空间可以嵌套定义,但不能嵌套声明;

    2、可以多次声明和定义同一命名空间,相当于扩充,并添加新成员;

    3、无名命名空间中的成员不能与同一文件中外部的成员相同;

    4、无名命名空间中的成员使用方式与全局变量使用方式相同。

  • 相关阅读:
    SpringMVC
    Spring mvc 下Ajax获取JSON对象问题 406错误
    Docker国内镜像源
    获取redis cluster主从关系
    终端登录超时限制暂时解除
    vim全选,全部复制,全部删除
    [转]Redis集群搭建
    Jenkins持续集成01—Jenkins服务搭建和部署
    ELK重难点总结和整体优化配置
    ELK 经典用法—企业自定义日志收集切割和mysql模块
  • 原文地址:https://www.cnblogs.com/lialong1st/p/12006169.html
Copyright © 2020-2023  润新知