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

C++ C++;:通过成员函数中的引用返回成员变量,c++,pointers,reference,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

假设我有以下结构:

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_,就好像它是通过引用传递的一样


非常感谢

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

函数的返回类型是否为引用并不改变函数调用的值,只改变值类别


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

我认为您需要类似于:

const HeavyClass& foo = HeavyClass::get();
如果你想把
foo
变成
h

你就在复制

函数
get
确实返回了一个引用,但您是在按值分配它:

HeavyClass foo = HeavyClass::get(); // critical line
在这里的关键行中,关键部分是
foo
的定义
foo
不是对-
HeavyClass
的引用——它是一个
HeavyClass
本身。因此,
foo
不能引用任何内容

<> C++中没有魔法,只有逻辑。好吧,也许有魔法,但没有一个是隐藏的。它这一切都显而易见。在这里,您声明了一个
HeavyClass
,而不是对-
HeavyClass
的引用,因此它不会神奇地变成一个引用

如果需要引用,请按以下方式声明foo:

const HeavyClass& foo = HeavyClass::get()

顺便说一句,看起来你想建立一个单身家庭。请在继续之前,至少研究并认识到为什么单例通常被认为是不好的所有论点。

“这真的会满足我的要求吗?”您忘记告诉我们您想要什么。您可以通过定义一个打印一些断言的构造函数来轻松测试它。下一句话“a是否会发生?”,您想要哪一个?这会给出“从类型为“const HeavyClass”的表达式中对类型为“HeavyClass&”的引用的初始化无效”更清楚地说,在
get()
返回时,会避免复制;然后通过复制
h
来构造一个局部变量
foo
。因此,正确的方法似乎是实际返回一个指针,对吗?@bombax:不对。这意味着您使用的代码与您发布的代码不同。谢谢!我以前也试过类似的方法,但忘记了常量部分。现在它做了我想要的,我通过打印地址进行了双重检查。非常有用的答案!