Файл: 3. Создание и использование объектов. Объектные переменные.pdf
ВУЗ: Университет управления «ТИСБИ»
Категория: Учебное пособие
Дисциплина: Объектно-ориентированное программирование
Добавлен: 20.10.2018
Просмотров: 809
Скачиваний: 21
3. Создание и использование объектов. Объектные переменные
Для использования стандартных или собственных классов прежде всего
необходимо объявить одну или несколько объектных переменных. Для
каждой переменной вводится
уникальное имя и указывается
принадлежность к одному из известных классов. Это позволяет называть
объектные переменные переменными классового типа.
В языках Java, C#, Delphi/Free Pascal объектные переменные являются
неявными, скрытыми указателями на размещаемые в памяти объекты.
Как известно, значениями указательных переменных являются адреса
областей
памяти.
Техника
работы
с
адресными
переменными
использовалась и в обычных языках (Си, Паскаль), а для объектных
программ она является основной. В отличие от языка С++, где с адресными
переменными можно делать практически все что угодно, в более поздних
языках реализован только тот набор операций, который делает
использование адресов более безопасным.
На наш взгляд, имеет смысл различать понятия «объект» и «объектная
переменная». Под объектом будем понимать область памяти, динамически
выделенную для хранения значений свойств объекта и некоторой
дополнительной информации. Объектная переменная используется для
адресации этой области и позволяет организовать доступ к находящейся в
ней информации.
Адресный характер объектных переменных позволяет реализовать
много интересных возможностей, прежде всего связанных с принципом
полиморфизма, но в то же время увеличивает вероятность возникновения
объектная переменная
адрес объекта
объект
значение свойства 1
значение свойства 2
. . . . . . . . . .
значение свойства N
ошибок времени выполнения и поэтому требует очень тщательной отладки
программы.
Необходимо понимать, что объявление объектной переменной НЕ
означает установку ее значения в некоторый адрес. Компилятор выделяет
память только для самой объектной переменной, но НЕ для адресуемого с ее
помощью объекта. Установка адресного значения объектной переменной
происходит только при создании объекта! А для этого требуется вызов
конструктора класса. Только после этого объектная переменная может
использоваться для вызова методов адресуемого ею объекта. Этот вызов
реализуется с использованием имени объектной переменной и имени
метода.
Интересной (и перспективной, как будет ясно из дальнейшего)
возможностью является объединение отдельных объектных переменных в
единую структуру – массив или динамический список. Например, массив
объектных переменных содержит указатели на размещенные в разных
областях памяти объекты и позволяет обрабатывать набор объектов с
помощью циклов.
Приведем примеры объявления и использования объектных
переменных.
3.1. Язык Delphi/Free Pascal
Шаг 1. Объявление объектной переменной (ОП): указывается имя одной
или нескольких переменных и через двоеточие – имя класса
var ИмяОП : ИмяКласса;
Пример объявления переменных для управления объектами-окружностями
(класс TCircle):
var MyCirc1, MyCirc2 : TCircle;
Шаг 2. Создание объекта с помощью конструктора:
Реализуется в виде оператора присваивания, в левой части которого
указывается объявленная ранее объектная переменная, а в правой – имя
класса и через точку – имя конструктора
ИмяОП := ИмяКласса.Конструктор(параметры);
Пример: создание двух объектов-окружностей – одна с параметрами по
умолчанию, другая – с заданными в конструкторе параметрами:
MyCirc1 := TCircle.Create;
MyCirc2 := TCircle.Create (200, 100, 50);
Шаг 3. Вызов методов объекта:
ИмяОП.ИмяМетода(параметры);
Пример для объектов-окружностей
MyCirc1.Show; // отображение окружности
MyCirc1.MoveTo(100, 100); // перемещение окружности
Length := 6.28*MyCirc.GetR; // подсчет длины окружности
Пример объявления и использования массива объектных переменных-
указателей на окружности:
var ArrOfCircs : array [1.. 100] of TCircle;
for i := 1 to 100 do ArrOfCircs[ i ] := TCircle.Create (параметры);
for i := 1 to 100 do ArrOfCircs[ i ].Show; // отображение всех окр-тей
Пример для объектов класса Студент:
Шаг 1:
var Stud : TStudent; // объявление объектной переменной
Шаг 2:
Stud := TStudent.Create('Козин'); // создание объекта-студента
Шаг 3:(консольный вариант)
Stud.AddOcenky(5);
// добавление оценок
Stud.AddOcenky(3);
Stud.AddOcenky(2);
Stud.SetOcenky(3, 4);
// изменение третьей оценки
Writeln (Stud.GetKol);
// вывод числа оценок
Writeln (Stud.SredBall);
// вывод среднего балла
Writeln (Stud.GetOcenky(2));
// вывод второй оценки
Stud.SetFam ('Иванов');
// изменение фамилии
Пример для МАССИВА объектов класса Студент:
var Gruppa : array [1..20] of TStudent; // объявление массива ссылок
Gruppa[1] := TStudent.Create('Иванов'); // создание объектов-студентов
Gruppa[2] := TStudent.Create('Петров');
. . . . . . . . . .
Gruppa[ i ].AddOcenky(5);
// добавление оценок студенту i
. . . . . . . . . .
for i := 1 to 20 do
Writeln (Gruppa[ i ].SredBall); // вывод среднего балла всех студентов
Writeln (Gruppa[ i ].GetKol);
// вывод числа оценок студента i
Writeln (Gruppa[ i ].GetOcenky( j ));
// вывод оценки j студента i
3.2. Языки Java и C#
Шаг 1. Объявление: указывается имя класса и через пробел(ы) – имя одной
или нескольких переменных
ИмяКласса ИмяОП;
Пример для класса окружностей:
Circle MyCirc1, MyCirc2;
Шаг 2. Создание с помощью конструктора: реализуется в виде оператора
присваивания, слева – имя объектной переменной, справа – специальное
ключевое слово new и затем – имя конструктора (возможно - с
параметрами), совпадающее с именем класса
ИмяОП = new Конструктор( );
Пример для класса окружностей:
MyCirc1 = new Circle( ); // вызов конструктора без параметров
MyCirc2 = new Circle(200, 100, 50); // конструктор с параметрами
Оба языка позволяют шаги 1 и 2 объединить вместе, т.е. в одной
конструкции выполнить объявление объектной переменной и ее
инициализацию (создание объекта):
ИмяКласса ИмяОП = new Конструктор( );
Circle MyCirc = new Circle(100, 100, 100);
Шаг 3. Вызов методов
ИмяОП.ИмяМетода(параметры);
Пример для объектов-окружностей
MyCirc1.Show( ); // отображение окружности
MyCirc1.MoveTo(100, 100); // перемещение окружности
Length = 6.28*MyCirc.GetR( ); // подсчет длины окружности
Пример объявления и использования массива объектных переменных-
указателей на окружности (важно: в этих языках массивы сами являются
объектами и поэтому должны создаваться динамически с помощью
операции new):
Circle[ ] Circs; // объявление массива
Circs = new Circle[100]; // создание массива на 100 указателей
Circs[ i ] = MyCirc1; // занесение в массив существующего объекта
Circs[ i ] = new Circle (100, 100, 50); // создание и занесение нового
Пример для объектов класса Студент:
Student Stud; // объявление объектной переменной
Stud = new Student('Козин'); // создание объекта-студента
Stud.AddOcenky(5);
// добавление оценок