1

1和2有什么区别?

1:

namespace Foo {
    int bar;
}

2:

class Foo {
public:
    static int bar;
}

如果bar是函数,那么不同的是static class member可以访问类private成员。

但有时我们只需要存储一个constant例子。然后我们有一个选择。

这两者有什么区别吗?

选择一个而不是另一个的原因是什么。

我已经搜索过这个,我很惊讶网上还没有答案。

4

3 回答 3

2

就您要声明的对象而言

命名空间声明为整个程序定义了一个唯一的对象。如果你把它放在一个头文件中,包括来自两个不同源文件的头文件会产生一个多定义链接器错误。

类静态声明要求链接器在所有源文件中共享一个对象。

至于类与命名空间

类和命名空间是完全不同的东西。一个类描述了如何形成一个对象。类模板也可用于形成元程序。但是一个类不应该仅仅用于在一个范围内对事物进行分组,这样该类就永远不会被实例化。这就是命名空间的工作。

如果要在多个源之间共享对象,请执行以下操作:

// Foo.h
namespace Foo {

extern int bar; // declaration

}

// Foo.cpp
namespace Foo {

int bar = 2; // definition

}

如果对象是一个常量,那么只要您不需要bar在内存中有地址,就不需要定义。

于 2013-07-12T05:52:03.953 回答
1

由于这里有很好的答案,我想添加一些重要的区别:

如果您需要声明具有特定类型和唯一名称的全局变量,您可以在模板类中使用静态变量。这对于命名空间是不可能的(至少现在不是)。

template <class T>
struct my_variable_name {
  static T value;
};


my_variable_name<int>::value=7;

my_variable_name<float>::value=5.0;
于 2013-07-12T05:58:45.013 回答
1

巨大差距。除了字面上的区别外,它们在以下方面有所不同:

  1. 一个类就像一个模型,用来反映某种状态或行为,用来生成对象。命名空间仅用于名称隔离,不能用于构造对象。
  2. 命名空间可以声明为匿名的。一个类不能。
于 2013-07-12T06:01:35.350 回答