如何声明成员的访问者?

时间:2012-03-08 11:08:10

标签: c++ getter

在某些类中,访问器声明为getName1,而其他类似getName2。从使用角度看,它看起来完全相同。在一个像样的编译器中,是否有任何性能优势?有什么情况我只能使用其中一个吗?

class MyClass
{
  public:
    MyClass(const string& name_):_name(name_)
  {
  }
    string getName1() const
    {
      return _name;
    }
    const string& getName2() const
    {
      return _name;
    }
  private:
    string _name;
};

int main()
{
  MyClass c("Bala");
  string s1 = c.getName1();
  const string& s2 = c.getName1();
  string s3 = c.getName2();
  const string& s4 = c.getName2();
  return 0;
}

2 个答案:

答案 0 :(得分:4)

通过引用返回可能更快,因为不需要复制(尽管在许多情况下return-value optimization适用。

然而,它也增加了耦合。如果您想要更改类的内部实现,以便以不同的方式存储名称(即不再在string中),请考虑会发生什么。将不再有引用返回的内容,因此您还需要更改公共接口,这意味着需要重新编译客户端代码。

答案 1 :(得分:1)

string getName1() const
{
    return _name;
}

在这种情况下,编译器可以认真做RVO(返回值优化)。

This article from Dave Abrahams may help.