Test.h
class Test
{
static int i;
};
Test.cpp的
int Test::i = 1;
我知道通常我们会像上面那样初始化一个静态成员。并且在函数main
运行之前初始化静态成员
我的问题是:
是否可以在函数main
运行后初始化静态成员?这样的事情:
int main()
{
// do something
// initialize the Test::i here
}
答案 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
之后的分配已经开始。这对int
或double
等基本类型没有影响,但可以为复杂数据类型创建一个。
答案是:不,但是(有点)。在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 ):
具有静态存储持续时间或线程存储持续时间的变量 在进行任何其他初始化之前,应进行零初始化。
从技术上讲,是的,即使您明确初始化静态数据,也始终将其初始化为零。