【问题标题】:Why do I need static here?为什么我在这里需要静态?
【发布时间】:2017-01-31 11:51:18
【问题描述】:

为什么我可以写这个:

class VoiceManager
{
public:
    static const int mMaxNumOfVoices = 16;
    Voice mVoices[mMaxNumOfVoices];

private:
};

但我不能用这个:

class VoiceManager
{
public:
    const int mMaxNumOfVoices = 16;
    Voice mVoices[mMaxNumOfVoices];

private:
};

它说:“非静态成员引用必须相对于特定对象

但在这两种情况下,mMaxNumOfVoices 都是 const 并且将在 mVoices init 之前进行初始化(编译器遵循声明顺序,不是吗?)。

但它需要static。为什么?

【问题讨论】:

  • 请提供上下文和错误信息。
  • 也许是因为它直到运行时才知道mMaxNumOfVoices 是什么?并且使用static 强制知道这个值。
  • 我认为只有 const 不会使其成为编译时常量,而 static const
  • 我不明白反对票。这是一个关于const 语义微妙性的好问题。
  • @StoryTeller 我刚刚对这个问题投了赞成票。有时在快速否决的投票中令人沮丧。我理解它为什么会出现,但有时会令人沮丧。

标签: c++ static constants init


【解决方案1】:

数组边界必须在编译时知道。尽管您的初始化是在代码中编写的,但它可以在运行时被构造函数覆盖。因此,您的非static 成员变量不是编译时常量。

【讨论】:

  • "它可以在运行时被构造函数覆盖" 嗯,不!这是一个常量。它不能被覆盖(或者至少不应该)。
  • @paizza - Yes it can。非静态成员变量始终可以在构造函数中设置其值,即使它提供了默认初始化程序。
  • @paizza:初始化器可以被覆盖,就像 StoryTeller 演示的那样。
  • 不知道如果“init”作为 CTOR/成员初始化列表,我可以重新初始化一个 const。这解释了为什么!很高兴知道。谢谢。
  • @paizza 对于非静态成员,仅当该成员没有 ctor 初始化程序时才使用类内初始化程序。在这种情况下,它相当于提供与 ctor 初始化程序相同的值。
【解决方案2】:

const 关键字表示只读而不是常量,就像对程序特定部分的不可更改的承诺。如果您有一个指向 const 的指针,那么程序的其他部分可能会在您不查看时更改该值。

static const 保证在程序的其余部分保持不变。对象的存储空间在程序开始时分配,在程序结束时释放。该对象仅存在一个实例。在命名空间范围内声明的所有对象(包括全局命名空间)都具有此存储期限。

【讨论】:

  • const 的这种用法也保证了变量在其生命周期内保持不变;关于指针常量的情况不适用于此代码。此外,如果不使用 odr,静态 const 可能根本没有存储空间;但是任何具有存储的静态变量都可能将其初始化延迟到第一次使用,并且可能不是常量表达式。此代码(不在类中)表明您的解释不正确:static const int x = foo(); int y[x]; - 错误
猜你喜欢
  • 2012-09-08
  • 2010-11-10
  • 2021-11-02
  • 2012-06-03
  • 1970-01-01
  • 2021-08-27
  • 2016-02-15
  • 1970-01-01
相关资源
最近更新 更多