Есть ли принципиальная разница как обращаться к членам класса внутри методов этого же класса: через методы или напрямую? У меня сложилось такое мнение, что из собственных методов обращаемся напрямую по членам, а методы делаем чтобы обращаться из объектов. Смотрел следующий пример на msdn, в нем даже из собственных методов обращаются через методы. Я имею ввиду
Distance operator+(Distance& other)
{
return Distance(get_kilometers() + other.get_kilometers());
}
Зачем лишний раз вызывать функцию если можно обратиться к полю как есть?
struct Distance
{
private:
explicit Distance(long double val) : kilometers(val)
{}
friend Distance operator"" _km(long double val);
friend Distance operator"" _mi(long double val);
long double kilometers{ 0 };
public:
long double get_kilometers() { return kilometers; }
Distance operator+(Distance& other)
{
return Distance(get_kilometers() + other.get_kilometers());
}
};
Добавлю к предыдущим ораторам - get_kilometers() у вас в открытом интерфейсе, так что вряд ли кто-то пойдет на ее изменение (в серьезном проекте).
А вот внутреннее представление вы можете сами изменить. мало ли, станете хранить квадрат этой величины, или сделаете ее не long double, а чем-то иным.
Да, обращаясь внутри реализации к полю, вы ничего страшного для интерфейса не делаете. Но в случае каких-то изменений создаете лишнюю работу для себя - отслеживать и выявлять все такие обращения напрямую. Оно вам надо?
Косвенный вызов даже из внутренних функций позволяет сделать код более надёжным, т.к. уменьшает кол-во обращений к данным напрямую. Если вдруг с данными что-то пойдёт не так, мы всегда будем знать через какую точку (функцию) мы точно должны пройти. Собственно даже несмотря на то, что можно поставить точку останова на данные в отладчике, останов на функции работает обычно существенно быстрее.
При этом косвенный вызов таких простых функций доступа вполне легко может быть встроен inline, что не приведёт к какому-либо оверхеду в момент выполнения.
Чаще всего, для метода Set полезно проверять аргументы на валидность. Или блокировать Get в случае, если данные не были инициализированы.
Дополнительно, при дальнейшей работе вам придется вносить изменения в логику работы программы. То может пригодится тот факт, что все обращения к полю осуществляются через метод. Вы сможете быстро внести правки в логику не производя поиск всех прямых обращений к полю объекта.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости