我提出了一个非常简单的问题,但遗憾的是我自己无法找到答案.
假设我有一些保存设置的数据结构,就像设置图一样.
我有一个GetValue(const std :: string& name)方法,它返回相应的值.
现在我想弄明白 – 什么样的回报价值方法会更好.显而易见的意思是让我的方法表现得像
std::string GetValue(const std::string& name) const
并返回对象的副本,并依赖于RVO的性能含义.
另一个意味着制作两种方法
std::string& GetValue(...) const std::string& GetValue(...) const
这通常意味着复制代码或使用一些邪恶的常量强制转换来使用其中一个例程两次.
#Q
在这种情况下你会选择什么?为什么?
解决方法
其实我可能会用:
std::string GetValue(const std::string& name) const; // or const std::string* GetValue(const std::string& name) const; void SetValue(std::string name,std::string value);
塞特首先:
>在SetValue中按值传递允许编译器进行一些无法通过const-reference传递的优化,Dave Abrahams在一篇文章中对此进行了解释,“Want Speed? Pass by Value.”
>使用Setter通常更好,因为您可以检查所设置的值,而使用普通引用时,您无法保证调用者不会对数据执行任何愚蠢的操作.
对于吸气剂:
>通过复制返回似乎是浪费,因为大多数时候你不会修改返回的对象(对于设置图),但是指针或引用确实意味着对象别名将活得足够长,如果你不能保证它那么点没有实际意义:按价值回报.另外复制允许避免暴露内部细节,例如,如果您突然切换到std :: wstring,因为您需要UTF-8中的某些设置…>如果你需要表现,那么你准备在这个部门做一些让步.但是,引用不允许您发出缺少属性的信号(除非您有一些魔术值),而指针使其变得容易(NULL已经为您剪掉).