为什么构造函数Zlib_init在Bjarne Stroustrup的书中的Zlib_init类中保持私有

saj*_*jas 3 c++ private-constructor

在Bjarne Stroustrup撰写的The C++ Programming Language一书中,作者说:

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

 class  Zlib_init
{
    Zlib_init() ; //get Zlib ready for use
   ~Zlib_init()  ; //clean up after Zlib
};
Class Zlib
{
   static  Zlib_init   x;
   /  /...
};
Run Code Online (Sandbox Code Playgroud)

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

为什么作者将构造函数和析构函数保留为私有成员?如果我们在由单独编译的单元组成的程序中使用它,为什么这个方法不起作用?是否需要定义成员x来调用构造函数Zlib_init()和析构函数~Zlib_init()?那么这种方法的用途是什么?这是在本书的第10.4.9节.

Alo*_*ave 8

为什么作者将构造函数和析构函数保留为私有成员?

构造函数和析构函数private似乎是一个错字.需要定义
static成员才能使用它们.为了定义静态成员,需要可以访问构造函数.如果不是链接器会抱怨未定义的引用. x

在线样本:

class  Zlib_init 
{    
   Zlib_init() ; //get Zlib ready for use  
  ~Zlib_init()  ; //clean up after Zlib 
   public:
     int j;
};
class Zlib 
{  
   public:  
   static  Zlib_init   x;    
}; 

Zlib_init Zlib::x;

int main()
{
    Zlib::x.j = 10;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

prog.cpp:3: error: ‘Zlib_init::Zlib_init()’ is private     
prog.cpp:14: error: within this context      
prog.cpp: In static member function ‘static void Zlib::__static_initialization_and_destruction_0(int, int)’:     
prog.cpp:4: error: ‘Zlib_init::~Zlib_init()’ is private     
prog.cpp:14: error: within this context     
Run Code Online (Sandbox Code Playgroud)

如果我们在由单独编译的单元组成的程序中使用它,为什么这个方法不起作用?

如果您通过构造构造函数和析构函数来public修复上面提到的拼写错误,或者通过成为ZlibZlib_init朋友,代码仍然面临另一个问题.
这个问题通常被称为C++中的静态初始化Fiasco.

好读:

[10.14]什么是"静态初始化命令惨败"?
[10.17]如何防止静态数据成员的"静态初始化顺序失败"?