При первом знакомстве со стуртурами мы получили возможность объединять данные, оставляя их доступными к изменению извне. Также функция length было объявленная как функция в объекту Segment. Что если поместить реализацию этой функции в структуру, тем самым сделав ее неотъемлемой частью структуры и “скрыв” из глобального списка функций (другими словами зачем нам эта отдельная глобальная функция, если она применима только Segment)? Реализовать это можно следующим образом (поместив реализация функции в тело struct)
struct Segment {
Point p1;
Point p2;
double length() {
double dx = p1.x – p2.x;
double dy = p1.y – p2.y;
return sqrt(dx * dx + dy * dy);
}
};
В примере мы поместили реализацию функции. Можно описать короткое объявление структуры, поместив реализацию функции length вне её:
struct Segment {
Point p1;
Point p2;
double length();
};
double Segment::length() {
double dx = p1.x – p2.x;
double dy = p1.y – p2.y;
return sqrt(dx * dx + dy * dy);
}
Из примера видно, что чтобы поместить реализцаию функции структуры нужно соблюсти соответствующий формат, а именно: возвращаемый_тип имя_структуры::имя_функции(параметры)
Оба примера равнозначны и употребимы. Какой из них выбрать зависит от желания разработчика или от правил форматирования кода. Например, если реализация функции состоит из 1-2 строк, то ее можно реализоавать в месте объявленяи. Если реализация много-строчна, то вынести, а в структуре оставить только объявление.
В данном примере мы рассмотрели первый пример инкапсуляции (или скорытия реализцаии). В общем инкапсуляция является фундаментом объектного подхода к разработке ПО, в процессе которого данные объекта и детали реализации скрываются в самом объекте.
Следуя данному подходу, программист рассматривает задачу в терминах предметной области, а создаваемый им продукт видит как совокупность абстрактных сущностей – классов (в свою очередь формально являющихся пользовательскими типами). Инкапсуляция предотвращает прямой доступ к внутреннему представлению класса из других классов и функций программы.
Без нее теряют смысл остальные основополагающие принципы объектно-ориентированного программирования (ООП): наследование и полиморфизм (будут рассмотрены позже).
Сущность инкапсуляции можно отразить формулой: открытый интерфейс + скрытая реализация