繁体   English   中英

在C ++类中声明的常量和静态

[英]Const and Static declared in a Class, C++

我知道该类是一个描述,因此我们无法在其中定义const。 但是我发现这让我感到困惑,首先:

 class A
{
   private:
          const int Months=12;// Fails
};

我不知道我是否对,如果我认为A的对象可能很多,那么会有很多const Month。 因此,C ++禁止这样做。

但第二:

class A
{
  private:
       static int Montshs =12;//Fails,
};

我也知道Months可以在A类之外进行初始化; 我认为这是一个描述,因此我们不能在A类中使用static进行初始化(我不知道我是否正确),

但继续:

class A
{
  private:
       static const int Montshs =12;//ok, 
};

可以,我不能给自己任何理由。 有人能告诉我原因吗?

有没有人可以给我关于这三个问题的详细解释? 我认为也许是关于记忆的安排。

这一切都在这里详细解释

那么为什么存在这些不便的限制呢? 通常在头文件中声明类,并且通常将头文件包含在许多翻译单元中。 但是,为避免复杂的链接器规则,C ++要求每个对象都有唯一的定义。 如果C ++允许对需要作为对象存储在内存中的实体进行类内定义,则该规则将被打破。

在C ++ 11中,这些限制解除了

C ++ 11的基本思想是允许在声明它的位置(在其类中)初始化一个非静态数据成员。

  • 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单个对象,并且不可更改。 因此,编译器可以从查看标头中的定义中受益,因为它可以优化对符号的所有错误,基本上在看到A::Months任何地方都使用值12。 它基本上不需要为其分配存储,因为它可以在任何需要的地方将值12写入代码中。 这也不总是可能的,某些较早的编译器不会接受。 然后,您将不得不使用enum-Trick: enum { Months = 12 };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM