【问题标题】:does c++ singleton create new instance every time?c++单例每次都创建新实例吗?
【发布时间】:2022-01-23 07:06:01
【问题描述】:

C++ 单例代码如下所示:

MyClass& MyClass::getInstance(){
    static MyClass instance;
    return instance;
}

具体看static MyClass instance;

每次调用 getInstance 时是否都会创建一个新的instance?

编辑

我知道静态成员是一个类。但是static MyClass instance 不是在每次调用getInstance() 时都重新声明(并因此重新创建)“单个”实例instance 吗?

【问题讨论】:

  • 没有。这就是static 的含义:有一个实例instance 在getInstance 的调用之间共享。您可能会怀疑,如果有一堆不同的实例,它就不会是任何类型的“单例”。
  • 函数的静态成员仅在第一次调用函数时创建一次。
  • 没有。根据定义,静态变量只创建一次,然后在程序运行期间一直存在。函数范围内的静态变量,如instance,在第一次进入包含块时(或之前)只构造一次。在您的情况下,每次调用 getInstance() 都会返回对同一对象的引用。
  • 但是static MyClass instance 不是在每次调用getInstance() 时都重新声明(并因此重新创建)名为instance 的单个静态变量吗?

标签: c++ singleton


【解决方案1】:

因为MyClass 成员变量被声明为static 并且您返回的是对它的引用,而不是副本。静态成员变量不像普通成员变量那样为每个对象创建;相反,该类的所有对象都可以访问该变量的一个实例。

See here.

【讨论】:

  • 谢谢。我知道静态成员是一个类(与实例无关)。但我的问题是 - static MyClass instance 不是在每次调用 getInstance() 时都重新声明(并因此重新创建)单 instance 吗?每次都有效地更换它。
  • 我仍然认为您不了解静态的含义。静态变量初始化只发生一次。
  • 谢谢。我希望你明白我来自哪里。你是说我们第一次调用static MyClass instance,会创建一个新的instance。之后的每一次,都会查找instance是否存在并返回(不是新创建的)?
  • 是的。这就是它的工作原理。如果你想测试一下。在上面代码中MyClass 的构造函数中,放入向控制台打印内容的代码。这样你就可以看到它构造了一个 MyClass 并且再也不会这样做了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 2018-09-11
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多