如何分配类中的静态成员?

时间:2016-07-22 08:21:17

标签: c++ variables static

如果我有类似

的课程
class MyClass {
   public:
      int myMember1;
      int myMember2;
      int myMember3;
};

每次我实例化一个MyClass空间的对象,连续三个int被分配,那么当我有类似

的时候怎么办?
class MyClass {
   public:
      static int myMember1;
      int myMember2;
      int myMember3;
};

这次如何分配内存?

我问,因为当我声明同一个类的多个实例时,我不完全确定如何分配内存,是否有指向静态成员的指针?

5 个答案:

答案 0 :(得分:5)

正如其他人已经说过的那样,你必须在类定义之外为静态成员变量显式分配空间。

在回答您的其他问题时,静态成员变量与类对象无关。也就是说,即使您的MyClass对象不再存在(直到程序终止),它们仍将继续存在,并在您的类的所有实例之间共享。

假设您创建了MyClass类的多个实例,如下所示:

class MyClass {
public:
  static int myMember1;
  int myMember2;
  int myMember3;
};

int MyClass::myMember1 = 1;

int main()
{
   MyClass mc1;
   MyClass mc2;

   mc2.myMember1 = 2;

   std::cout << mc1.myMember1 << '\n';
   std::cout << mc2.myMember1 << '\n';
   return 0;
 }

输出将是:

2
2

答案 1 :(得分:3)

  

这次[使用静态成员]如何分配内存?

对象的每个实例都有2个整数,并且所有实例都可以访问static整数(但不“拥有”它) - 它不是实例的一部分,它位于班级范围。

N.B。该成员在类中声明,但必须在类之外(在cpp文件中)定义,例如;

int MyClass::myMember1 = 42;
  

...是否有指向静态成员的指针?

没有。如果需要,可以获取静态成员的指针,但不会为每个实例分配一个指针。

当应用程序启动时,静态成员被分配(并根据cpp文件中的初始化进行初始化),并且可以像其他“全局”对象一样进行访问(虽然静态不在全局命名空间中,但只有一个例子)。成员的可访问性(即publicprivateprotected)遵循正常规则。

要查看对尺寸的影响,您可以使用sizeof();

class MyClass {
   public:
      int myMember1;
      int myMember2;
      int myMember3;
};

class MyClass1 {
   public:
      static int myMember1;
      int myMember2;
      int myMember3;
};

int MyClass1::myMember1 = 42;

int main(int argc, char* argv[])
{
    using namespace std;
    cout << sizeof(MyClass) << " " << sizeof(MyClass1) << endl;
}

以上(取决于对齐和int的大小)可能会产生12 8的输出。

Demo

答案 2 :(得分:2)

您还必须在类外部定义变量。这是实际分配的地方。

本质上它与全局变量相同。

class Test
{
    public:

    static int too; // Just a declaration
};

int Test::too; // Actual allocation, every instance will use this

答案 3 :(得分:2)

您必须在某处为该静态成员显式分配内存。

例如,您的班级在其头文件中:

// myclass.h
class MyClass {
   public:
      static int myMember1;
      int myMember2;
      int myMember3;
};

你有一个该类的cpp文件,它为该静态成员显式分配空间,它也可以初始化它:

// myclass.cpp
int MyClass::myMember1 = 5;

因此,您的静态成员将在您选择的翻译单元中的程序中的一个位置进行分配。您可以将此分配放入任何所需的文件中,只要它只是一个翻译单元的一部分。

答案 4 :(得分:1)

静态元素在静态存储器中分配

您可以将这些成员视为全局变量,但在类范围内声明(具有相应的访问权限,在您的情况下为public)。