Спецификаторы доступа. Понятие инкапсуляции. Отличие конструкций 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; // Не забываем освободить блоки, выделенные в динамической памяти

}

виды конструкторов:
-Конструктор с аргументами;

-Конструктор без аргументов:

Конструктор, не принимающий ни одного явного аргумента, называется КОНСТРУКТОРОМ ПО УМОЛЧАНИЮ

Если класс не содержит ни одного определенного пользователем конструктора, компилятор, в случае необходимости, сгенерирует конструктор по умолчанию автоматически. Следует различать случай ТРИВИАЛЬНОГО(конструктор не предполагает выполнения каких-либо инициализирующих действий вообще. ) и НЕТРИВИАЛЬНОГО(Смысл НЕТРИВИАЛЬНЫХ сгенерированных автоматически конструкторов состоит в обеспечении правил языка для случаев, когда в конструкторе должны неявно происходить дополнительные действия. ) автоматически сгенерированного конструктора по умолчанию.

Роль:

Неявные условия, которые всегда должны соблюдаться для полей класса, чтобы объект можно было считать корректным с точки зрения природы описываемого понятия, называются ИНВАРИАНТАМИ класса. Одной из важнейших обязанностей конструктора является обеспечение соблюдения инвариантов после инициализации объекта. Если в момент инициализации объекта конструктор убедится, что инвариантные условия в только что созданном объекте соблюдаются, в дальнейшем другие методы могут не беспокоиться о их соблюдении. Проверенный в конструкторе инвариант будет выполняться всегда, если никакой из методов не будет оставлять объект в несогласованном состоянии по своему завершению. Таким образом, проверив инвариантные условия при создании объекта и обеспечив их сохранность при любой модификации состояния объекта через его методы, можно получить стабильную абстракцию, всегда готовую корректно выполнять свои обязанности.

Наши рекомендации