C ++静态成员变量及其初始化

对于C ++类中的静态成员变量-初始化在类外部完成。我想知道为什么?任何逻辑推理/约束吗?还是纯粹是传统的实现方式-该标准不希望更正?

我认为在类中进行初始化会更“直观”,也不会造成混淆。它还使变量具有静态和全局性。例如,如果您看到静态const成员。


翻翻过去那场雪
浏览 1176回答 3
3回答

慕神8447489

从根本上讲,这是因为静态成员必须精确地定义在一个翻译单元中,以便不违反单一定义规则。如果语言允许类似以下内容:struct Gizmo{  static string name = "Foo";};然后name将在#include该头文件的每个转换单元中定义。C ++确实允许您在声明中定义不可分割的静态成员,但是您仍然必须在单个翻译单元中包含一个定义,但这只是一个捷径或语法糖。因此,这是允许的:struct Gizmo{  static const int count = 42;};只要a)表达式是const整数或枚举类型,b)可以在编译时对表达式求值,并且c)仍然存在不违反一个定义规则的定义:文件:gizmo.cpp#include "gizmo.h"const int Gizmo::count;

POPMUISE

在C ++中,自开始以来,初始化器的存在是对象定义的专有属性,即,带有初始化器的声明始终是定义(几乎总是)。如您所知,C ++程序中使用的每个外部对象都必须在一个翻译单元中定义一次,并且只能定义一次。允许类内初始化程序用于静态对象将立即违反此约定:初始化程序将进入头文件(通常在类定义所在的位置),从而生成同一静态对象的多个定义(每个包含头文件的翻译单元一个定义) )。当然,这是不可接受的。因此,静态类成员的声明方法完全是“传统”的:您仅在头文件中声明它(即不允许初始化器),然后在您选择的翻译单元中定义它(可能使用初始化器) )。此规则的一个例外是整数或枚举类型的const静态类成员,因为此类条目可以用于整数常量表达式(ICE)。ICE的主要思想是在编译时对其进行评估,因此不依赖于所涉及对象的定义。这就是为什么整数或枚举类型可能会出现此异常的原因。但是对于其他类型,这只会与C ++的基本声明/定义原理相矛盾。
打开App,查看更多内容
随时随地看视频慕课网APP