1

我目前正在阅读旧版 Nicolai Josuttis 关于 C++ 模板的书。我的问题是关于这里SortTracer实现的静态数据成员的初始化。

具体来说,在 中tracer.hpp,我们有:

class SortTracer {
  private:
    int value;                // integer value to be sorted
    int generation;           // generation of this tracer
    static long n_created;    // number of constructor calls
    static long n_destroyed;  // number of destructor calls
    static long n_assigned;   // number of assignments
    static long n_compared;   // number of comparisons
    static long n_max_live;   // maximum of existing objects
    ...
}

上述静态数据成员的初始化在tracer.cpp

#include "tracer.hpp"

long SortTracer::n_created = 0;
long SortTracer::n_destroyed = 0;
long SortTracer::n_max_live = 0;
long SortTracer::n_assigned = 0;
long SortTracer::n_compared = 0;

测试代码在这里

#include "tracer.hpp"
...

int main()
{
    // prepare sample input:
    SortTracer input[] = { 7, 3, 5, 6, 4, 2, 0, 1, 9, 8 };
    ...
}

我的问题/困惑是:这个程序不会遭受静态初始化命令的失败吗?(也就是说,即使程序目前产生了正确的结果,这是由于静态数据成员的tracer.cpp初始化与默认初始化相同)

4

1 回答 1

1

所有全局变量(包括类级别的静态变量)都保证在main(). 它们在不同源文件之间的初始化顺序是未定义的。

全局初始化顺序惨败是指一个文件中的全局变量被另一个源文件中的全局变量初始化的情况,其结果取决于初始化顺序。在您的情况下,变量初始化为零,因此没有“惨败”-程序是安全的。

于 2022-01-14T05:31:13.913 回答