对象初始化 在《C++语言》一书中,作者提出了

对象初始化 在《C++语言》一书中,作者提出了,c++,class,constructor,initialization,C++,Class,Constructor,Initialization,有时,在设计库时,有必要或只是为了方便,发明一个具有构造函数和析构函数的类型,其唯一目的是初始化和清理。这种类型只能使用一次:分配一个静态对象,以便调用构造函数和析构函数 我很感兴趣的是,这份声明所指的是哪种情况?或者这句话如何帮助软件设计 这本书还举了一个例子 class Zlib_init{ Zlib_init( ); ~Zlib_init( ); }; class Zlib{ static Zlib_init x; } 书中说 不幸的是,在由单独编译的单元组成的

有时,在设计库时,有必要或只是为了方便,发明一个具有构造函数和析构函数的类型,其唯一目的是初始化和清理。这种类型只能使用一次:分配一个静态对象,以便调用构造函数和析构函数

我很感兴趣的是,这份声明所指的是哪种情况?或者这句话如何帮助软件设计

这本书还举了一个例子

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

class Zlib{
    static Zlib_init x;
}
书中说

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

为什么会发生这种情况


<谢谢>澄清。

< P> C++标准没有指定静态对象创建的顺序。因此,如果您需要静态对象中的某些层次结构,则需要它们彼此依赖(例如,一个应该是另一个的成员)。书中的结构保证了这种行为

例如,一个假想的游戏引擎需要声音和图形引擎才能工作,如果您在单独的编译单元中将它们声明为静态对象,并从一个编译单元使用另一个编译单元,则不能保证它不会失败,除非您按照指定的方式对它们进行编码

请参阅问题第二部分的条目

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

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

有时,在设计库时,有必要或只是为了方便,发明一个具有构造函数和析构函数的类型,其唯一目的是初始化和清理。这种类型只能使用一次:分配一个静态对象,以便调用构造函数和析构函数


当您使用需要初始化和终结调用的3-rd部分LIB时,这非常有用。例如,WinSock 2需要WSAStartup,然后才能调用其他WSA函数,当您在流程中使用WinSock时,需要WSACleanup。如果这种类的静态实例在构造函数中调用WSAStartup,在析构函数中调用WSACleanup,则应该能够在程序的其他位置使用WSA函数(其他静态对象的构造函数/析构函数除外).

您可以保证这样一个对象将在调用main之前创建,并在main返回后销毁。因此,你可能会说“但是,但是……一切都好”。Unluckily,在程序中的某个地方,可以使用一个不同的静态对象,它也使用ZLIbjIn对象,而C++语言不能保证在一个或多个对象之前或之后,该对象将被创建或销毁,只要它们在不同的编译单元中。因此,措辞可能有点迂腐,但它是100%正确的。在同一个编译单元中,它们是按照定义(而不是声明)的顺序构造的。问题是当它们分散在多个单元中时…谢谢,我已经修复了答案。