Вопрос 1
Для подробного объяснения предположим, что я пишу простой класс вектора с такими методами, как push_back, Insert и оператор []. Если бы я следовал алгоритму Мейерса, я бы получил все дружественные функции, не являющиеся членами. У меня будет векторный класс с небольшим количеством частных членов и множеством дружественных функций, не являющихся членами. Он об этом говорит?
Вопрос 2
Я до сих пор не понимаю, как функции, не являющиеся членами, улучшают инкапсуляцию. Рассмотрим код, приведенный в статье Мейерса.
Код: Выделить всё
class Point {
public:
int getXValue() const;
int getYValue() const;
void setXValue(int newXValue);
void setYValue(int newYValue);
private:
... // whatever...
};
Теперь мы увидели, что разумный способ
оценить степень инкапсуляции
в классе — это подсчитать количество
функций, которые могут быть нарушены, если
реализация класса изменится.
Пока мы не сохраним сигнатуру метода при изменении реализации класса, ни один клиентский код не сломается и он хорошо инкапсулирован, верно? То же самое относится и к функциям, не являющимся членами. Так какое же преимущество дает функция, не являющаяся членом?
Вопрос 3
Цитируем его алгоритм
Код: Выделить всё
else if (f needs type conversions
on its left-most argument)
{
make f a non-member function;
if (f needs access to non-public
members of C)
make f a friend of C;
}
В статье он также говорит следующее.
Более того, теперь мы видим, что
распространенное утверждение о том, что «дружественные функции
нарушают инкапсуляцию» не совсем
верно. Друзья не нарушают
инкапсуляцию, они просто уменьшают ее —
точно так же, как и функции-члены
.
Этот и приведенный выше алгоритм противоречат друг другу, не так ли?
Подробнее здесь: https://stackoverflow.com/questions/169 ... apsulation
Мобильная версия