c++ - 使用非静态成员变量的静态变量初始化

标签 c++

在我工作的项目中,我在代码审查过程中看到如下代码:

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/

相关文章:

c++ - 是否有一些类似于 boost program_options 但用于 *keyboard shortcut auto-gen help* 的 c++ 库/源代码?

c++ - 从字符串c++中删除非字母字符

c++ - 如何获取屏幕的尺寸?

c++ - 什么是域错误

c++ - 用花括号 C++ 实例化一个对象

C++ 自动注释 block 工具

c++ - 在结构 C++ 中添加值 C 字符串

c++ - 为什么仍然需要在 using 语句的 RHS 中消除依赖类型与 typename 的歧义?

C++ 编译器函数调用

c++ - 指针对象的指针和内存分配