Ane*_*nan 11 c++ string const reference stdstring
我对将std :: string作为const引用返回有疑问.
class sample
{
public:
std::string mString;
void Set(const std::string& s)
{
mString = s;
}
std::string Get()
{
return mString;
}
};
Run Code Online (Sandbox Code Playgroud)
在Set函数中,我将std :: string作为const引用传递给const,因为它的值在函数内部没有变化.
而在Get功能中,实际上我在这里很困惑.返回std :: string作为值更有意义.但我不确定,通过传递字符串作为const引用有任何好处.通过回转字符串作为参考将增加exectuion速度,我想是的,但我不确定.但是将它作为'const返回可以为此带来任何好处?
Die*_*ühl 15
决定如何从某种容器中返回一个非平凡的对象的问题实际上并不重要:
const引用,因为它将失去强制执行其不变量的可能性.显然,const如果调用成员函数的对象也是非对象,则通过非引用返回对象是可行的const.const对象的引用可以避免不变量的问题,但仍然暗示相应类型的对象实际上是作为实现细节保存在内部.如果你的类是一个可行的监视器,你肯定希望按值返回对象,否则可以在调用者有机会复制它之前对对象进行变异.
基本上,没有一个选择是理想的.如果有疑问,我会按值返回,除非已知对象的复制成本很高,在这种情况下我可能会返回const&.
Rei*_*ica 12
通过引用或const引用返回没有速度差异 - 两者都非常快,因为它们只返回对原始对象的引用,不涉及复制.
可以通过该引用修改(非常量)引用返回的对象.在您的具体示例中,mString是公共的,因此无论如何都可以进行修改(并且直接).但是,getter和setter的常用方法(及其引入的主要原因)是封装 - 您只允许通过getter/setter访问您的数据成员,以便您可以检测设置的无效值,响应值更改和通常只是将类的实现细节隐藏在其中.所以getter通常通过const引用或值返回.
但是,如果通过const引用返回,它会绑定您始终std::string在类中保留一个实例以备份引用.也就是说,即使你以后想要重新设计你的类,以便它在getter中动态计算字符串而不是在内部存储它,你也不能.您必须同时更改您的公共接口,这可能会破坏使用该类的代码.例如,只要您通过const-reference返回,这是完全有效的代码:
const std::string *result = &aSample.Get();
Run Code Online (Sandbox Code Playgroud)
如果更改为按值而不是const引用返回,则此代码当然会产生 不再编译的悬空指针Get().(感谢Steve Jessop纠正我)
总而言之,我采取的方法是mString私有化.Get()可以通过值或const-reference返回,具体取决于您是否确定存储字符串.这个类看起来像这样:
class sample
{
std::string mString;
public:
void Set(const std::string &s)
{
mString = s;
}
std::string Get() const
{
return mString;
}
};
Run Code Online (Sandbox Code Playgroud)
最常见的做法是将值作为const引用返回,然后可以使用引用或根据需要复制值:
const std::string& Get() const
{
return mString;
}
sample mySample;
const std::string &refString = mySample.Get(); // Const-reference to your mString
const std::string copyString = mySample.Get(); // Copy of your mString
Run Code Online (Sandbox Code Playgroud)
如果您确实需要返回字符串的副本,那么可以避免利用“ The Most Important Const ” 来复制字符串的返回值:
sample mySample;
const std::string &myString = mySample.Get();
// myString is now valid until it falls out of scope, even though it points to a "temporary" variable
Run Code Online (Sandbox Code Playgroud)