在运行main之后是否可以初始化静态成员变量?

时间:2015-05-05 08:46:59

标签: c++ static

Test.h

class Test
{
    static int i;
};

Test.cpp的

int Test::i = 1;

我知道通常我们会像上面那样初始化一个静态成员。并且在函数main运行之前初始化静态成员 我的问题是:
是否可以在函数main运行后初始化静态成员?这样的事情:

int main()
{
// do something
// initialize the Test::i here
}

4 个答案:

答案 0 :(得分:1)

不,初始化它是不可能的,但是没有理由不能只调用静态setter函数在运行中为i赋值-时间。这是最好的方法。

或者您也可以这样做,以便构造函数始终初始化变量:

#include <iostream>

class Test
{
  private:
    static int i;

  public:
    Test()
    {
      i=2;
    }

    void print_i (void)
    {
      std::cout << i << std::endl;
    }
};

int Test::i = 1;


int main()
{
  Test test;

  test.print_i(); // will print 2
}

答案 1 :(得分:1)

我将假设您的确意味着初始化,因此main之后的分配已经开始。这对intdouble等基本类型没有影响,但可以为复杂数据类型创建一个。

答案是:不,但是(有点)。在main启动之前,无法延迟静态数据成员的初始化,但您可以使用带有函数本地静态对象的静态成员函数来模拟效果。首次调用函数后,将初始化此对象。在代码中:

#include <iostream>

struct A {
  A() {
    std::cout << "A::A()\n";
  }

  void do_something() {
    std::cout << "A::do_something()\n";
  }
};

struct B {
  static A &a() {
    static A instance;
    return instance;
  }
};

int main() {
  std::cout << "main start\n";

  B::a().do_something();
  B::a().do_something();

  std::cout << "main end\n";
}

这将打印

main start
A::A()
A::do_something()
A::do_something()
main end

然后,您可以使用B::a()之前使用B::a的地方。您必须确保在main启动之前未调用该函数。

答案 2 :(得分:0)

你遇到的第一个错误是变量'i'对于类是私有的,所以你不能在类之外访问它。有两种方法可以解决这个问题。第一个是公开(不是优先),第二个是制作setter和getter方法。

关于这个问题答案是肯定的,你可以。使用我上面提到的setter方法。 这是两种方法:

//…
public:
  static int get_i() {
    return i;
  }
  static void set_i(int val) {
    i = val;
  }
//…

你可以这样调用这个方法:

Test::set_i(10);

注意:不要忘记在方法之前包含关键字public,以便您可以在课外访问它们。

答案 3 :(得分:-1)

您混淆了static这个词和const.一词

您声明时必须初始化const;

您声明时不必初始化static,但您可以随时随地更改它,前提是您可以访问它。 (这不是这里的情况,你的我是私人的。)

关于这些陈述,让我们来看看C ++标准( 3.6.2 ):

  

具有静态存储持续时间或线程存储持续时间的变量   在进行任何其他初始化之前,应进行零初始化。

从技术上讲,是的,即使您明确初始化静态数据,也始终将其初始化为零。