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

What's the difference between a static member variable and a namespace variable?

本文关键字:变量 区别 什么 命名空间 静态成员      更新时间:2023-10-16

1和2之间的区别是什么?

1:

namespace Foo {
    int bar;
}

2:

class Foo {
public:
    static int bar;
}

如果bar是一个函数,那么区别在于static class member可以访问类private成员。

但有时我们只需要存储一个constant。那我们就有选择了。

这两者之间有什么区别吗?

选择一个而不是另一个的理由是什么。

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

仅根据您声明的对象

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

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

至于类与命名空间

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

如果你想在几个来源之间共享对象,请这样做:

// Foo.h
namespace Foo {
extern int bar; // declaration
}
// Foo.cpp
namespace Foo {
int bar = 2; // definition
}

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

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

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

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

my_variable_name<int>::value=7;
my_variable_name<float>::value=5.0;

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

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