[英]C++: Returning a member variable by reference in member function
假设我具有以下结构:
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_?
非常感谢!
我认为您需要类似的东西:
const HeavyClass& foo = HeavyClass::get();
如果您希望foo
为h_
。
您正在复制。
函数get
确实确实返回了引用,但是您正在按值分配它:
HeavyClass foo = HeavyClass::get(); // critical line
在关键点上,关键部分是foo
的定义。 foo
不是对HeavyClass
的引用-它本身就是HeavyClass
。 因此, foo
不能引用任何东西。
C ++中没有魔术,只有逻辑。 好吧,也许有魔术,但是没有一个是隐藏的。 一切都在眼前。 在这里,您宣布HeavyClass
,而不是一个参考TO- HeavyClass
,所以它不会奇迹般地变成了参考。
如果要引用,请像这样声明foo:
const HeavyClass& foo = HeavyClass::get()
顺便说一句,您似乎正在尝试构建Singleton。 请至少进行研究并充分理解为什么在继续之前,单身人士通常被认为是不好的所有观点。
右侧的值与确定已声明为HeavyClass
类型的变量的类型HeavyClass
。 因此,将使用右侧的值实例化并初始化该类型的新对象。 右侧是左值这一事实无关紧要(它将接受左值到右值的转换)。
无论是函数的返回类型是引用还是不不会改变函数调用的价值 ,只有价值范畴 。
请注意,这与auto
完全相同:如果您说过auto x = HeavyClass::get();
,出于相同的原因( auto
推导类型,而不是值类别),结果会相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.