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

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

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

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

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

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

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

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

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

我只是在猜你试图这样做:

 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; 

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

奖金 – 如果你声明这个int const,很多编译器可能会在编译时对它进行评估。

阿伦,

我相信你的问题与
编译器错误C2864

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