如果我有一个名为Test ::
的类class Test
{
static std::vector<int> staticVector;
};
何时构建 staticVector 以及何时被破坏?
是实例化Test类的第一个对象,还是像常规静态变量一样?
只是为了澄清,在阅读编程语言概念(Sebesta Ch-5.4.3.1)并且它说::
后,我想到了这个问题。请注意,当静态修饰符时 出现在a的声明中 C ++中类定义中的变量, Java和C#,它与它无关 变量的生命周期。在那里面 上下文,它意味着变量是一个 类变量,而不是一个 实例变量。多次使用 保留字的含义可能令人困惑 特别是那些学习的人 语言。
你明白了吗? :(
答案 0 :(得分:16)
我想写一些关于初始化的文本,我可以稍后链接到。
首先列出可能性。
std::terminate
。 示例:
以下程序打印 A(1) A(2)
struct A {
A(int n) { std::printf(" A(%d) ", n); }
};
A a(1);
A b(2);
以下内容基于同一类打印 A(2) A(1)
extern A a;
A b(2);
A a(1);
让我们假装有一个翻译单元,其中msg
被定义为以下
char const *msg = "abc";
然后以下打印 abc
。请注意p
接收动态初始化。但是因为静态初始化(char const*
是POD类型,并且"abc"
是地址常量表达式)msg
之前发生,所以这很好,并且msg
得到保证要正确初始化。
extern const char *msg;
struct P { P() { std::printf("%s", msg); } };
P p;
示例:以下程序打印 0 1
:
struct C {
C(int n) {
if(n == 0)
throw n;
this->n = n;
}
int n;
};
int f(int n) {
static C c(n);
return c.n;
}
int main() {
try {
f(0);
} catch(int n) {
std::cout << n << " ";
}
f(1); // initializes successfully
std::cout << f(2);
}
在上述所有情况下,在某些有限的情况下,对于某些不需要静态初始化的对象,编译器可以静态初始化它,而不是动态初始化它。这是一个棘手的问题,请参阅this answer以获取更详细的示例。
另请注意,破坏的顺序是完成对象构造的确切顺序。这在C ++中的各种情况下都很常见,包括破坏临时性。
答案 1 :(得分:12)
与常规静态(全局)变量完全相同。
答案 2 :(得分:4)
它是在构造和破坏全局变量的同时构造的。
答案 3 :(得分:2)
简单地说:
构造全局变量时构造静态成员变量。未定义全局变量的构造顺序,但它在输入main函数之前发生。
当全局变量被破坏时发生破坏。
全局变量按其构建的相反顺序销毁;退出主功能后。
的问候,
Ovanes
P.S。:我建议看看C ++ - Standard,它解释(定义)如何以及何时构造或破坏全局或静态成员变量。
P.P.S。:您的代码只声明一个静态成员变量,但不会初始化它。要初始化它,您必须在其中一个编译单元中写入:
std :: vector Test :: staticVector;
或
std :: vector Test :: staticVector = std :: vector(/ * ctor params here * /);
答案 4 :(得分:1)
如果您使用的是某些特定的VC ++信息:
statics.h: ... MyClass声明...... static const int a; static int b; static int ar []; } statics.cpp:
const int MyClass::a = 2;
int MyClass::b = a+3;
int MyClass::ar[a] = {1,2}
答案 5 :(得分:-1)
静态类成员变量意味着即使同一个类中有多个对象,该变量对于该类的所有对象也是相同的。
所以,我想说,它是在第一个对象被实例化时被构造的,并且在最后一个对象被解构时被破坏。