Спецификаторы доступа. Понятие инкапсуляции. Отличие конструкций class и struct. Методы доступа
Сокрытие деталей реализации абстракции от клиентского кода, отделение интерфейса от реализации называется ИНКАПСУЛЯЦИЕЙ.
В С++ инкапсуляция деталей реализации осуществляется при помощи СПЕЦИФИКАТОРОВ ДОСТУПА public и private. Спецификаторы разделяют описание абстракции на доступные и закрытые части соответственно. Доступная публичная часть (public) разрешает обращение к переменным-членам и функциям-членам для любой части программы. Закрытая частная часть (private) может быть задействована только функциями-членами, входящими в состав структуры. Помимо защиты абстракции от разрушения, эффект от инкапсуляции состоит в четком разделении обязанностей между частями кода.
Отличие класса от структуры с функциями-членами состоит лишь в единственном пункте - спецификаторе доступа по умолчанию, т.е. уровне доступа, который получит переменная или функция-член, если никакого спецификатора доступа не указано.
Методы предоставляют интерфейс, при помощи которого осуществляется доступ к данным объекта некоторого класса, тем самым, обеспечивая инкапсуляцию данных.
есть 2 типа - простые методы и статические методы
простые методы имеют доступ к данным объекта (конкретного экземпляра данного класса),
статические методы не имеют доступа к данным объекта и для их использования не нужно создавать экземпляры (данного класса).
Конструкторы классов, синтаксис, разновидности, моменты вызова конструкторов. Роль конструкторов в соблюдении инвариантов классов.
С целью обеспечения гарантированного и безошибочного достижения корректного начального внутреннего состояния объектов, в классах определяют КОНСТРУКТОРЫ (constructors).
Конструктор представляет собой особую разновидность функции-члена, называемую идентично имени родительского класса и не имеющую никакого возвращаемого типа.Цель конструктора - инициализация содержимого объекта, обеспечение корректного начального состояния. При этом, средой выполнения гарантируется:
1. Автоматический вызов конструктора при создании объекта до его первого использования.
2. Однократность вызова конструктора на протяжении жизни объекта.
синтаксис:
classPoint
{
public:
// Объявление конструктора
Point ();
doubleGetX () const;
doubleGetY () const;
private:
doublem_x, m_y;
};
// Определение конструктора
Point::Point ()
{
m_x = m_y = 0.0;
}
момент вызова:
Вызывать конструктор в явном виде не нужно. Компилятор разместит вызов конструктора объекта автоматически сразу после выделения памяти для хранения объекта. Точный момент вызова конструктора зависит от целевого сегмента памяти. Возможны такие сценарии:
1. Глобальный объект (выделяется в сегменте данных):
Stack g_Stack( 10 ); // Вызов констуктора произойдет до начала функции main()
// Stack::Stack( & g_Stack, 10 );
int main ()
{
// ...
}
2. Локальный автоматический объект (выделяется на стеке):
intmain ()
{
Stack s( 10 ); // Компилятор вызовет конструктор в этой точке:
// Stack::Stack( & s, 10 );
// ...
}
3. Локальный статический объект (выделяется в сегменте данных):
voidf ()
{
staticStack s( 10 ); // Компилятор вызовет конструктор в этой точке:
// Stack::Stack( & s, 10 );
// но лишь при первом вызове функции f()!
// ...
}
intmain ()
{
f();
f();
}
4. Объект в динамической памяти:
intmain ()
{
Stack * pStack = newStack( 10 );
// Компилятор вызовет конструктор сразу после выделения памяти:
// Stack * pStack = ( Stack * ) ::operator new( sizeof( Stack) )
//Stack::Stack( pStack, 10 );
// ...
delete pStack; // Не забываем освободить блоки, выделенные в динамической памяти
}
виды конструкторов:
-Конструктор с аргументами;
-Конструктор без аргументов:
Конструктор, не принимающий ни одного явного аргумента, называется КОНСТРУКТОРОМ ПО УМОЛЧАНИЮ
Если класс не содержит ни одного определенного пользователем конструктора, компилятор, в случае необходимости, сгенерирует конструктор по умолчанию автоматически. Следует различать случай ТРИВИАЛЬНОГО(конструктор не предполагает выполнения каких-либо инициализирующих действий вообще. ) и НЕТРИВИАЛЬНОГО(Смысл НЕТРИВИАЛЬНЫХ сгенерированных автоматически конструкторов состоит в обеспечении правил языка для случаев, когда в конструкторе должны неявно происходить дополнительные действия. ) автоматически сгенерированного конструктора по умолчанию.
Роль:
Неявные условия, которые всегда должны соблюдаться для полей класса, чтобы объект можно было считать корректным с точки зрения природы описываемого понятия, называются ИНВАРИАНТАМИ класса. Одной из важнейших обязанностей конструктора является обеспечение соблюдения инвариантов после инициализации объекта. Если в момент инициализации объекта конструктор убедится, что инвариантные условия в только что созданном объекте соблюдаются, в дальнейшем другие методы могут не беспокоиться о их соблюдении. Проверенный в конструкторе инвариант будет выполняться всегда, если никакой из методов не будет оставлять объект в несогласованном состоянии по своему завершению. Таким образом, проверив инвариантные условия при создании объекта и обеспечив их сохранность при любой модификации состояния объекта через его методы, можно получить стабильную абстракцию, всегда готовую корректно выполнять свои обязанности.