在类上使用名称空间是否有优势?

时间:2017-09-25 06:08:07

标签: c++ class scope namespaces

似乎类为变量和函数提供了一个范围,基本上让它可以完成命名空间所做的一切。

我错了吗?

如果没有,为什么命名空间用于类?

3 个答案:

答案 0 :(得分:2)

您不能在类范围内专门化一个模板,其中包括许多模板。

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

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

答案 1 :(得分:0)

这有两个不同的目的。

命名空间用于避免命名冲突,隐藏一些名称到外部世界,最终帮助组装组件(当命名空间及其别名用于处理不同的库时,例如boost :: regex vs. std: :正则表达式)

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

答案 2 :(得分:0)

如果您的类只包含静态成员函数,则它们与名称空间非常相似

class A {
    static void foo();
}

可以使用A::foo();

如果使用命名空间

namespace B {
    void bar();
}

这也将用作B::bar();

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

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

类的一个非常重要的属性是,您可以从中创建对象。通常,您可以从一个类创建多个对象。这不能用命名空间来完成。