鉴于以下情况,首选以下哪一项。 m_state是成员 rater而不是局部变量。
class C
{
private:
double m_state;
public:
double state() const { return m_state; } // returns double
double& state() { return m_state; }
}
===========================================
class C
{
private:
double m_state;
public:
const double& state() const { return m_state; } // returns const double&
double& state() { return m_state; }
}
答案 0 :(得分:6)
我不会这样做:
double& state() { return m_state; }
如果您这样做,也可以公开m_state
。可能最有意义的是:
const double & state() const { return m_state; }
然后再次,当你谈论保存64位变量的副本(即微优化)以及后一版本可以重铸为你想要的任何事实时,我只想复制它:
double state() const { return m_state; }
(并不是说有任何真正的安全性)
答案 1 :(得分:1)
对于像double这样的东西只做double state() const { ... }
就可以了,副本很快,你和调用者不需要担心是否可以修改返回值,并且可以从对象的const或非const引用。
对于像对象这样更复杂的东西,它实际上取决于你是否希望调用者能够修改它,也许你希望它们能够在获取对象时调用非const成员。如果是这样,那么MyClass & state() const { ... }
是您最好的选择。
答案 2 :(得分:1)
返回双精度更有意义。因为您没有返回对更复杂对象的引用。这可能是在寄存器中完成的,所以它会稍微快一些。 如果你真的想要返回一个引用,那就把它变成一个const const。
经验法则是,简单类型只返回它们。对象 - 通过引用。其他任何事情都是不必要的复杂性。答案 3 :(得分:1)
经验法则:
value
const reference
以下警告适用:如果您知道POD(普通旧数据)是什么,并且您有一个合理大小的POD,则可以value
返回。
答案 4 :(得分:0)
你是否想尝试像结构一样的财产?如果是这样,为什么不使用getState()
和setState(...)
?
答案 5 :(得分:0)
我认为第二个版本是首选:
const double& state() const { return m_state; } // returns const double&
只是因为如果返回值更复杂,它与编写此类函数的方式一致。在你的情况下,无论如何,这两个版本都不会比另一个版本更快或更安全。
答案 6 :(得分:0)
其他答案已经解决了这两种方法的可读性和代码hygene含义。
就现代x86拱门的性能而言,如果该功能是内联的,那么无论如何都没有区别。如果函数不是内联函数,则返回double
而不是const double &
会有 tiny 优势,因为double只是在寄存器上返回,而引用返回指针然后必须加载。但是,一个周期成本完全被非内联函数的惩罚所淹没。
答案 7 :(得分:0)
我的建议:
永远不要通过公共接口将句柄返回给类的私有数据成员,以确保客户端无法修改它。
由scott mayers查看有效的C ++主题。