LINUX.ORG.RU

[C++] 'String someGetter() const' или 'const String & someGetter() const'?

 


0

0

Касательно простых геттеров, то есть не функций, которые что-то вычисляют и выдают вычисленный результат.

В Qt повсеместно встречаю первый вариант

QString someGetter() const;

По идее, с точки зрения производительности, второй вариант

const QString & someGetter() const;
предподчительней. Конечно, QString реализует механизм copy-on-write, поэтому вопрос производительности ОЧЕНЬ спорный, скорее выигрыш совершенно ничтожный.

Здесь уже вопрос, скорее, философский. Я считаю, второй вариант более логичный, ибо возврат идет значения члена класса (по ссылке), а не его идентичной копии. В данном вопросе я говорю только о геттерах для членов-объектов, а не простых типов int и т.п., в которых применение ссылок глупо.

Какое ваше мнение на этот счет?

★★

Неудобно. Если вдруг объект нужно удалить, необходимо копировать все объекты, которые уже получил через getter.

anonymous
()
Ответ на: комментарий от anonymous

Почему же? Если я предполагаю, что объект надо будет удалить, то вместо

const QString &s = obj->someGetter();
я напишу
QString s = obj->someGetter();
и эта проблема легко решается.

bk_ ★★
() автор топика

второй вариант - если надо просто доступ к полю, и первый - если надо абстракция

anonymous
()
Ответ на: комментарий от Reset

Что значит уберет? Конструктор же вызовется, а уже сам класс определяет, копировать сразу или делать copyonwrite.

bk_ ★★
() автор топика

Это немного разные механизмы. При повторной установке значения через сеттер, значение в первом варианте изменится, а во втором - нет.

anonymous
()
Ответ на: комментарий от gavv

ха, проверил примеры неработающего rvo в msvc, в gcc не работает только один:

RVO rvo;
rvo.mem_var = i;
if (rvo.mem_var == 10)
   return (RVO());
return (rvo);

gavv
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.