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