Я использую это эмпирическое правило:
Настолько Ваш близок. Я сделал бы что-то как:
РЕДАКТИРОВАНИЕ : Обновленный исходный пример на основе обратной связи ниже.
<ITEM serialNumber="something">
<BARCODE encoding="Code39">something</BARCODE>
<LOCATION>XYX</LOCATION>
<TYPE modelNumber="something">
<VENDOR>YYZ</VENDOR>
</TYPE>
</ITEM>
Я бы не стал этого делать:
double& state() { return m_state; }
Вы также можете сделать m_state
публичным, если вы это сделаете. Вероятно, наиболее разумным является следующее:
const double & state() const { return m_state; }
Опять же, когда вы говорите о сохранении копии 64-битной переменной (то есть микрооптимизации) и о том факте, что последняя версия может быть преобразована во все, что вы хотите, я просто скопировал бы его:
double state() const { return m_state; }
(в любом случае нет никакой реальной защиты)
Имеет смысл просто возвращать двойное значение. Потому что вы не возвращаете ссылку на более сложный объект. Вероятно, это будет сделано в регистрах, поэтому это будет немного быстрее. Если вы действительно хотите вернуть ссылку, сделайте ее const const.
Практическое правило: простые типы просто возвращают их. Объекты - по ссылке. Все остальное - ненужная сложность.
Для чего-то вроде двойного подойдет просто выполнение double state () const {...}
, копирование выполняется быстро, вам и вызывающему не нужно беспокоиться о том, можно ли изменить возвращаемое значение, и его можно вызвать из константной или неконстантной ссылки на объект.
Для чего-то более сложного, например object это действительно зависит от того, хотите ли вы, чтобы вызывающий имел возможность изменять его, возможно, вы хотите, чтобы они могли вызывать неконстантные члены, если они получают объект. В таком случае MyClass & state () const {...}
- ваш лучший выбор.
Вы пытаетесь создать свойство, подобное структуре? Если да, то почему бы вам не использовать getState ()
и setState (...)
?
В других ответах рассматривались последствия любого подхода для удобства чтения и гигиены кода.
Что касается производительности на современных архитектурах x86, если функция является встроенной, в любом случае это не имеет значения. Если функция не является встроенной, существует tiny преимущество в возврате double
, а не const double &
, потому что double просто возвращается в регистре, тогда как ссылка возвращает указатель, который затем должен быть загружен. Но стоимость одного цикла полностью перекрывается штрафом за наличие не встроенной функции.
Я бы сказал, что предпочтительнее вторая версия:
const double& state() const { return m_state; } // returns const double&
просто потому, что она согласуется с тем, как вы бы написали этот тип функции, если бы возвращаемое значение было более сложным. В вашем случае ни одна из версий в любом случае не будет быстрее и безопаснее другой.
Мои предложения:
Никогда не возвращайте дескриптор закрытых данных класса через открытый интерфейс, чтобы убедиться, что клиент не может его изменить.
Ознакомьтесь с эффективной темой C ++ на это Скотт Майерс.
Практическое правило:
значение
ссылка на константу
Применяется следующее предостережение: если вы знаете, что такое POD (обычные старые данные), и у вас есть один разумного размера, вы можете вернуть его, указав значение
.