似乎类为变量和函数提供了一个范围,基本上让它可以完成命名空间所做的一切。
我错了吗?
如果没有,为什么命名空间用于类?
答案 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)。
现在,相似之处已经完成。类是面向对象编程中的基本组织单元。它们封装了对这些数据进行操作的数据和逻辑,并隐藏了对于该类用户来说并不重要的一切(例如它的数据和私有方法)。
类的一个非常重要的属性是,您可以从中创建对象。通常,您可以从一个类创建多个对象。这不能用命名空间来完成。