重新声明的静态类变量

Redeclared static class variable

本文关键字:静态 静态类 类变量 声明 新声明      更新时间:2023-10-16

我正在查看我下载的一些代码,我看到以下内容:

class MyClass
{
[...]
    public:
        static double shape;
[...]
};
double MyClass::shape = 1.0;

该类型被声明两次似乎很奇怪。为什么有必要这样做?

类定义中的声明是纯声明。

类定义后面的声明是一个定义。它为变量分配存储。

这样做

的一个原因是,对于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;
    }
};