C++ Инкапсуляция данных
Инкапсуляция данных — фундаментальная концепция объектно-ориентированного программирования (ООП), которая реализуется путем инкапсуляции данных и функций, работающих с этими данными, внутри класса. Эта инкапсуляция обеспечивает приватность и целостность данных, не позволяя внешнему коду напрямую обращаться к ним и изменять их.
Все программы на C++ имеют следующие два основных элемента:
- Операторы программы (код):Это части программы, которые выполняют действия; они называются функциями.
- Данные программы:Данные — это информация программы, на которую воздействуют функции программы.
Инкапсуляция — это концепция объектно-ориентированного программирования, которая связывает вместе данные и функции, работающие с этими данными, тем самым избегая вмешательства и неправильного использования из внешнего мира и обеспечивая безопасность. Инкапсуляция данных ведёт к другой важной концепции ООП, а именноСокрытие данных。
Инкапсуляция данных— это механизм, который связывает данные и функции, работающие с этими данными, вместе,Абстракция данных— это механизм, который предоставляет пользователям только интерфейс, скрывая конкретные детали реализации.
C++ через созданиеклассадля поддержки инкапсуляции и сокрытия данных (public, protected, private). Мы уже знаем, что классы содержат закрытые члены, защищённые члены и открытые члены. По умолчанию все элементы, определённые в классе, являются закрытыми. Например:
Переменные length, breadth и height являются закрытыми (private). Это означает, что к ним могут обращаться только другие члены класса Box, но не другие части программы. Это способ достижения инкапсуляции.
Чтобы сделать члены класса public (то есть доступными другим частям программы), перед этими членами необходимо использовать ключевое словоpublic. Все переменные или функции, определённые после идентификатора public, могут быть доступны всем другим функциям в программе.
Определение класса как дружественного класса другого класса раскрывает детали реализации, тем самым снижая инкапсуляцию. Идеальный подход — скрывать детали реализации каждого класса насколько возможно.
Модификаторы доступа:
- private: Приватные члены доступны только внутри класса и не могут быть напрямую доступны из кода вне класса.
- public: Публичные члены могут быть напрямую доступны из кода вне класса.
- protected: Защищённые члены доступны классу и его производным классам.
Пример инкапсуляции данных
В программе на C++ любой класс с публичными и приватными членами может служить примером инкапсуляции данных и абстракции данных. См. пример ниже:
Пример
Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:
Total 60
Приведённый выше класс складывает числа и возвращает сумму. Публичные членыaddNumиgetTotalявляются внешним интерфейсом; пользователям нужно знать их, чтобы использовать класс. Приватные членыtotalскрыты от внешнего мира; пользователям не нужно знать о них, но они необходимы для правильной работы класса.
Инкапсуляция данных реализуется через классы и модификаторы доступа (public, private, protected). Вот простой пример:
Пример
using namespace std;
class Student {
private:
string name;
int age;
public:
// конструктор
Student(string studentName, int studentAge) {
name = studentName;
age = studentAge;
}
// Функция доступа (геттер)
string getName() {
return name;
}
int getAge() {
return age;
}
// Функция-модификатор (сеттер)
void setName(string studentName) {
name = studentName;
}
void setAge(int studentAge) {
if (studentAge > 0) {
age = studentAge;
} else {
cout << "Недопустимый возраст!" << endl;
}
}
// Вывести информацию о студенте
void printInfo() {
cout << "Имя: " << name << ", Возраст: " << age << endl;
}
};
int main() {
// Создать объект Student
Student student1("Алиса", 20);
// Доступ и изменение данных
student1.printInfo();
student1.setName("Боб");
student1.setAge(22);
student1.printInfo();
return 0;
}
Стратегия проектирования
Обычно мы делаем состояния членов класса private, если только нам действительно не нужно их открывать, чтобы обеспечить хорошуюинкапсуляцию。
Обычно это относится к элементам данных, но также применимо ко всем членам, включая виртуальные функции.
Преимущества инкапсуляции данных
- Сокрытие данных: Объявляя элементы данных как private, внешний код лишается возможности напрямую обращаться к этим данным.
- Улучшение сопровождаемости кода: Предоставление public-методов для доступа и изменения данных позволяет изменять внутреннюю реализацию класса, не затрагивая внешний код.
- Повышение безопасности: Предотвращение недопустимого ввода данных и неправомерных операций изменения.
- Реализация абстракции: Предоставление механизма, позволяющего пользователям не разбираться во внутренних деталях реализации класса; им достаточно знать, как использовать public-интерфейс класса.