【问题标题】:static const int in class definition & initialization类定义和初始化中的静态 const int
【发布时间】:2012-11-26 02:59:16
【问题描述】:

如果(且仅当)您以需要的方式使用初始化的成员 它作为对象存储在内存中,成员必须是(唯一的) 在某处定义。

来自“C++ 编程语言”

我有课

class Bingo{
      std::string name;
    public:
      Bingo(){}
      int i;
      static const int i89=89;
};

我不需要这样的定义:

const int Bingo::i89;

这被描述为必要的。因此,我显然不明白。你能解释一下这句话的意思吗?

【问题讨论】:

  • 把visual-c++标签改成c++,这里面没有visual-c++特别的东西,就是c++。
  • 我认为这与 ODR 有关。 stackoverflow.com/questions/4547660/… 也有类似的问题。您可以查看它以获取信息。

标签: c++ static initialization constants definition


【解决方案1】:

当你在类中定义一个成员时,它被称为类内初始化

请注意,编译器可以将此类成员视为编译时常量,因为它知道值不会随时更改,因此它可以应用自己的优化魔法并简单地内联此类成员,即它们不存储在内存中了。由于它们不存储在内存中,因此无法获取此类成员的地址。反之亦然。

以上内容源于 Bjarne 的基本原理,即每个 C++ 对象都需要唯一的定义,因此每个对象都需要存储在内存中,以便它们可以具有唯一的地址并被唯一标识。

因此引用,

如果(且仅当)您以需要将其作为对象存储在内存中的方式使用初始化成员,则该成员必须(唯一地)在某处定义。

【讨论】:

  • 有一个带有int的例子,类似于我在我的例子中写的,类外的int定义被描述为必要的。
  • @cf16:因为某处的程序可能会执行类似&Bingo::i89 的操作,即:获取成员的地址。
  • 书中的例子取了这个地址,没错,但是我试过了,即使那样我也不需要定义它
  • @cf16:因为新的 c++11 标准改变了这些规则。这本书似乎指的是 C++11 之前的标准,其中这些是规则。 This 我的旧答案可能会为您解决更多问题。
  • 不,它在 C++98 中,因为我的实现中的 __cplusplus 宏扩展为 19971L。
【解决方案2】:

据我所知,当静态变量在你的类中定义时,你需要 :: 来访问它

【讨论】:

  • 问题是为什么我不需要 const int Bingo::i89;
  • @cf16 因为你不使用它“以某种方式要求它作为对象存储在内存中”
  • 有一个带有 int 的示例,类似于我在示例中编写的内容,并且根据需要描述了类外的 int 定义。
猜你喜欢
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
相关资源
最近更新 更多