【发布时间】:2012-01-26 11:26:33
【问题描述】:
举个例子:
inline string &GetLabel( ) {
return m_Label;
};
其中 m_Label 是一个私有类成员变量。
按照我的理解,这个函数将返回对变量 m_Label 的引用。在我的整个程序中使用它会有什么影响,只返回值而不是引用会更好吗?谢谢!
【问题讨论】:
标签: c++ function pointers pass-by-reference
举个例子:
inline string &GetLabel( ) {
return m_Label;
};
其中 m_Label 是一个私有类成员变量。
按照我的理解,这个函数将返回对变量 m_Label 的引用。在我的整个程序中使用它会有什么影响,只返回值而不是引用会更好吗?谢谢!
【问题讨论】:
标签: c++ function pointers pass-by-reference
& 符号不是在函数名之前,而是在返回类型之后。它返回对string 的引用。
这意味着该函数的调用者可以通过引用修改m_label的值。另一方面,它避免了复制字符串。您可能希望引用和函数为 const,如下所示:
inline const string& GetLabel() const
{
return m_Label;
}
两全其美。您避免复制,但调用者无法更改您的对象。
【讨论】:
它返回对私有成员的引用。
在很多情况下这是可取的,但应该注意一些。
IMO 出于整体性能原因,返回非整数类型的内部对象的副本通常不是一个好主意。是的,我知道,过早的优化不好,但这并不是真正的优化,它只是一种良好的性能实践,允许调用者确定性能影响;如果它想要一个副本,它就不能将它分配给它的变量声明为引用。
我在这里使用了 2 个一般的经验法则:
1) 如果不希望调用者能够直接修改私有对象,请将返回值声明为 const 引用:
inline const string& GetLabel() const{ return m_Label; }
2) 调用者不应该存储从类方法返回的引用,它应该只在保证父对象在范围内的地方使用。
如果出于某种原因您需要调用者能够存储对内部对象的引用,请改用智能指针。
【讨论】:
返回引用意味着调用代码可以在你返回后修改你的成员变量的值。这是非常危险的,除非你打算这样做。
更好的是const 引用,或按值返回(不带&)。
【讨论】:
一个含义是,如果封闭对象被破坏,则引用变得无效:
Object* o = new Object;
string& label = o->GetLabel();
delete o;
// label becomes a dangling reference here.
另一个含义是调用者可以修改字符串。您可以通过返回一个 const 引用来解决这个问题。
【讨论】:
你是对的。它是对字符串成员的引用。
这意味着如果调用者要分配一个值或以其他方式修改返回的字符串,他们也将修改成员变量。如果这不是您的意图,您可能希望按值返回一个副本以避免破坏封装。
【讨论】: