Ara*_*raK 11 c++ static-members lifetime
如果我有一个名为Test ::
class Test
{
static std::vector<int> staticVector;
};
Run Code Online (Sandbox Code Playgroud)
什么时候构造staticVector以及什么时候它被破坏?
它是与Test类的第一个对象的实例化,还是像常规静态变量一样?
只是为了澄清,在阅读编程语言概念(Sebesta Ch-5.4.3.1)后,我想到了这个问题,它说::
请注意,当静态修饰符出现在C++,Java和C#中的类定义中的变量声明中时,它与变量的生命周期无关.在该上下文中,它表示变量是类变量,而不是实例变量.保留字的多次使用可能使学习语言的人特别困惑.
你明白了吗?:(
Joh*_*itb 17
我想写一些关于initializaton的文本,我可以稍后链接到.
首先是可能性列表.
std::terminate则调用.例子:
打印以下程序 A(1) A(2)
struct A {
A(int n) { std::printf(" A(%d) ", n); }
};
A a(1);
A b(2);
Run Code Online (Sandbox Code Playgroud)
以下是基于同一类的打印 A(2) A(1)
extern A a;
A b(2);
A a(1);
Run Code Online (Sandbox Code Playgroud)
让我们假装有一个翻译单元,其中msg定义如下
char const *msg = "abc";
Run Code Online (Sandbox Code Playgroud)
然后打印以下内容abc.请注意,p接收动态初始化.但是因为静态初始化(char const*是POD类型,并且"abc"是地址常量表达式)msg在此之前发生,这很好,并且msg保证正确初始化.
extern const char *msg;
struct P { P() { std::printf("%s", msg); } };
P p;
Run Code Online (Sandbox Code Playgroud)
示例:以下程序打印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);
}
Run Code Online (Sandbox Code Playgroud)
在上述所有情况下,在某些有限的情况下,对于某些不需要静态初始化的对象,编译器可以静态初始化它,而不是动态初始化它.这是一个棘手的问题,请参阅此答案以获取更详细的示例.
还要注意,破坏的顺序是完成对象构造的确切顺序.这在C++中的各种情况下都很常见,包括破坏临时性.
Mag*_*off 13
完全像常规静态(全局)变量.