2011-03-16 138 views
4

在这本书中“C++语言”,作者声称对象初始化

有时候,当你设计一个图书馆,这是必要的,或者干脆方便,去创造一种有一个构造函数和析构函数只有初始化和清理的目的。这种类型只能使用一次:分配一个静态对象,以便调用构造函数和析构函数。

我很感兴趣这种说法是指哪种场景?或者这个声明如何帮助软件设计?

书中还举了一个例子

class Zlib_init{ 
    Zlib_init(); 
    ~Zlib_init(); 
}; 

class Zlib{ 
    static Zlib_init x; 
} 

和书指出

不幸的是,它不能保证,这样的对象是其第一次使用前初始化,并在最后一次使用后销毁在由单独编译的单元组成的程序中。

为什么会发生这种情况?

感谢您的澄清。

+0

你有保证这样的一个对象将被创建之前main被调用并在主返回后被销毁。因此,你可能会试图说:“但是......一切都很好”。不幸的是,你可能在你的程序的某个地方有一个不同的静态对象,它也使用Zlib_init对象,并且C++语言不能保证它是否会在这个对象或其他对象之前或之后被创建或销毁,只要它们在不同的编译单元。所以,措辞可能有些迂腐,但它是100%正确的。 (好吧,无论如何它是正确的,因为它是Stroustrup)。 – Damon 2011-03-16 16:39:48

回答

2

C++标准没有指定创建静态对象的顺序。因此,如果你在静态对象中需要一些层次结构,你需要它们相互依赖(例如,一个应该是另一个的成员)。书中的结构保证了这种行为。例如,假设的游戏引擎需要声音和图形引擎才能工作,如果您将它们声明为单独编译单元中的静态对象,并使用另一个编译单元,则不能保证它不会失败,除非您将它们编码为你指定的方式。

请参阅C++ faq条目的第二部分您的问题。

+0

在同一编译单元中,它们按其定义(不是声明)的顺序构造。问题是,当他们分布在多个单位... – 2011-03-16 16:43:38

+0

谢谢,我已经解决了答案。 – vissi 2011-03-16 16:51:30

0

不幸的是,它不能保证这样的对象是在第一次使用之前进行初始化,并在由单独编译单元的程序其最后使用后被销毁。

例如,如果你有static存储在一个模块中的类的实例,并希望在其他模块中使用它从另一个类的构造函数static存储。在这种情况下,你暗示第一个实例将在第二个实例之前初始化。但是,如果实例是在单独的模块中定义的,则语言无法指定此顺序。

有时候,当你设计一个图书馆,这是必要的,或者干脆方便,去创造一个构造函数,并初始化和清除的唯一目的析构型。这种类型只能使用一次:分配一个静态对象,以便调用构造函数和析构函数。

当你与3挡部分需要初始化和结束通话库工作,这是非常有用的。例如,WinSock 2需要WSAStartup,然后才能调用其他WSA函数,并在您的流程中完成WinSock时调用WSACleanup。如果您有这种类的静态实例在构造函数中调用WSAStartup并在析构函数中调用WSACleanup,则应该可以在程序的其他位置(除了其他静态对象的构造函数/结构体)使用WSA函数。