【问题标题】:Implications of using an ampersand before a function name in C++?在 C++ 中的函数名前使用 & 符号的含义?
【发布时间】:2012-01-26 11:26:33
【问题描述】:

举个例子:

inline string &GetLabel( ) {
        return m_Label;
};

其中 m_Label 是一个私有类成员变量。

按照我的理解,这个函数将返回对变量 m_Label 的引用。在我的整个程序中使用它会有什么影响,只返回值而不是引用会更好吗?谢谢!

【问题讨论】:

    标签: c++ function pointers pass-by-reference


    【解决方案1】:

    & 符号不是在函数名之前,而是在返回类型之后。它返回对string 的引用。

    这意味着该函数的调用者可以通过引用修改m_label的值。另一方面,它避免了复制字符串。您可能希望引用和函数为 const,如下所示:

    inline const string& GetLabel() const
    {
        return m_Label;
    }
    

    两全其美。您避免复制,但调用者无法更改您的对象。

    【讨论】:

    • 确实,您可能需要both const 和非const 版本。
    • @ildjam 这只是部分正确。通常您只想提供 const 版本,除非您有理由希望允许调用者直接修改对象。如果您确实提供了非常量版本,那么您还应该提供 const 版本,这样您仍然可以获得对父对象有 const 引用的只读访问权限。
    • @Gerald:抱歉,我要澄清一下——我的意思是,如果你想要返回引用的非 const 版本,那么你几乎肯定也想要一个 const 版本。
    【解决方案2】:

    它返回对私有成员的引用。

    在很多情况下这是可取的,但应该注意一些。

    IMO 出于整体性能原因,返回非整数类型的内部对象的副本通常不是一个好主意。是的,我知道,过早的优化不好,但这并不是真正的优化,它只是一种良好的性能实践,允许调用者确定性能影响;如果它想要一个副本,它就不能将它分配给它的变量声明为引用。

    我在这里使用了 2 个一般的经验法则:

    1) 如果不希望调用者能够直接修改私有对象,请将返回值声明为 const 引用:

    inline const string& GetLabel() const{ return m_Label; }
    

    2) 调用者不应该存储从类方法返回的引用,它应该只在保证父对象在范围内的地方使用。

    如果出于某种原因您需要调用者能够存储对内部对象的引用,请改用智能指针。

    【讨论】:

      【解决方案3】:

      返回引用意味着调用代码可以在你返回后修改你的成员变量的值。这是非常危险的,除非你打算这样做。

      更好的是const 引用,或按值返回(不带&)。

      【讨论】:

        【解决方案4】:

        一个含义是,如果封闭对象被破坏,则引用变得无效:

        Object* o = new Object;
        string& label = o->GetLabel();
        delete o;
        // label becomes a dangling reference here.
        

        另一个含义是调用者可以修改字符串。您可以通过返回一个 const 引用来解决这个问题。

        【讨论】:

          【解决方案5】:

          你是对的。它是对字符串成员的引用。

          这意味着如果调用者要分配一个值或以其他方式修改返回的字符串,他们也将修改成员变量。如果这不是您的意图,您可能希望按值返回一个副本以避免破坏封装。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-01-20
            • 1970-01-01
            • 2023-01-03
            • 1970-01-01
            • 1970-01-01
            • 2014-01-18
            • 2023-02-06
            • 2014-06-23
            相关资源
            最近更新 更多