在 C++ 中的函数名前使用 & 符号的含义?

Posted

技术标签:

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

举个例子:

inline string &GetLabel( ) 
        return m_Label;
;

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

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

【问题讨论】:

【参考方案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】:

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

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

【讨论】:

以上是关于在 C++ 中的函数名前使用 & 符号的含义?的主要内容,如果未能解决你的问题,请参考以下文章

php函数名前添加& 函数的引用返回

C#中变量名前的@符号是啥意思? [复制]

PHP基础知识

C++中的类

C++知识分享:C++函数修饰符总结

c++中的各种符号是啥意思?