所谓static对象,其寿命从被构造出来直到程序结束为止,因此

stack和heap-based对象都被排除。这种对象包括global对象,定

义于namespace作用域内的对象、在class内、在函数内、以及在

file作用域内被声明为static的对象。函数内的static对象称为

local static对象(因为它们对函数而言是local),其他static

对象称为non-local static对象。程序结束时static对象会被自动

销毁,也就是它们的析构函数会在main()结束时被自动调用。

所谓编译单元(translation unit)是指产出单一目标文件

(single object file)的那些源码。基本上它是单一源码文件加

上其所含入的头文件。

C++对“定义于不同编译单元内的non-local static对象”的初始

化次序并无明确定义。

问题来了:如果某编译单元内的某个non-local static对象的初始

化动作使用了另一个编译单元内的某个non-local static对象,它

所用到的这个对象可能尚未被初始化。

解决方法:

将每个non-local static对象搬到自己的专属函数内(该对象在此

函数内被声明为static)。这些函数返回一个reference指向它所

含的对象。然后用户调用这些函数,而不直接指涉这些对象。这个

专属函数我们叫它reference-returning函数。其形式大致为:

class classNameA{...};class classNameB{...inline classNameA& clsNameAObj(){static classNameA clsNameA;return clsNameA;}...}

这个方法的基础在于:C++保证,函数内的local static对象会在

“该函数被调用期间”“首次遇上该对象之定义式”时被初始化。

但从另一个角度看,这些函数“内含static对象”的事实使他们在

多线程系统中带有不确定性。我们可以在程序的单线程启动阶段手

工调用所有reference-returning函数,这可消除与初始化有关的

“竞速形式(race conditions)”。

我们总是需要为内置型对象进行手工初始化,因为C++不保证初始化他们。