静态函数返回 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;
}
我认为 a
和 b
应该有相同的地址,因为我认为 they should be constructed only once。但是,我在这个测试中得到了不同的内存地址。
有什么我遗漏的小事吗?他们不应该有相同的地址吗?
a
和b
是从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&);
};
这样一来,除了意外行为之外,您将首先得到简洁的编译错误。
我有以下代码:
#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;
}
我认为 a
和 b
应该有相同的地址,因为我认为 they should be constructed only once。但是,我在这个测试中得到了不同的内存地址。
有什么我遗漏的小事吗?他们不应该有相同的地址吗?
a
和b
是从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&);
};
这样一来,除了意外行为之外,您将首先得到简洁的编译错误。