Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_otvety_k_ekzamenu.doc
Скачиваний:
55
Добавлен:
13.04.2015
Размер:
786.94 Кб
Скачать

3. Спецификаторы доступа. Понятие инкапсуляции. Отличие конструкций class и struct. Методы доступа.

Сокрытие деталей реализации абстракции от клиентского кода, отделение интерфейса от реализации называется ИНКАПСУЛЯЦИЕЙ.

В С++ инкапсуляция деталей реализации осуществляется при помощи СПЕЦИФИКАТОРОВ ДОСТУПА public и private. Спецификаторы разделяют описание абстракции на доступные и закрытые части соответственно. Доступная публичная часть (public) разрешает обращение к переменным-членам и функциям-членам для любой части программы. Закрытая частная часть (private) может быть задействована только функциями-членами, входящими в состав структуры. Помимо защиты абстракции от разрушения, эффект от инкапсуляции состоит в четком разделении обязанностей между частями кода.

Отличие класса от структуры с функциями-членами состоит лишь в единственном пункте - спецификаторе доступа по умолчанию, т.е. уровне доступа, который получит переменная или функция-член, если никакого спецификатора доступа не указано.

Методы предоставляют интерфейс, при помощи которого осуществляется доступ к данным объекта некоторого класса, тем самым, обеспечивая инкапсуляцию данных.

есть 2 типа - простые методы и статические методы

простые методы имеют доступ к данным объекта (конкретного экземпляра данного класса),

статические методы не имеют доступа к данным объекта и для их использования не нужно создавать экземпляры (данного класса).

4. Конструкторы классов, синтаксис, разновидности, моменты вызова конструкторов. Роль конструкторов в соблюдении инвариантов классов.

С целью обеспечения гарантированного и безошибочного достижения корректного начального внутреннего состояния объектов, в классах определяют КОНСТРУКТОРЫ (constructors).

Конструктор представляет собой особую разновидность функции-члена, называемую идентично имени родительского класса и не имеющую никакого возвращаемого типа.Цель конструктора - инициализация содержимого объекта, обеспечение корректного начального состояния. При этом, средой выполнения гарантируется:

  1. Автоматический вызов конструктора при создании объекта до его первого использования.

  2. Однократность вызова конструктора на протяжении жизни объекта.

синтаксис: class Point

{

public:

// Объявление конструктора

Point ();

double GetX () const;

double GetY () const;

private:

double m_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. Локальный автоматический объект (выделяется на стеке):

int main ()

{

Stack s( 10 ); // Компилятор вызовет конструктор в этой точке:

// Stack::Stack( & s, 10 );

// ...

}

3. Локальный статический объект (выделяется в сегменте данных):

void f ()

{

static Stack s( 10 ); // Компилятор вызовет конструктор в этой точке:

// Stack::Stack( & s, 10 );

// но лишь при первом вызове функции f()!

// ...

}

int main ()

{

f();

f(); }

4. Объект в динамической памяти:

int main ()

{

Stack * pStack = new Stack( 10 ); // Компилятор вызовет конструктор сразу после выделения памяти:

// Stack * pStack = ( Stack * ) ::operator new( sizeof( Stack) )

// Stack::Stack( pStack, 10 );

// ...

delete pStack; // Не забываем освободить блоки, выделенные в динамической памяти

}

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

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

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

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

Роль:

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]