Файл: 3. Создание и использование объектов. Объектные переменные.pdf

Добавлен: 20.10.2018

Просмотров: 735

Скачиваний: 21

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

 

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. Язык  С++ 

Работа с объектами в этом языке немного отличается от других языков. 

Наравне  с  динамически  создаваемыми  объектами  можно  использовать 


background image

 

 

статические  объекты,  для  доступа  к  которым  не  требуется  использовать 

указательные переменные. 

Для  статического  создания  объекта  достаточно  объявить  одну  или 

несколько переменных соответствующего классового типа: 

           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 ( ); 


background image

 

 

Вызов  методов  динамических  объектов  выполняется  следующим 

образом: 

pCircle -> Show ( );    // отобразить 

pCircle -> MoveTo (200, 200);  // переместить 

int  Rad = pCirc2 -> GetRad ( );  // получить радиус 

 

После  рассмотрения  особенностей  объявления  объектных  переменных 

надо  вернуться  к  общим  вопросам  использования  таких  переменных. 

Корректная  работа  с  объектными  переменными  требует  соблюдения  ряда 

правил, связанных с адресным характером этих переменных. Для объектных 

переменных определены две основные операции: 

  присваивание значения одной переменной другой 

  сравнение значений двух переменных 

 

Особенности использования операции присваивания: 

  обе переменные должны относиться к  одному классу (далее, при 

изучении полиморфизма, это требование будет ослаблено

  переменная в правой части должна иметь некоторое значение (как 

известно, это относится к любым операциям присваивания) 

 

присваивание  выполняется  на  уровне  адресных  значений 

объектных  переменных,  т.е.  после  выполнения  операции  ОБЕ 

переменные  будут  адресовать  одну  и  ту  же  область  памяти

никакого копирования объекта НЕ происходит!

 

 

 

 

 

 

  переменной  любого  классового  типа  можно  присвоить  нулевое 

(пустое

адресное 

значение, 

для 

чего 

используются 

ОП 1 

  

адрес объекта

 

 

объект 

  

значение свойства 1 
значение свойства 2 

. . . . . . . . . . 

значение свойства N

 

 

ОП 2 

  

адрес объекта

 

 


background image

 

 

зарезервированные  слова    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   НИЧЕГО не адресует! 

 

Особенности использования операции сравнения: 

  две  объектные  переменные  можно  сравнивать  только  на 

равенство  или  неравенство  (операции  сравнения  типа  «больше-

меньше» не разрешены) 


background image

 

 

  сравнивать можно переменные одного и того же классового типа 

  сравнение  выполняется  на  уровне  адресных  значений 

переменных, но не на уровне самих адресуемых объектов 

  объектную  переменную  любого  классового  типа  можно 

сравнивать  с  нулевым  (пустым)  адресным  значением,  используя 

для этого ключевые слова  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.