saj*_*jas 3 c++ private-constructor
在Bjarne Stroustrup撰写的The C++ Programming Language一书中,作者说:
有时,当你设计一个库时,有必要或者只是方便地发明一个带有构造函数和析构函数的类型,其唯一目的是初始化和清理.这样的类型只能使用一次:分配一个静态对象,以便调用构造函数和析构函数.例如:
Run Code Online (Sandbox Code Playgroud)class Zlib_init { Zlib_init() ; //get Zlib ready for use ~Zlib_init() ; //clean up after Zlib }; Class Zlib { static Zlib_init x; / /... };遗憾的是,不能保证这样的对象在第一次使用之前被初始化,并且在最后一次使用之后被销毁在由单独编译的单元组成的程序中.
为什么作者将构造函数和析构函数保留为私有成员?如果我们在由单独编译的单元组成的程序中使用它,为什么这个方法不起作用?是否需要定义成员x来调用构造函数Zlib_init()和析构函数~Zlib_init()?那么这种方法的用途是什么?这是在本书的第10.4.9节.
为什么作者将构造函数和析构函数保留为私有成员?
构造函数和析构函数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修复上面提到的拼写错误,或者通过成为Zlib类Zlib_init的朋友,代码仍然面临另一个问题.
这个问题通常被称为C++中的静态初始化Fiasco.
好读:
[10.14]什么是"静态初始化命令惨败"?
[10.17]如何防止静态数据成员的"静态初始化顺序失败"?