假设我有以下结构:
class HeavyClass {
public:
static inline HeavyClass const &get() { // note the &
return h_;
}
private:
static HeavyClass h_;
};
HeavyClass HeavyClass::h_();
int main() {
HeavyClass foo = HeavyClass::get(); // critical line
return 0;
}
我的问题是,这真的会在关键线上做我想做的事吗?也就是说,foo 会是 h_ 的拷贝,还是实际上是 h_,就好像它是通过引用传递的一样?
非常感谢!
最佳答案
您正在复制。
get
函数确实返回了一个引用,但是您是按值给它赋值:
HeavyClass foo = HeavyClass::get(); // critical line
这里的关键行,关键的部分是foo
的定义。 foo
不是对HeavyClass
的引用——它本身就是一个HeavyClass
。因此,foo
不能对任何东西的引用。
C++ 中没有魔法,只有逻辑。好吧,也许有魔法,但没有一个是隐藏的。这一切都在众目睽睽之下。您在这里声明了一个 HeavyClass
,而不是对 HeavyClass
的引用,因此它不会神奇地成为引用。
如果你想要引用,像这样声明 foo:
const HeavyClass& foo = HeavyClass::get()
顺便说一下,您似乎正在尝试构建一个单例。在继续之前,请至少研究并了解为什么单例通常被认为是糟糕的所有论点。
关于C++:在成员函数中通过引用返回成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19167074/