【问题标题】:Are there advantages to using namespaces over classes? [closed]使用命名空间优于类有什么好处? [关闭]
【发布时间】:2018-03-06 00:46:52
【问题描述】:

似乎类为变量和函数提供了一个作用域,本质上是让它完成命名空间所做的一切。

我错了吗?

如果不是,为什么在类上使用命名空间?

【问题讨论】:

  • 这是一个有趣的问题。例如,ADL 与结构一起使用:godbolt.org/g/BSDs9f
  • 为什么用钻头代替螺丝刀? (提示,他们没有。不同用途的不同工具)。
  • 命名空间可以拆分。类不能。

标签: c++ class scope namespaces


【解决方案1】:

这是两个不同的目的。

命名空间的存在是为了避免命名冲突,向外界隐藏一些名称,并最终帮助组装组件(当命名空间及其别名用于寻址不同的库时,例如 boost::regex 与 std: :正则表达式)。

一个类可以被实例化并创建对象。命名空间中的变量只存在一次。对于每个实例化的对象,类中的非静态数据成员存在一次。所以它不仅仅是封装和访问控制。

【讨论】:

    【解决方案2】:

    如果你有一个只包含静态成员函数的类,它们看起来与命名空间非常相似

    class A {
        static void foo();
    }
    

    可以使用A::foo();

    如果你使用命名空间

    namespace B {
        void bar();
    }
    

    这也将用作B::bar()

    类和命名空间都唯一地定义了一个函数的名称(参见name mangling)。

    现在,相似之处已经完成。类是面向对象编程中的基本组织单元。它们封装了数据和对这些数据进行操作的逻辑,并隐藏了对类用户而言并不重要的所有内容(例如数据和私有方法)。

    类的一个非常重要的属性是,您可以从它创建对象。通常,您从一个类中创建多个对象。命名空间无法做到这一点。

    【讨论】:

      【解决方案3】:

      你不能在类范围内专门化一个模板。

      class C
      {
          template<typename> struct S;
          template<> struct S<int> {};  // error
      };
      

      更重要的是,语言特征的使用表明了意义,使用熟悉且易于理解的东西本身就有价值。

      【讨论】:

      • 按照这些思路,您不能像使用命名空间那样重新打开扩展类
      • @Justin 是的,我想到的无数其他原因让我觉得这个问题太宽泛了
      猜你喜欢
      • 1970-01-01
      • 2011-07-20
      • 2014-09-18
      • 2011-01-20
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 2011-11-09
      相关资源
      最近更新 更多