// MyClass.h
namespace MyNamespace {
static const double GasConstant = 1.987;
class MyClass
{
// constructors, methods, etc.
};
}
我之前在MyClass声明中声明了GasConstant(并且在源文件中有一个单独的定义,因为C ++不支持非整数类型的const
初始化)。然而,我需要从其他文件访问它,从逻辑上看,它似乎应该驻留在命名空间级别。
我的问题是,static const
在这种情况下有什么影响?显然const
意味着我无法为GasConstant分配新值,但命名空间中的静态成员意味着什么。这类似于文件范围的静态,其中成员不能在单元外访问吗?
答案 0 :(得分:7)
在C ++中,不推荐在命名空间范围中使用。它通常只能在源文件中看到,其效果是使变量本地化为该源文件。也就是说,另一个源文件可以具有完全相同名称且没有冲突的变量。static
在C ++中,将变量设置为源文件本地的推荐方法是使用匿名命名空间。
我认为公平地说代码标题中的static
是不正确的。
*正如Tom在评论中所指出的那样(以及answer),C ++委员会推翻了在文件范围内弃用static
的决定,因为这种用法总是如此部分语言(例如,C兼容性)。
答案 1 :(得分:4)
MSDN说:
修改变量时,static关键字指定了 变量有静态持续时间(它是 在程序开始时分配 当程序结束时解除分配)和 除非另一个,否则将其初始化为0 值已指定。修改时 文件范围内的变量或函数, static关键字指定了 变量或函数具有内部 连接(其名称不可见 在它所在的文件之外 声明)。
请记住,包含头文件意味着将“#include”-directive替换为头文件的实际代码。因此,静态变量只能在包含两个头文件的“.cpp”(已编译)文件中可见。
因此,包含标题的每个“cpp”文件都将拥有自己的静态变量。
答案 2 :(得分:2)
如果这是一个头文件,那么static
在这种情况下无效。默认情况下,const
个对象在C ++中已经具有内部链接,因此无论是使用static
还是static
声明它都没有任何区别。
我假设您只是将声明从类中移动到命名空间中。但是static
在类声明的上下文和命名空间的上下文中具有完全不同的含义。在课堂上,你需要static
。在命名空间中,static
是多余的。