对象初始化

时间:2011-03-16 16:30:57

标签: c++ class constructor initialization

在“C ++语言”一书中,作者声称

  

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

我感兴趣的是这句话指的是哪种情景?或者这个陈述如何帮助软件设计?

这本书也给出了一个例子

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

class Zlib{
    static Zlib_init x;
}

这本书说明了

  

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

为什么会发生这种情况?

感谢您的澄清。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

  
    

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

  

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

  
    

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

  

当您使用需要初始化和终结调用的3-rd部分库时,这非常有用。例如,当您在流程中使用WinSock时,WinSock 2需要WSAStartup才能调用其他WSA函数和WSACleanup。如果你有这种类的静态实例在构造函数中调用WSAStartup而在析构函数中调用WSACleanup,那么你应该能够在程序的其他地方使用WSA函数(除了其他静态对象的构造函数/析构函数)。