如果类中的所有方法都是静态的,如何调用构造函数?

时间:2012-09-25 12:39:12

标签: c++ static constructor

https://stackoverflow.com/a/8839647/462608

  

使用静态初始化程序:

public class MyClass
{
    static {
    //init
    }
}

在C ++中可以做类似的事情吗? 实际上,我需要初始化一些变量,但我不想创建一个对象。

2 个答案:

答案 0 :(得分:6)

如果变量是static成员,您不仅可以初始化它们,而且必须初始化它们。

没有Java初始化列表的直接等价物,但可以通过调用函数来初始化静态成员来完成类似的事情:

class X
{
    static bool x;
}

bool foo()
{
    //initialization code here
}

bool X::x = foo();

这适用于具有强烈逻辑的情况。如果您想要的只是初始化static成员,请执行与X::x类似的操作。

  

实际上,我需要初始化一些变量,但我不想创建一个对象。

如果变量在类之外,则直接初始化它们(不需要为此调用代码)。

如果变量是类的static成员,请使用上述方法之一。

如果变量是非static成员,则在没有对象的情况下它们就不存在。

答案 1 :(得分:1)

类的静态变量在.cpp文件中初始化:

<强> MyClass.h

class MyClass {
public:
   static void f1();
   static void f2();
private:
   static int a1;
   static int a2;
   static int a3;
};

<强> MyClass.cpp

   int MyClass::a1 = 7;
   int MyClass::a2 = 8;
   int MyClass::a3 = MyClass::a1 + MyClass::a2;

   void MyClass::f1()
   {
      a1 = 7;
   }
   void MyClass::f2()
   {
      cout << a2 << endl;
   }

如果您想要静态成员变量的非平凡初始化 - 使用构造函数将它们分组在内部类中:

<强> MyClass.h

class MyClass {
public:
   static void f1();
   static void f2();
private:
   struct Data {
      Data();
      int a1;
      int a2;
      int a3;
   };
   static Data data;
};

<强> MyClass.cpp

   MyClass::Data MyClass::data;
   MyClass::Data::Data() : a1(0), a2(0), a3(0)
   {
      // it is just an example ;)
      for (int i = 0; i < 7; ++i)
      {
         a1 += 2;
         s2 += 3;
         a3 += a1 + a2;
      }
   }

   void MyClass::f1()
   {
      data.a1 = 7;
   }
   void MyClass::f2()
   {
      cout << data.a2 << endl;
   }