C ++:在成员函数中通过引用返回成员变量

时间:2013-10-03 18:59:01

标签: c++ pointers reference

假设我有以下结构:

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_好像是通过引用传递的?

非常感谢!

3 个答案:

答案 0 :(得分:3)

我认为你需要这样的东西:

const HeavyClass& foo = HeavyClass::get();

如果您希望fooh_

答案 1 :(得分:3)

你正在制作副本。

函数get确实会返回一个引用,但是你要按值分配它:

HeavyClass foo = HeavyClass::get(); // critical line

在这里的关键线上,关键的部分foo的定义。 foo不是HeavyClass的引用 - 它本身就是HeavyClass。因此,foo 不能引用任何内容。

C ++中没有魔法,只有逻辑。嗯,好吧,也许有魔法,但没有一个是隐藏的。它;一切都在眼前。在这里,您声明了HeavyClass,而不是引用 - HeavyClass,因此它不会神奇地成为参考。

如果你想要一个引用,请像这样声明foo:

const HeavyClass& foo = HeavyClass::get()

顺便说一句,看起来你正在尝试构建一个Singleton。请至少研究并认识到为什么单身人士在你继续之前被认为普遍不好的所有论点。

答案 2 :(得分:2)

右侧的值与确定变量类型无关,您已声明该类型为HeavyClass类型。因此,实例化该类型的新对象并使用右侧的值进行初始化。右侧是左值的事实并不重要(它将受到左值到右值的转换)。

函数的返回类型是否为引用不会更改函数调用的,只会更改值 category

请注意,这与auto完全相同:如果您说auto x = HeavyClass::get();,则它是相同的,原因相同(auto推断类型,而不是值类别)。