在我工作的项目中,我在代码审查过程中看到如下代码:
class A
{
shared_ptr<B> instanceB;
}
A::A ()
{
instanceB = make_shared<B>();
static C localVariable(instanceB.get());
}
我知道静态变量就像全局变量,将在程序启动时创建,而 instanceB 将在 A 实例化时创建。这可能会崩溃。
在解释时我开始考虑 instanceB.get() 会返回什么值。很可能是垃圾吧?当我想多了 我相信这段代码甚至不应该被编译为什么允许静态变量在它们的构造函数中采用非静态参数?
最佳答案
and will be created when program starts
不,那是错误的。函数中的静态变量是在该函数首次执行时创建的。因此,当 A::A()
首次运行时,您的 localVariable
将收到 instanceB.get()
返回的内容。所以 localVariable
中不会有垃圾。
这样的设计可能看起来确实很奇怪,但它在语法上是正确的,并且对编译器具有明确定义的含义。此外,在经典的单例实现中使用了非常相似的设计。
关于c++ - 使用非静态成员变量的静态变量初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41278925/