
- •2. Появление ооп: необходимость в трансформируемых типах данных.
- •3. Появление ооп: необходимость обеспечения распределения вычислений в пространстве и во времени. Основные идеи ооп.
- •Классы объектов
- •Инкапсуляция атрибутов и методов класса
- •Системы классов: агрегация и композиция
- •Создание объектов и задание их начальных состояний
- •27. Создание объектов класса, использующих объекты других классов в качестве членов-данных
- •Возможности прямого доступа к членам базового класса, обусловленных только размещение в секциях базового класса и вложением видимости.
- •На возможности прямого доступа к членам базового класса существенное влияние оказывают спецификаторы доступа.
- •Трансформация секций базового класса, обусловленная видом наследования.
- •Виды сценариев наследования
- •43. Сравнение видов полиморфизма
Создание объектов и задание их начальных состояний
2 Вопроса:
1) Какими средствами задаются объекты в классах С++?
2) Почему и как нужно проектировать конструкторы?
Тезисы:
1) Общие сведения о конструкторах считаются известными (УВП).
2) В дальнейшем изложении основное внимание будет уделено реализации модели ООП конструкторами С++.
Возможности конструкторов класса С++ для реализации модели ООП
1. Для создания объектов в С++ существуют средства, называемые конструкторами, которые создают некоторые сущности, называемые экземплярами класса.
2. Сущность, создаваемая конструктором, есть область памяти (С++ ориентирован на память),
- разделенная на части для размещения членов класса
- наделенная правилами системы типов (функция или данное принадлежит какому-либо типу)
- снабженное правилами доступа
3. Конструктор, создавая описанную сущность, устанавливает для нее отношение "быть экземпляром класса".
4. Конструктор класса С++
- может задавать значение всех членов-данных, т.е. задавать состояние объекта полностью
- может задавать значение части членов-данных, т.е. задавать состояние частично
- может не задавать никаких значений членов-данных
5. Предоставленный компилятором по умолчанию конструктор не задает целенаправленно значений членов-данных.
6. Если конструктор задает значения всех членов-данных, то он создает объект в смысле модели ООП и устанавливает отношение «быть объектом класса».
7. Для реализации модели ООП программист сам должен определять один или несколько конструкторов, задающих полностью состояние объекта.
8. С++ позволяет программисту задать как состояние объекта, так и способ формирования этого состояния.
9. В классе С++ может быть определено несколько конструкторов, что обеспечивается имеющимися в С++ правилами переопределения функций.
24. Создание объектов прямым заданием значений членов-данных
10. Конструктор С++ позволяет создавать объекты с прямым заданием значений членов-данных.
11. Прямое задание реализуется:
- непосредственным присвоением значений членам-данным, в теле конструктора без использования параметров конструктора.
- задание значений членов-данных с использованием параметров конструктора
- списки инициализации
Задание значений членов-данных с использованием списка инициализации.
Ситуация прямого задания характеризуется:
1) Отсутствием объекта того же или другого класса
2) В теле конструктора или в списке инициализации программист указывает и член - данное, и требуемое для него значение.
Способ задания |
Используемый объект |
Описание информации о значениях атрибутов значений |
Вид конструктора, реализующего способ задания |
Способ вызова конструктора |
Ссылка на примеры |
1 |
2 |
3 |
4 |
5 |
6 |
Прямое задание членов данных |
Отсутствует |
Единственный полный набор значений членов-данных |
Конструктор без параметров с присваиванием значений набора в теле конструктора |
Без параметров |
|
Полный набор без приоритетных значений |
С параметрами без значений по умолчанию |
С параметрами |
|
||
Полный набор значений параметров, но для части значений заданы приоритетные значений |
С параметрами, часть которых, после некоторого, имеет приоритетные значения |
С параметрами, все из которых после некоторого имеют значения по умолчанию |
|
||
Полный набор для всех имеется приоритетные значения |
С параметрами все имеют приоритетные значения |
С параметрами и без параметров |
|
25. Создание объектов копированием
12. Конструктор С++ может создать объект класса путем создания точной или измененной копии объекта того же класса.
13. Эта возможность реализуется путем создания программистом конструктора копирования, при этом параметров этого конструктора программист может добиться изменения полученной копии.
14. С++ позволяет программисту определить конструктор копирования с несколькими параметрами. При этом первый параметр должен иметь вид:
(1) имя_класса &имя_объекта
------------------ принадлежит тому же классу, что и конструктор
(2) const имя_класса &имя_объекта
Все последующие параметры списка должны должны обязательно иметь значение по умолчанию.
Если программист сам определяет конструктор копирования, то действия по копированию или по изменению он должен задать сам.
Предоставляемый компилятором по умолчанию конструктор копирования создает точную копию объекта путем побитового переписывания памяти.
Пример:
Class Point
{
int X; int Y;
//...
public:
Point () {X=1; Y=2;}
Point ( int X0, int Y0) {X=X0; Y=Y0;}
Point ( int X0): X(X0), Y(1) { }
Point ( const Point &Q, int Y0=0) {X=Q.X; Y=Q.Y;}
}
Способ задания |
Используемый объект |
Описание информации о значениях атрибутов значений |
Вид конструктора, реализующего способ задания |
Способ вызова конструктора |
Ссылка на примеры |
1 |
2 |
3 |
4 |
5 |
6 |
Копирование |
Того же класса |
Полный набор значений определяется копируемым объектов |
Конструктор копирования с одним значением – копируемым объектом |
С одним параметром |
|
Полный набор значений часть из которых определяется копируемым объектом, а часть из которых имеет приоритетные значения |
Копирования, с первым – копируемое значение, а остальные приоритетные значения |
С параметрами, первый – копируемый объект, а остальные со значениями по умолчанию. |
|
26. Создание объектов преобразованием
15. Программист имеет возможность создать объект класса путем преобразования объекта другого класса.
Пример: (тривиальный) конструктор преобразования объекта типа int в объект типа Point
Class Point
{
int X; int Y;
public:
Point ( int X0, int Y0);
}
Пример: (не тривиальный)
Class Point
{
int X; int Y;
public:
Point (Square S);
}
Class Square
{
Point P;
Unsigned int W;
Public:
Point GetP() { return P; }
}
Point :: Point (Square S) { X=S.GetP(); }
16. В конструкторе С++ можно осуществить защиту значений параметров с использованием спецификатора const.
17. Конструктор класса С++ не может иметь идентификатор const и не может иметь спецификатор static.
18. Конструктор класса С++ может иметь значение по умолчанию и в ООП это используется для задания приоритетных значений, определяемых содержанием задачи.
Способ задания |
Используемый объект |
Описание информации о значениях атрибутов значений |
Вид конструктора, реализующего способ задания |
Способ вызова конструктора |
Ссылка на примеры |
1 |
2 |
3 |
4 |
5 |
6 |
Преобразование объекта другого класса |
Объект другого класса |
Полный набор значений, задаваемый преобразуемым объектом |
Конструктор преобразования с одним значением – преобразуемым объектом |
С одним параметром |
|
Полный набор: часть значений задано преобразуемым объектом, часть по умолчанию |
Преобразования, с первым – преобразующее значение, а остальные приоритетные значения |
С параметрами, первый – преобразуемый объект, а остальные со значениями по умолчанию. |
|
||
Полный набор значений: часть задана преобразуемым объектом, часть без приоритетных значений, часть с приоритетными значениями |
Преобразования, первым параметром – преобразуемое значение, часть без приоритетных значений, часть со значениями по умолчанию. |
С параметрами: первый - преобразуемый объект, часть со значениями параметров, остальные со значениями по умолчанию. |
|
||
Полный набор: преобразуемый объект, остальные не имеют приоритетных значений |
Преобразования, первым параметром – преобразуемое значение, остальные приоритетных значений |
С параметрами: первый - преобразуемый объект, остальные со значениями параметров. |
|