Есть ли принципиальная разница как обращаться к членам класса внутри методов этого же класса: через методы или напрямую? У меня сложилось такое мнение, что из собственных методов обращаемся напрямую по членам, а методы делаем чтобы обращаться из объектов. Смотрел следующий пример на 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 в случае, если данные не были инициализированы.
Дополнительно, при дальнейшей работе вам придется вносить изменения в логику работы программы. То может пригодится тот факт, что все обращения к полю осуществляются через метод. Вы сможете быстро внести правки в логику не производя поиск всех прямых обращений к полю объекта.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Пытаюсь с помощью данной функции пытаюсь открыть приложение(путь указан верно, вместе с расширениемexe):
Есть массив, данные в котором меняются в цикле и в этом же цикле выводятсяНужно записать в csv файл этот массив с разными данными в столбики...
Не могу понять, почему в вот таком классе возникает ошибка:
Я создал класс матриц и перегрузил для него операцию ++ (прибавление к матрице единичной матрицы), но почему то программа не работает, при запуске...