重新声明的静态类变量
Redeclared static class variable
我正在查看我下载的一些代码,我看到以下内容:
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;
}
};
相关文章:
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 我的编译器是否忽略了我未使用的静态thread_local类成员
- 静态存储类C++计数
- 内联初始化的静态 const 类成员的初始化顺序保证
- 继承:动态派生类成员与静态派生类成员
- 避免在静态常量类上定义但不使用
- 根据模板参数可以选择静态的类成员
- 为什么不允许静态成员变量的初始化在类中,而允许静态静态成员的初始化
- 子类中具有不同值的静态基类属性
- 等效于 Java 静态对象类C++
- 是否可以按模板类型更改静态 const 类成员的值
- 如何在标题和CPP之间拆分静态/模板类
- 静态模板类成员函数的这两个调用之间有什么区别?
- 对静态重载(类)函数/方法的调用是不明确的
- 具有静态模板类成员的模板类:如何定义静态成员
- pthread没有静态的类
- 单例文件静态与类私有静态
- 使用折叠表达式初始化静态 constexpr 类数据成员不编译
- constexpr静态结构类成员的声明冲突
- 初始化在 C++ 中自定义类的构造函数中没有参数的静态 const 类成员