静态成员变量和命名空间变量有什么区别?
What's the difference between a static member variable and a namespace variable?
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;
差异很大。除了字面上的差异外,它们在以下方面也有所不同:
- 类就像一个模型,用来反映某些状态或行为,生成对象。命名空间只是用于名称隔离,不能用于构造对象
- 命名空间可以声明为匿名。类不能
相关文章:
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 成员变量的不同"kinds"之间的区别
- 如果我提前将参数声明为变量而不是将它们内联写入函数调用,那有什么区别(在内存方面)?
- c++ 类中的静态常量变量和常量变量在存储方面是否有区别
- 互锁变量访问(在布尔值上)和 std::atomic_flag 之间的区别
- lambda 表达式中引用捕获的 constexpr 变量和非显式捕获的 constexpr 变量之间的区别
- 直接为浮点变量分配十六进制整数与通过指针转换分配之间的区别
- 类中的静态成员变量和C++中的全局变量有什么区别?
- 数组的变量名和该数组的地址有什么区别?
- Java 中的私有变量和 C++ 结构中的私有变量有什么区别?
- 就地赋值和再次使用变量名称的赋值有什么区别?
- *的位置有什么区别:*变量与变量*
- c中的*变量和变量*有什么区别
- C++ - 将一个变量分配给另一个变量和将变量分配给引用变量有什么区别?
- C 和 C++ 中的外部变量有什么区别
- 全局变量和内部类有什么区别?
- int *ptr = &var 和 int *ptr 之间的区别;*PTR = 和变量?
- 在 C++ 中:在函数中初始化变量与在函数标头中声明变量有什么区别?
- 指向静态变量的指针和指向某个变量的静态指针之间的区别
- 这两种初始化成员变量的方法之间有区别吗?