哪一个是首选,返回const double&或返回双倍

时间:2009-11-06 02:09:01

标签: c++ reference return-value

鉴于以下情况,首选以下哪一项。 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; }
}

8 个答案:

答案 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)

经验法则:

  • 内置(int,double,pointer) - > 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 ++主题。