类声明或定义中的静态变量
static variable in the class declaration or definition?
我是C++新手。
我有这样的课程:
class CodeTest
{
private:
static const int TOTAL=100;
};
TOTAL
是宣言还是定义?
当我阅读 Scott Meyer 的书时,有人提到在实现文件中我们需要定义类似的东西:
const int CodeTest::TOTAL;
为什么需要这样做?
标头之外的实现文件中的声明是必需的,否则包含此标头的每个翻译单元都将定义自己的对象(即,它自己的变量存储)。
这将违反一个定义规则。例如,如果变量在一个翻译单元中更改,则此更改对其他翻译单元不可见。现在,这无关紧要,因为变量是常量。但是,获取其地址也会在不同的翻译单元中产生不同的指针。
由于这引起了一些争议,我查看了标准,@Nawaz是对的,我错了。
9.4.2/2
如果
static
数据成员是常量整数类型 [...]。该成员 如果在命名空间范围内使用,则仍应在命名空间范围内定义 程序和命名空间范围定义不应包含 初始 化。
所以你有一个声明,变量被初始化为一个值。在类之外,必须定义变量,但不能为其赋值。
具有整型const
部分仅适用于此特定情况 - 即您可以在类内部初始化所述类型,但必须在外部定义所有static
数据成员。
要回答这个问题:
无论类外部是否需要定义(取决于是否使用成员),类内的任何内容(初始化与否)都只是一个声明。
问题的第一部分:
此行:static const int TOTAL=100;
是一个声明,后跟初始化。
TOTAL
是一个标识符。
问题的第二部分
初始化变量需要const int CodeTest::TOTAL
。
static const int TOTAL=100; // is a declaration followed by an initialisation.
从C++标准第 3.1 节:
声明将名称引入翻译单元或重新声明先前声明引入的名称。声明指定这些名称的解释和属性。
下一段指出,声明是一个定义,除非......它在类定义中声明一个静态成员:
struct X
{
int a; // defines a
static int b; // declares b
};
您可以在此处阅读有关定义和声明的更多信息: SO:定义和声明有什么区别?
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 模板基类中的静态变量
- 类和静态变量
- 不同作用域中的静态变量和全局变量
- 静态变量声明和定义
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 在类中继承静态变量?
- "local scope"中的 C++ 初始化静态变量
- 使用静态变量的递归调用的不同输出
- 复制文件流C++静态变量
- 跨模板化函数编译的静态变量
- C++编译器是否优化了顺序静态变量读取?
- C++,每个循环初始化一个新的静态变量
- (为什么)我们可以在初始化中将非静态类成员分配给静态变量吗?
- 这些语句是否等效(静态变量、常量变量和泛型)
- 程序如何知道静态变量是否需要初始化?
- 类外的静态变量实例化
- 无法解析静态变量
- 函数局部静态变量:从性能角度来看的优点/缺点
- 访问从 CPP 文件到其他头文件的静态变量