在C ++类中声明的Const和Static

时间:2014-04-01 12:08:22

标签: c++ memory-management

我知道这个类是一个描述,所以我们不能在其中定义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的安排。

2 个答案:

答案 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 };