【问题标题】:How are we able to declare a static member in a class of the same datatype as the class? [duplicate]我们如何能够在与该类具有相同数据类型的类中声明一个静态成员? [复制]
【发布时间】:2023-03-13 04:36:01
【问题描述】:

可能重复:
Why is a class allowed to have a static member of itself, but not a non-static member?

这是一段无效的代码

struct a{
   a mem;    //Invalid as the compiler does not know how much memory to allocate
  };

但这是有效的:

class Date{
  int d,m,y;
  static Date Default_date;  //Valid
};

在 Date 数据类型没有正确定义之前,编译器如何知道这里要分配多少内存!!

这在某种意义上和其他静态定义有区别吗???

【问题讨论】:

  • 当您声明静态成员时,编译器无法知道 Date 有多大。但是想一想——它现在不需要知道它。
  • 编译器不会为那里的静态变量分配内存(然后在类内部),但是当它被声明时。例如字段,它必须在声明时知道类型本身的大小。我认为它可能由编译器完成(我不知道他们没有)而不需要太多努力,我想编译器大师会来解释......

标签: c++ class static


【解决方案1】:

静态成员不存储在类内部,因此其大小不会影响类的总大小。

您必须在其他地方定义静态成员,可能在 .cpp 文件中。那时编译器必须知道类的大小。

【讨论】:

    【解决方案2】:

    在第一种情况下它是无效的,因为它是一个无限大小的递归结构。 在第二种情况下没关系,因为实际的内存分配发生在声明之后。

    【讨论】:

      【解决方案3】:

      您只能在类声明中使用数据成员,其大小在那时是已知的,即定义已经存在。编译器需要知道类实例在声明时需要多少内存。您可以使用指向您 [forward-]声明 的类型的指针和引用(这些类型的大小与您的操作系统的位数一样多)。

      static 成员的声明 未在成员实例内分配(这就是 static 的用法),因此它的只有在定义时才需要知道大小。

      【讨论】:

        最近更新 更多