当我尝试在类定义中初始化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 ++要求您在构造函数体或初始化列表中初始化特定于实例的成员(即:非静态,非成本)。
以上就是c/c++开发分享为什么在C ++中不允许初始化整数成员变量(不是const static)?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560504.html