Файл: 3. Создание и использование объектов. Объектные переменные.pdf
ВУЗ: Университет управления «ТИСБИ»
Категория: Учебное пособие
Дисциплина: Объектно-ориентированное программирование
Добавлен: 20.10.2018
Просмотров: 812
Скачиваний: 21
Stud.AddOcenky(3);
Stud.AddOcenky(2);
Stud.SetOcenky(3, 4);
// изменение третьей оценки
Console.WriteLine (Stud.GetKol);
// вывод числа оценок
Console.WriteLine (Stud.SredBall);
// вывод среднего балла
Console.WriteLine (Stud.GetOcenky(2));
// вывод второй оценки
Stud.SetFam ('Иванов');
// изменение фамилии
Пример для МАССИВА объектов класса Студент:
Шаг 1:
Student [ ] Gruppa; // объявление массива ссылок
Шаг 2: создание объекта-массива и заполнение его ссылками
Gruppa = new Student [20] ;
Gruppa[0] = new Student ('Иванов'); // создание объектов-студентов
Gruppa[1] = new Student ('Петров');
. . . . . . . . . .
Шаг 3:
Gruppa[ i ].AddOcenky(5);
// добавление оценок студенту i
. . . . . . . . . .
Console.WriteLine (Gruppa[ i ].GetKol); // вывод числа оценок студента i
Console.WriteLine (Gruppa[ i ].GetOcenky( j )); // вывод оценки j студента i
3.3. Язык С++
Работа с объектами в этом языке немного отличается от других языков.
Наравне с динамически создаваемыми объектами можно использовать
статические объекты, для доступа к которым не требуется использовать
указательные переменные.
Для статического создания объекта достаточно объявить одну или
несколько переменных соответствующего классового типа:
Circle Circ1, Circ2;
При обработке этой строки компилятор включает в создаваемый код
обращение к конструктору без параметров, поэтому объекты создаются с
заранее заданными значениями свойств. При необходимости вместо
конструктора без параметров можно вызвать конструктор с параметрами,
например, следующим образом:
Circle Circ3 (50, 50, 20);
При обработке этой строки компилятор анализирует входные значения
(их количество и тип) и включает код для вызова подходящего
конструктора. После такого неявного создания объектов можно эти объекты
использовать, обращаясь к их методам:
Circ1.Show ( ); // отобразить объект Circ1
Circ3.MoveTo (100, 100); // переместить объект Circ3
int r = Circ3.GetR ( ); // запросить радиус объекта Circ3
Для динамического создания объектов, прежде всего, необходимо
объявить ссылочную переменную:
Circle *pCirc1;
При обработке этой строки компилятор выделяет память только для
хранения адреса будущего объекта. После этого записывается строка для
динамического создания объекта, причем для выделения памяти
используется стандартная функция new, a для инициализации выделенной
области явно вызывается один из конструкторов класса:
pCirc1 = new Circle ( );
При необходимости объявление объектной переменной и вызов
конструктора можно объединить в одной строке:
Circle *pCirc1 = new Circle ( );
Вызов методов динамических объектов выполняется следующим
образом:
pCircle -> Show ( ); // отобразить
pCircle -> MoveTo (200, 200); // переместить
int Rad = pCirc2 -> GetRad ( ); // получить радиус
После рассмотрения особенностей объявления объектных переменных
надо вернуться к общим вопросам использования таких переменных.
Корректная работа с объектными переменными требует соблюдения ряда
правил, связанных с адресным характером этих переменных. Для объектных
переменных определены две основные операции:
присваивание значения одной переменной другой
сравнение значений двух переменных
Особенности использования операции присваивания:
обе переменные должны относиться к одному классу (далее, при
изучении полиморфизма, это требование будет ослаблено)
переменная в правой части должна иметь некоторое значение (как
известно, это относится к любым операциям присваивания)
присваивание выполняется на уровне адресных значений
объектных переменных, т.е. после выполнения операции ОБЕ
переменные будут адресовать одну и ту же область памяти;
никакого копирования объекта НЕ происходит!
переменной любого классового типа можно присвоить нулевое
(пустое)
адресное
значение,
для
чего
используются
ОП 1
адрес объекта
объект
значение свойства 1
значение свойства 2
. . . . . . . . . .
значение свойства N
ОП 2
адрес объекта
зарезервированные слова null (языки Java, C#, C++) или nil
(Delphi/Free Pascal); после этого объектную переменную НЕЛЬЗЯ
использовать для вызова методов
Примеры для графических объектов.
Delphi/Free Pascal
var Circ1, Circ2 : TCircle;
Rect1, Rect2 : TRectangle;
. . . . .
Circ1 := TCircle.Create(200, 100, 50);
Circ2 := Circ1; // обе переменные адресуют одну и ту же окружность
Circ1 := nil; // а теперь Circ1 ничего не адресует
Rect2 := Rect1; // ОШИБКА: переменная Rect1 не установлена!
Rect1 := Circ2; // ОШИБКА: переменные РАЗНЫХ классовых типов!
Rect2 := nil; // а так можно
Rect2.Show; // ОШИБКА: Rect2 НИЧЕГО не адресует!
Java и C#
Circle Circ1 = new Circle(200, 100, 50);
Circle Circ2 = Circ1; // обе переменные адресуют одну и ту же окр-ть
Circ1 = null; // а теперь Circ1 ничего не адресует
Rectangle Rect1, Rect2; // только объявили, объекты не созданы
Rect1.Show( ); // ОШИБКА: переменная Rect1 НЕ инициализирована
Rect1 = Circ2; // ОШИБКА: переменные РАЗНЫХ классовых типов!
Rect2 = null; // а так можно
Rect2.Show( ); // ОШИБКА: Rect2 НИЧЕГО не адресует!
Особенности использования операции сравнения:
две объектные переменные можно сравнивать только на
равенство или неравенство (операции сравнения типа «больше-
меньше» не разрешены)
сравнивать можно переменные одного и того же классового типа
сравнение выполняется на уровне адресных значений
переменных, но не на уровне самих адресуемых объектов
объектную переменную любого классового типа можно
сравнивать с нулевым (пустым) адресным значением, используя
для этого ключевые слова nil или null
Примеры для графических объектов.
Delphi
if (Circ1 = Circ2) then . . . // проверяется условие: адресуют ли обе
// переменные одну и ту же окружность
if (Rect1 <> nil) then . . . // проверка на нулевой адрес
if (Circ1 > Circ2) then . . . // ОШИБКА: не имеет смысла для адресов
Java и C#
if (Circ1 == Circ2) . . . // сравнение на равенство адресов
while (Rect1 != null) { … } // повторение цикла, пока Rect1
// адресует прямоугольники
В заключение надо отметить, что поскольку объекты создаются
динамически в процессе выполнения программы, возможна ситуация
исчерпания свободной динамически распределяемой памяти (кучи).
Вероятность возникновения этой ситуации зависит от многих факторов, в
первую очередь – от байтового размера создаваемых объектов и объема
свободной оперативной памяти. Возникновение такой особой ситуации
можно отследить с помощью специального механизма исключений
(exception), который рассматривается в разделе 17.