【Effective C++】条款4:确保对象在使用之前被初始化

2023-12-14 00:30:41

如果一个编译单元中的非局部静态对象的初始化使用了另一个编译单元中的非局部静态对象,那么它使用的对象可能是未初始化的,因为不同编译单元中定义的非局部静态对象初始化的相对顺序是未定义的。

ps:

每个源文件就是一个编译单元。

局部静态对象:函数内部定义的静态对象,其它静态对象叫做非局部静态对象,如全局对象,类的静态对象。

//***********A.cpp******************
class FileSystem
{
public:
	//……
	size_t numDisks() const;//众多函数之一
	//……
};

FileSystem tfs;//定义一个非局部静态对象


//***********B.cpp****************
extern FileSystem tfs;//声明对象
class Directory
{
public:
	Directory()
	{
		size_t disks = tfs.numDisks();//使用其它源文件中的非静态局部对象
	}
};

Directory temDir;//调用构造函数初始化

?初始化temDir时,无法确定tfs是否已经初始化,因为不同编译单元中定义的非局部静态对象初始化的相对顺序是未定义的。

解决方案:使用局部静态对象

//***********A.cpp******************
class FileSystem
{
public:
	//……
	size_t numDisks() const;//众多函数之一
	//……
};

FileSystem& tfs()
{
    static FileSystem fs;//局部静态对象
    return fs;
}

?

//***********B.cpp****************
FileSystem& tfs();//函数声明

class Directory
{
public:
	Directory()
	{
		size_t disks = tfs().numDisks();
	}
};

Directory temDir;//调用构造函数初始化

文章来源:https://blog.csdn.net/weixin_74113106/article/details/134863045
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。