静态函数返回 class 的静态实例 - 实例不应该相同吗?

Static function returning a static instance of the class - shouldn't the instance be the same?

我有以下代码:

#include <iostream>
using namespace std;

class Test {
public:
  static Test& get() {
    static Test testSing;
    return testSing;
  }
};

int main() {
  Test a = Test::get();
  Test b = Test::get();

  cout << &a << endl;
  cout << &b << endl;
}

我认为 ab 应该有相同的地址,因为我认为 they should be constructed only once。但是,我在这个测试中得到了不同的内存地址。

有什么我遗漏的小事吗?他们不应该有相同的地址吗?

ab是从Test::get的return值赋值的,也就是说它们是复制的,所以它们是自变量。您可以将它们声明为引用类型,因此将代码更改为:

Test &a = Test::get();
Test &b = Test::get();

你会得到你想要的。

您使用复制构造函数,因此您有 2 个不同的对象,缺少引用。

你可能想要

Test& a = Test::get();
Test& b = Test::get();

"I thought that a and b should have the same address"

如其他答案中所述,您指的是 Test 的副本,它们的地址当然不同。

为了使其成为单例 class(这似乎是有意的),您明确禁止使用默认构造函数和复制构造函数,以及复制赋值运算符:

class Test {
public:
  static Test& get() {
    static Test testSing;
    return testSing;
  }
private:
    // Forbid the following operations being used from public scope
    Test() {}
    Test(const Test&);
    Test& operator=(const Test&);
};

这样一来,除了意外行为之外,您将首先得到简洁的编译错误。