是否可以保证静态初始化不会覆盖显式初始化的值
Are there any guarantees that static initialization will not overwrite the value from explicit initialization?
假设我有以下两个变量,它们都是静态初始化的,并且它们位于不同的编译单元中。
Foo.cc
Foo foo;
Bar.cc
Bar bar;
假设,通常bar
是在foo
之后静态初始化的。
如果foo的构造函数被写入bar
的值,那么bar
的后续静态初始化是否有可能覆盖foo?
写入的值
也就是说,假设Bar
有第二个接受字符串的构造函数,foo
的构造函数如下所示:
Foo::Foo() {
bar = Bar("Hello World");
/// do other stuff to make a Foo
}
bar
的静态初始化是否有可能在foo
之后运行,并覆盖由foo
的构造函数编写的bar
的值?
是的,动态初始化(这是调用静态构造函数时发生的情况)可以以任何顺序发生。
如果静态对象需要相互依赖,最好根据需要动态分配它们,并保护初始化,使其只发生一次,类似于singleton模式。
正如Scott Meyers所说:
[…]在不同转换单元中定义的非局部静态对象的初始化的相对顺序是未定义的。[…]
和:
幸运的是,一个小小的设计更改就完全消除了这个问题。所要做的就是将每个非本地静态对象移动到其自己的函数中,在那里它被声明为静态。这些函数返回对它们所包含对象的引用。然后客户端调用函数,而不是引用对象。换句话说,非局部静态对象被局部静态对象所取代。(设计模式的爱好者会认识到这是Singleton模式的常见实现。)
作为这项工作的一个例子,可以看:http://www.parashift.com/c++-faq/static-init-order-on-first-use-members.html
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 当读取错误类型时,CIN覆盖我的初始化值
- C++ 重载和覆盖 - 无法使用类型的右值初始化类型的参数
- 成功初始化后,结构成员被垃圾价值覆盖
- 初始化对象后,如何使用赋值运算符覆盖C++中的类对象
- 是否可以保证静态初始化不会覆盖显式初始化的值
- std::vector不会为多个向量条目创建cv::Mat的新引用——初始化矩阵时,数据会被覆盖
- 初始化程序正在覆盖第二个数组
- 在c++ 0x中,非静态数据成员初始化式是否覆盖隐式复制构造函数?