通过引用或 const 引用返回没有速度差异 - 两者都非常快,因为它们只是返回对原始对象的引用,不涉及复制。
(非常量)引用返回的对象可以通过该引用进行修改。在您的具体示例中,mString
它是公开的,因此无论如何都可以(直接)修改它。但是,getter 和 setter 的常用方法(以及引入它们的主要原因)是封装 - 您只允许通过 getter/setter 访问您的数据成员,以便您可以检测正在设置的无效值、响应值更改和只是通常将类的实现细节隐藏在其中。所以 getter 通常通过 const 引用或按值返回。
但是,如果您通过 const 引用返回,它会绑定您始终在您的类中保留一个实例std::string
来备份引用。也就是说,即使您稍后想要重新设计您的类,以便它在 getter 中动态计算字符串,而不是在内部存储它,您也不能。您必须同时更改您的公共接口,这可能会破坏使用该类的代码。例如,只要您通过 const-reference 返回,这是完全有效的代码:
const std::string *result = &aSample.Get();
如果更改为按值返回而不是 const 引用,则此代码当然会产生一个不再编译的悬空指针。 (感谢史蒂夫杰索普纠正我)Get()
总而言之,我会采取的方法是mString
私有化。Get()
可以按值或通过 const 引用返回,这取决于您对始终存储字符串的确定程度。然后该类将如下所示:
class sample
{
std::string mString;
public:
void Set(const std::string &s)
{
mString = s;
}
std::string Get() const
{
return mString;
}
};