Хотя стандартные методы получения и установки, такие как метод 1, могут обеспечивать «инкапсуляцию», если эти функции не встроены в заголовок, они добавляют много накладных расходов. Например, в тесном цикле, даже если вы использовали ссылки, а не передачу по значению (что затем требует дорогостоящей операции копирования памяти), постоянно приходится добавлять около восьми инструкций в x86 для каждого вызова метода получения / установки в порядке настройка записи активации в стеке, а также пролог и эпилог функции расходуют ценное время процессора и действительно снижают производительность. Поскольку вы добытчик, а сеттеры мало что делают, они вам действительно не нужны.
Метод 2 на самом деле то, что делают несколько контейнеров STL, например std::vector
с operator[]
, где вы перегружаете одну и ту же функцию, но определяете одну для постоянных операций, а другую для непостоянных операций ... но Опять же, вы добавляете ненужные накладные расходы, когда вы можете просто публично получить доступ к элементу данных (т. е. вы не похожи на некоторые базовые указатели и другие элементы данных, управляемые памятью, от нас, такие как контейнер STL). Если функция, которой вы передаете ее, требует постоянной ссылки, она все равно не изменит члена, поэтому на самом деле нет необходимости создавать подобный интерфейс, если вы не пытаетесь создать общий интерфейс для доступа к члену через хост классов. И если вы делаете это, то вам следует изучить чисто виртуальный базовый класс, чтобы определить общий интерфейс.