zoukankan      html  css  js  c++  java
  • C++ namespace命名空间

    1、什么是命名空间

    简而言之:划片取名

    加入有两个公司,公司A里面有一个员工小明,公司B里面有一个员工小明,两个公司在同一栋楼。这时,你去找小明,你再楼下大喊:“小明!你给我下来!”,这时两个小明都会下来,但是你如果喊:“A公司的小明,你给我下来”,这时下来的肯定就是A公司的小明了。而公司A和公司B就是命名空间。

    2、程序中的命名空间

    A软件公司:                                                  B软件公司:

      程序库里有:变量A             程序库里有:变量X

              函数f1                   函数f1

              函数f2                   函数f3

    想一想:C软件公司如果购买了A公司和B公司的程序库,想使用A公司的变量 x,B公司的函数 f1 怎么办?

    这个时候就用到了命名空间。

    注意:命名空间的名字不能相同

    3、怎样定义命名空间

    命名空间关键字:namespace

    namespace A        // A 就是空间的名称,也就是公司A的程序库
    {
        int x = 0;     // 公司A程序库里面的 变量x
        void f1();     // 公司A程序库里面的 函数f1()
        void f2();     // 公司A程序库里面的 函数f2()
    }
    namespace B        // B就是空间的名称,也就是公司B的程序库
    {
        int x = 2;     // 公司B程序库里面的 变量x
        void f1();     // 公司B程序库里面的 函数f1()
        void f2();     // 公司B程序库里面的 函数f2()
    }

    这个时候如果C公司调用A公司的变量和B公司的函数,代码应该怎么写呢?

    cout << A::x << endl; // 调用A里面的变量x 
    B::f1();              // 调用B里面的f1函数

    4、代码实例

     (1)没有命名空间时的代码

    #include<stdlib.h>
    
    int main(void)
    {
        system("pause"); // pause 暂停
        return 0;
    }

    运行结果:

    (2)cin,cout 的命名空间

    #include<stdlib.h>
    #include<iostream>   // iostream 定义了std 命名空间
    using namespace std; // using 和 namespace 是关键字,调用命名空间std
                         // std 是命名空间,里面包含cin , cout
    
    int main(void)
    {
        cout << "Hello" << endl; // 使用 cout 时需要命名空间
    
        system("pause"); // pause 暂停
        return 0;
    }

    运行结果:

    (3)模拟C公司调用A公司和B公司的代码

     情况一:

    #include<stdlib.h>
    #include<iostream>   // iostream 定义了std 命名空间
    using namespace std; // using 和 namespace 是关键字,调用命名空间std
                         // std 是命名空间,里面包含cin , cout
    
    // A 就是空间的名称,也就是公司A的程序库
    namespace A        
    {
        int x = 0;  
        void f1()   
        {
            cout << "namespace A" << endl;
        }
    }
    
    // B 就是空间的名称,也就是公司B的程序库
    namespace B        
    {
        int x = 2;  
        void f1()   
        {
            cout << "namespace B" << endl;
        }
    
    }
    
    int main(void)
    {
        
        cout << A::x << endl; // 调用A里面的变量x 
        B::f1();              // 调用B里面的f1函数
    
        system("pause"); // pause 暂停
        return 0;
    }

    情况二:

    #include<stdlib.h>
    #include<iostream>   // iostream 定义了std 命名空间
    using namespace std; // using 和 namespace 是关键字,调用命名空间std
                         // std 是命名空间,里面包含cin , cout
    
    // A 就是空间的名称,也就是公司A的程序库
    namespace A        
    {
        int x = 0;  
        void f1()   
        {
            cout << "namespace A" << endl;
        }
    }
    
    // B 就是空间的名称,也就是公司B的程序库
    namespace B        
    {
        int x = 2;  
        void f1()   
        {
            cout << "namespace B" << endl;
        }
    
    }
    // 如果这里直接使用using namespace B;那么下面可以直接调用B里面的函数。
    using namespace B; 
    int main(void)
    {
        cout << A::x <<endl;
        f1();
        system("pause");
        return 0;
    
    }

    两种情况的运行结果一样:

    5、实战练习

    题目要求:

    定义一个命名空间为myNum,在该命名空间中定义一个整型变量x,并给该变量赋值为105;使用C++新特性判断myNum命名空间下的变量是奇数还是偶数。

    #include<stdlib.h>
    #include<iostream> 
    using namespace std;
    
    namespace myNum            //填写命名空间的关键字
    {
        int x = 105;
    }
    int main()
    {
        // 使用bool类型定义isOdd,作为状态位
            bool isFlag = false;       
        
        if(myNum::x % 2 == 0)
        {
            //改变状态位的值,使其为false
            isFlag = false;
        }
        else
        {
            //改变状态位的值,使其为true
            isFlag = true;
        }
        // 判断状态位的值
        if(true)
        {
            // 如果状态位的值为true,则打印变量x是奇数
            cout << myNum::x << " 是奇数" << endl;
        }
        else
        {
            // 如果状态位的值为false,则打印变量x是偶数
            cout << myNum::x << " x是偶数" << endl;
        }
    
        system("pause");
        return 0;
    }

     运行结果:

  • 相关阅读:
    关于metaclass,我原以为我是懂的
    有趣的版本号
    关于乱序(shuffle)与随机采样(sample)的一点探究
    我在博客园的这一年
    我的进程去哪儿了,谁杀了我的进程
    Elasticsearch学习系列之term和match查询
    数据库垂直拆分 水平拆分
    分布式锁的几种实现原理
    Redis常见面题
    github建仓库注意
  • 原文地址:https://www.cnblogs.com/chuijingjing/p/8996212.html
Copyright © 2011-2022 走看看