为什么C ++在定义时禁止非整数数据成员初始化?

时间:2009-12-23 20:10:42

标签: c++ static initialization

class Interface {
public: 
  static const int i = 1;
  static const double d = 1.0;
    //! static const string *name = new string("Interface name");
    virtual string getName() = 0;
}

由于C ++是一种传统的真正编译的编程语言,因此可以很容易地确信它允许对象初始化(?)。但是为什么C ++禁止在定义时进行双初始化?我看到g ++现在支持双初始化定义点,但不是msvc。

我的问题是,因为它很容易支持原始类型 - 在定义时浮点/双精度初始化它可以使C ++程序员的生活更方便,更方便,为什么C ++会禁止它?

P.S: 参考 - C ++标准2003的9.2.4部分。

  

成员声明者可以包含   恒定初始化器只有它   声明一个静态成员(9.4)   const integral或const枚举   类型,见9.4.2。

2 个答案:

答案 0 :(得分:2)

因为否则会出现值存在于哪个编译单元(例如目标文件)的问题。包含带有类定义的头的每个文件都会尝试创建一个在创建时分配给静态值的对象,可能导致不可预测的行为。

不仅赋值不起作用;您还需要在类声明之外定义静态值。 e.g。

class Foo
{
  static std::string s;
};

std::string Foo::s = "foo";

我不知道这是否是的原因,但无论如何我怀疑它背后的逻辑。

答案 1 :(得分:1)

我认为你在这里得不到有意义的答案。它刚刚发生了。而新的C ++ 0x标准消除了这种限制,这是没有正当理由的标志。

实际上,此限制也是从C继承的 - 您无法像那样初始化结构成员。

修改:现在您的示例中有一条暗示暗示您正在谈论静态成员。在您的特定示例中,您将指向string的指针分配给字符串。除此之外,我现在将投票给scotchi回答。肯定有一个背后的逻辑。