静态成员变量和命名空间变量之间有什么区别?

时间:2013-07-12 05:42:57

标签: c++ class oop namespaces

Whit是1和2之间的区别吗?

1:

namespace Foo {
    int bar;
}

2:

class Foo {
public:
    static int bar;
}

如果bar是一个函数,则差异在于static class member可以访问类private成员。

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

这两者有什么区别吗?

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

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

3 个答案:

答案 0 :(得分:2)

仅就您宣布的对象而言

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

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

至于类与名称空间

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

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

// Foo.h
namespace Foo {

extern int bar; // declaration

}

// Foo.cpp
namespace Foo {

int bar = 2; // definition

}

如果对象是常量,只要您永远不需要bar在内存中拥有地址,就不需要定义。

答案 1 :(得分:1)

由于答案很好here,我想添加一些重要的差异:

如果需要使用某些类型和唯一名称声明全局变量,则可以使用模板类中的静态变量。命名空间是不可能的(至少现在不行)。

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


my_variable_name<int>::value=7;

my_variable_name<float>::value=5.0;

答案 2 :(得分:1)

差异很大。除了文字差异之外,它们在以下方面有所不同:

  1. 类似于模型,用于反映某些状态或行为,以生成对象。命名空间仅用于名称隔离,不能用于构造对象。
  2. 命名空间可以声明为匿名。一堂课不能。