我知道这个类是一个描述,所以我们不能在其中定义const。但我觉得这让我感到困惑,首先:
class A
{
private:
const int Months=12;// Fails
};
我不知道我是否正确,我认为如果A中有许多物体,那么会有很多常数月份。所以C ++禁止它。
但第二:
class A
{
private:
static int Montshs =12;//Fails,
};
我也知道月份可以从A级初始化; 我认为这是一个描述,所以我们不能在A级使用静态和初始化。(我不知道我是对的),
但继续:
class A
{
private:
static const int Montshs =12;//ok,
};
这没关系,我不能给自己一些理由。谁能够善意地告诉我原因?
有没有人可以给我详细解释这三个问题? 我想也许是关于menmory的安排。
答案 0 :(得分:2)
这些都详细解释了here
为什么存在这些不方便的限制?通常是一堂课 在头文件中声明,头文件通常包含在 许多翻译单位。但是,为避免复杂的链接器规则, C ++要求每个对象都有一个唯一的定义。那个规则 如果C ++允许实体的类内定义,那么它将被破坏 需要作为对象存储在内存中。
在C ++ 11中,这些限制是lifted。
C ++ 11的基本思想是允许非静态数据成员 初始化它的声明位置(在其类中)。
答案 1 :(得分:2)
1:const int Months=12;
这在C ++ 03中是不允许的,但是从C ++ 11开始是允许的。原因正是你所描述的:可能有很多A的实例,所以这不是单个值,而是必须写入A类的任何对象。在C ++ 11中,这种表示法用于给非静态成员a默认值。在C ++ 03中,你必须记住在每个构造函数中初始化成员。
2:static int Months =12;
这仍然是变量,必须在单个翻译单元中定义。因此,在一个单独的X.cpp中,将作为一行int A::Months = 42;
。这样,变量得到你初始化它的值(在这种情况下为42),使你在声明中给出的值(12)非常无用。
3:static const int Montshs =12;
这是一种特殊情况,因为它是编译时常量。它是一个值,不绑定到A
类型的任何单个对象,并且不可更改。因此,编译器可以从标题中查看定义中受益,因为它可以优化符号的任何差异,基本上使用值12,只要它看到A::Months
。它基本上不需要为它分配存储空间,因为它可以在需要的地方将值12写入代码中。这并不总是可能的,一些较旧的编译器不会接受它。然后你必须使用enum-Trick:enum { Months = 12 };