cpp_namespace - ShenYj/ShenYj.github.io GitHub Wiki

命名空间

命名空间可以用来避免命名冲突

基本语法

命名空间不影响内存布局

namespace N {
    /// 命名空间中定义的变量仍旧是全局变量, 只是访问时需要指明命名空间
    int g_age;
    class Person {}
}

namespace M {
    class Person {}
}

int main() {

    N::Person p1;
    M::Person p2;

    return 0;
}
  • 命名空间中定义的变量仍旧是全局变量, 只是访问时需要指明命名空间

    • 方式一

      namespace N {
          /// 命名空间中定义的变量仍旧是全局变量, 只是访问时需要指明命名空间
          int g_age;
          class Person {}
      }
      
      int main() {
          N::g_age = 10;
      }
    • 方式二

      namespace N {
          /// 命名空间中定义的变量仍旧是全局变量, 只是访问时需要指明命名空间
          int g_age;
          class Person {}
      }
      
      int main() {
      
          /// 整个 main 函数中都可以使用 命名空间 N 中的内容
          using namespace N;
          g_age = 10;
      }

      using 除了引入命名空间作用外,还有指定别名、在子类中引用基类的成员的作用

命名空间的嵌套

  • 嵌套访问

    namespace N {
        
        namespace M {
            int g_age;
        }
    }
    
    int main() {
    
        /// 访问命名空间下的全局变量
        N::M::g_age = 10;
    
        return 0;
    }
  • 有个默认的全局命名空间,我们创建的命名空间默认都嵌套在它里面

/// 默认全局函数
void func() {}

namespace N {
    /// N 命名空间内的全局函数
    void func() {}
}

int main() {
    using namespace N;
    /// 在 main 函数内引入了 N 命名空间, 这样同名函数 func 在调用时就会存在歧义
    //func(); 错误

    /// 正确方式

    /// 调用 N 命名空间下的func函数
    N::func();
    /// 调用外面的func函数, 全局命名空间,没有名字
    ::func();

    return 0;
}

命名空间的合并

  • 写法一

    namespace N {
        int g_age;
    }
    namespace N {
        int g_no;
    }
  • 写法二

    namespace N {
        int g_age;
        int g_no;
    }

两种写法一致

⚠️ **GitHub.com Fallback** ⚠️