在 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++ 中的函数名前使用 & 符号的含义?的主要内容,如果未能解决你的问题,请参考以下文章