- 非局部静态对象的定义:
- 定义在全局或名字空间范围内;
- 在一个类中被声明为static;
- 在一个文件范围内被定义为static。
- 当一个对象的初始化要依赖于另一个被编译单元中的另一个对象的值,并且这第二个对象本身也需要初始化,事情就会变得复杂。因为对于不同编译单元的非局部静态对象,无法控制初始化的顺序。
- 我们可以访问具有与非局部静态对象“相似行为”的对象(不存在初始化问题)。这种技术称为“单一模式”。首先把每个非局部静态对象转移到函数中,声明它为static。其次,让函数返回这个对象的引用。这样,用户将通过函数调用来指明对象。换句话说,用函数内部的static对象取代了非局部静态对象。如下所示改进的类:
class FileSystem{…};
FileSystem& theFileSystem()
{
static File tfs;
return tfs;
}
class Directory{…};
Directory::Directory()
{
调用theFileSystem()的各种成员函数
}
Directory& tempDir()
{
static Directory td;
return td;
}
现在可以使用 theFileSystem()和 tempDir()替代非局部静态对象。他们所用的是返回对象引用的函数,而不是对象本身。
- 说明:虽然关于“非局部”静态对象什么时候被初始化,C++几乎没有做过说明;但对于函数中的静态对象,什么时候被初始化,C++却明确指出:他们在函数调用过程中初次碰到对象的定义时被初始化。所以,如果不对非局部对象直接访问,而是返回局部静态对象引用的函数调用来代替,就能保证从函数的得到的引用指向的是被初始化了的对象。这样做的另一个好处是,如果这个模拟非局部静态对象的函数从没有被调用,也就永远不会带来对象构造和销毁的开销;而对于非局部静态对象来说没有这样的好事。