我目前正在閱讀舊版 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初始化與默認初始化相同)
uj5u.com熱心網友回復:
所有全域變數(包括類級別的靜態變數)都保證在main(). 它們在不同源檔案之間的初始化順序是未定義的。
全域初始化順序慘敗是指一個檔案中的全域變數被另一個源檔案中的全域變數初始化的情況,其結果取決于初始化順序。在您的情況下,變數初始化為零,因此沒有“慘敗”-程式是安全的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/410784.html
標籤:
