Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
oop_answers.docx
Скачиваний:
3
Добавлен:
27.10.2018
Размер:
304.44 Кб
Скачать

Инкапсуляция в концептуальной модели ооп

1) Сосредоточение реализуется размещением соответствующих сущностей в пределах объекта или класса.

2) Сокрытие атрибутов и методов реализуется введением правил видимости атрибутов и методов в объекте или классе.

3) Правила видимости в концпетуальной модели ООП задаются двумя утверждениями:

а) Методы объекта или класса видимы для всех пользователей класса или объекта.

б) Атрибуты объекта или класса видимы только для тел методов этого объекта или класса.

4) Утверждение а) может быть понято всегда однозначно.

5) Утверждение б) может быть понято в двух смыслах. Рассмотрим пример на псевдоко-де:

Класс «Точка»

атрибуты:

integer x

integer y

методы:

переместить на Δx, Δy

movexΔyx, Δy): x x + Δx y y + Δy

переместить в точку (Точка p). p — в общем случае, другой объект того же класса «Точка»

moveToPt(Point pt) два подхода:

«чистый» подход

введем методы

integer get_x():return x

integer get_y():return y

и воспользуемся ими для доступа к значениям атрибутов x и y скрытых объекте класса «Точка»:

x pt.get_x()

y pt.get_y()

«грязный» подход

разрешим получать значения атрибутов другого объекта того же класса:

x pt.x

x pt.y

Вывод: оба примера реализации функции «переместить в точку» в точности следуют ут-верждению б). Однако особенность ситуации состоит в том, что функция вызывается для одного объекта, а передаваться ей может совсем другой объект того же класса. Что видит метод — все объекты класса или только тот объект, для которого он вызван? Разные ответы на этот вопрос порождают разные линии языков программирования, описываемые утверждениями.

а) В теле метода класса видимы атрибуты любого объекта класса, в том числе и того, для которого он вызван. Интерпретация: Это утверждение означает, что метод класса «знает» (= имеет прямой доступ к) любой атрибут из объектов данного класса, в частности, и того объекта, для которого вызван метод.

б) Метод класса «знает» только тот объект, для которого он вызван.

6) Утверждение 5а) задает уровень защиты на уровне класса.

7) Утверждение 5б) задает область видимости на уровне объекта.

8) Механизм защиты на уровне класса реализован в языке Simula. Механизм защиты на уровне объекта реализован в языке Smalltalk. Существуют целые группы языков между этими двумя крайностями. (Например, C++).

5 Содержание и структура определения класса в языке. С++: реализация концептуальной модели класса

Возможности (конструкции) языка C++, реализующие концептуальную модель ООП

1) Класс C++ есть тип данных, задаваемый программистом.

2) Класс является составным типом данных и может иметь составляющие, называемые членами класса.

3) Члены класса разделены на 2 категории:

а) члены-данные (атрибуты);

б) члены-функции (методы).

4) Члены-данные могут3 принимать значения, которые задают состояние объекта.

5) Членами-данными могут быть объекты других классов.

6) Члены-функции определяют набор действий, которые можно выполнить с объектами класса.

7) Члены-функции класса доступны любому методу этого класса.

8) Вне класса к классу не могут быть добавлены ни члены-функции, ни члены-данные.

9) Класс C++ снабжен методами создания объектов класса. Эти методы называются конструкторами класса.

10) Если программист не определил собственных средств создания класса, то язык пре-доставляет ему конструктор по умолчанию. Конструктор, предоставляемый по умолчанию, выделяет память под объект, но не задает никаких значений атрибутов (т.е., не выполняет инициализацию).

11) Конструктор, создавая объект, устанавливает отношение «быть объектом класса».

12) Класс в C++ снабжен средством уничтожения объекта класса. Этот метод называют деструктором класса. Деструктор может быть только один.

13) Исполнение деструктора ликвидирует отношение «быть объектом класса».

14) Если деструктор программистом не определен, вызывается деструктор, предоставляемый компилятором по умолчанию. Он выполняет только освобождение памяти, занятой под объект.

6 Содержание и структура определения класса в языке С++: развитие концептуальной модели класса

3 Заметим: именно что могут, а не должны, как в модели ООП.

4 См. п. 11) раздела 3.2 «Отношение наследования в языке C++».

Свойства языка C++, развивающие концептуальную модель ООП

1) Секции класса: private, public, protected.

2) Класс C++ может иметь несколько секций (раделов), начинающихся с метки private, public или protected.

3) Каждая секция задает режим (возможности доступа) к именам класса, размещенным в этой секции.

4) Секция с меткой public означает, что члены класса, размещенные в этой секции, дос-тупны всем пользователям класса.

5) Секция с меткой private включает члены класса, доступ к которым возможнен только со стороны членов-функций класса.

6) Секция с меткой protected предназначена для задания членов-данных, к которым орга-низуется эффективный доступ со стороны методов классов-наследников.4

7) Члены класса могут быть распределены по секциям в соответствии с желанием про-граммистов, с условием: каждый член класса может быть размещен в данной секции и во всех секциях вообще только один раз.

8) Класс языка C++ позволяет задать несколько средств создания объектов. Такие сред-ства называются конструкторами (ctors). сtorы позволяют создавать объекты в соот-ветствии с:

а) заданными параметрами (информацией о членах-данных);

б) условиями создания объекта;

в) условиями использования объекта.

9) Принципиально важно! Программист может определить ctor, однозначно задающий состояние объекта (и даже несколько ctorов).

Если программист не определил ни одного ctorа, то язык С++ предоставляет конструк-тор, называемый default constructor (конструктор, предоставляемый по умолчанию). Этот ctor предоставляется компилятором. Еще есть ctor, вызываемый по умолчанию (без прямого участия программиста) — это любой конструктор без параметров или с параметрами, все из которых имеют значе-ния по умолчанию.

10) ctor, предоставляемый по умолчанию, лишь выделяет память под объект, но ничего не инициализирует. Т.о, ctor, предоставляемый по умолчанию, создает экземпляр класса (instance), но не объект класса. (Экземпляр класса: состояние не определено; объект класса: состояние определено).

11) Класс C++ может иметь несколько ctor-ов, задаваемых программистом, в том числе — ctor, предоставляемый по умолчанию. Их количество определяется структурой членов-данных и той информацией, которая доступна при создании объекта. ctorы подчиняются правилам перегрузки функций класса: они различаются по сигнатуре.

Определение 4

Сигнатурой метода в C++ называется совокупность имени метода и последова-тельности имен типов входных параметров этого метода. Возвращаемое значение в сигнатуру не входит.

12) Язык C++ позволяет программисту задать средство разрушения объектов — деструктор (dtor). Деструктор может быть в классе только один. Деструктор не имеет параметров, поскольку может быть вызван и без непосредственного участия программиста.

13) Среди членов-данных м.б. члены-данные, общие для всех объектов класса (ЧДОДВОКи). Такие члены-данные существуют даже тогда, когда ни одного объекта класса не существует. Они могут применяться, например, для организации механизма под-счета ссылок (reference counting), в качестве отладочных переключателей и т.д.

14) В составе членов-функций класса м.б. функции для обработки ЧДОДВОКов.

7 Реализация членов-данных класса в языке С++

1) Конструкция становится членом-данным, если ее объявление размещается в какой-либо секции класса.

2) Член-данное представляет собой определение переменной, которое есть сочетание ти-па и имени.

Формат члена-данного: имя_типа имя_данного;

Например:

double x; // абсцисса точки

double y; // ордината точки

double r; // длина радиус-вектора, r >= 0

double phi; // полярный угол, \phi \in [0, 2\pi]

3) В качестве типов членов данных могут использоваться:

а) предопределенный тип языка;

б) класс, определенный пользователем;

в) указатель на предопределенный тип или класс;

г) ссылка на предопределенный тип или класс.

4) Использование указателя или ссылки не требует определение класса, достаточно толь-ко объявление класса.

5) При объявлении члена-данного, как члена класса инициализация невозможна кроме случая, когда инициализируется константный член-данное целого типа:

class Point {

const int i = 8; // можно!

double x = 1.0; // нельзя

};

6) В остальных случаях члены-данные могут быть инициализированы только конструктором.

7) Потенциальные пользователи члена-данного могут быть

а) члены-функции своего класса;

б) другие функции, не принадлежащие этому классу.

8) Члены-функции класса имеют прямой доступ к членам-данным своего класса. Это означает, что в телах этих функций обращение к члену-данному осуществляется только с использованием его имени.

9) Функции, не принадлежащие классу, в котором определен член-данное могут обращаться к этому данному только в том случае, если им разрешен доступ.

10) Уровень доступа определяет метка секции в которой определен член-данное:

а) в открытой — разрешен доступ для любой функции;

б) в защищенной — из функций, не принадлежащих этому классу, к нему имеет доступ только функции классов наследников;

в) в закрытой — не имеет никакого доступа ф-ия, не принадлежащая этому классу.

11) Обращение к члену-данному, если это обращение разрешает уровень доступа, внешних функций осуществляется двумя способами:

а) с использованием оператора селекции .;

б) с использованием оператора селекции ->.

Для реализации первого способа нужно знать имя, а второго — указатель на этот экземпляр.

8 Реализация членов-функций класса в языке C++. Указатель this: назначение и использование

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