我正在审核我下载的一些代码,我看到以下内容:
class MyClass
{
[...]
public:
static double shape;
[...]
};
double MyClass::shape = 1.0;
类型被声明两次似乎很奇怪。为什么这有必要?
答案 0 :(得分:4)
类定义中的声明是一个纯粹的声明。
类定义后的声明是一个定义。它为变量分配存储空间。
这样做的一个原因是,对于static
数据成员,只有整数或enum
类型,或constexpr
或C++17 inline
的成员才能初始化课堂宣言。
上述定义不应放在头文件中,因为如果该标题包含在多个翻译中,则多个定义将违反一个定义规则。
一个简单的解决方案是使用访问器函数替换直接static
变量:
// OK to place in a header:
class MyClass
{
public:
static auto shape()
-> double&
{
static double the_shape = 1.0;
return the_shape;
}
};