为什么在C ++中不允许初始化整数成员变量(不是const static)?

时间:2010-12-01 09:44:22

标签: c++ c initialization compiler-errors

当我尝试在类定义中初始化int成员变量时,我的C ++编译器会抱怨。它告诉“只能在类中初始化静态const积分数据成员”。能否请您解释这一限制背后的理由(如果可能,请举例)。

5 个答案:

答案 0 :(得分:11)

因为现行标准不允许这样做。 According to Bjarne,您将能够在C ++ 0x中执行此操作。如果您真的需要它,请尝试将编译器设置为C ++ 0x(GCC中的-std=c++0x)并查看您的编译器是否支持它。

答案 1 :(得分:8)

理由是C ++的“低级”性质。如果允许这样,编译器将需要为所有构造函数生成初始化代码,这对开发人员来说并不完全清楚。

毕竟,即使没有显式调用基类构造函数,也可能需要在构造派生类时初始化基类成员。

静态const积分变量在创建对象时不需要初始化。

答案 2 :(得分:4)

存在静态限制,因为C ++使用构造函数初始值设定项来初始化非静态数据成员:

struct Example {
  int n;
  Example() : n(42) {}
};

存在const限制是因为const case是专门处理的(而不是相反),因此静态const积分成员通常可以被视为具有内部链接,类似于命名空间范围内的const变量(C ++) 03§7.1.5.1p2,如果您有兴趣)。这主要有利于在整数常量表达式中使用成员,例如数组大小。

答案 3 :(得分:3)

我只是猜测你正在尝试这样做:

class foo {
    int m_iX = 5;
};

这将需要在构造函数中运行代码,因为每个新创建的实例都需要初始化此变量。在C ++中,构造函数中运行的所有代码(幸运地)都包含在构造函数本身中,因此很明显,类的构造需要什么。此外,由于一个类可以包含任意数量的构造函数(包括复制构造函数),因此在进行或不应该进行此初始化时,这将是不明确的。

你可以这样做:

class foo {
    enum {
       CONSTANT = 8
    };
};

这允许您使用foo::CONSTANT。这是有效的,因为它将是每个类而不是每个实例。

同样,你可以这样做:

class foo {
    static int sm_iX;
};

中的.cpp:

int foo::sm_ix = 5;

同样,这是每个类,而不是每个实例,因此与构造实际实例无关。

Bonus - 如果你声明这个int const,许多编译器可能会在编译时对它进行评估。

答案 4 :(得分:0)

阿伦,

我相信您的问题与
Compiler Error C2864

有关

要实现您想要做的事情,C ++要求您在构造函数体或初始化列表中初始化特定于实例的成员(即:非静态,非成本)。