Как объявить права доступа к члену? - PullRequest
0 голосов
/ 08 марта 2012

В некоторых классах методы доступа объявляются как 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 ]

4 голосов
/ 08 марта 2012

Возвращение по ссылке потенциально быстрее, потому что копирование не требуется (хотя во многих случаях применяется оптимизация возвращаемого значения .

Однако это также увеличивает сцепление. Подумайте, что произойдет, если вы захотите изменить внутреннюю реализацию вашего класса, чтобы сохранить имя по-другому (то есть больше не в string). Больше не нужно будет что-то возвращать по ссылке, поэтому вам также нужно будет изменить ваш публичный интерфейс, что означает, что клиентский код нужно будет перекомпилировать.

1 голос
/ 08 марта 2012
string getName1() const
{
    return _name;
}

В этом случае компилятор может серьезно выполнить RVO (оптимизацию возвращаемого значения).

Эта статья Дэйва Абрахамса может помочь.

...