С++ для начинающих



         

Объекты классов - часть 2


int main()

{

   Screen myScreen, bufScreen[10];

   Screen *ptr = new Screen;

   myScreen = *ptr;

   delete ptr;

   ptr = bufScreen;

   Screen &ref = *ptr;

   Screen &ref2 = bufScreen[6];

}

По умолчанию объект класса передается по значению, если он выступает в роли аргумента функции или ее возвращаемого значения. Можно объявить формальный параметр функции или возвращаемое ею значение как указатель или ссылку на тип класса. (В разделе 7.3 были представлены параметры, являющиеся указателями или ссылками на типы классов, и объяснялось, когда их следует использовать. В разделе 7.4 с этой точки зрения рассматривались типы возвращаемых значений.)

Для доступа к данным или функциям-членам объекта класса следует пользоваться соответствующими операторами. Оператор “точка” (.) применяется, когда операндом является сам объект или ссылка на него; а “стрелка” (->) – когда операндом служит указатель на объект:

#include "Screen.h"

bool isEqual( Screen& s1, Screen *s2 )

{ // возвращает false, если объекты не равны, и true - если равны

   if (s1.height() != s2->height() ||

       s2.width() != s2->width() )

          return false;

   for ( int ix = 0; ix < s1.height(); ++ix )

      for ( int jy = 0; jy < s2->width(); ++jy )

         if ( s1.get( ix, jy ) != s2->get( ix, jy ) )

            return false;

   return true;    // попали сюда? значит, объекты равны

}

isEqual() – это не являющаяся членом функция, которая сравнивает два объекта Screen. У нее нет права доступа к закрытым членам Screen, поэтому напрямую обращаться к ним она не может. Сравнение проводится с помощью открытых функций-членов данного класса.

Для получения высоты и ширины экрана isEqual() должна пользоваться функциями-членами height() и width() для чтения закрытых членов класса. Их реализация тривиальна:

class Screen {

public:

   int height() { return _height; }

   int width()  { return _width; }

   // ...

private:

   short _heigh, _width;

   // ...

};

Применение оператора доступа к указателю на объект класса эквивалентно последовательному выполнению двух операций: применению оператора разыменования (*) к указателю, чтобы получить адресуемый объект, и последующему применению оператора “точка” для доступа к нужному члену класса. Например, выражение

s2->height()

можно переписать так:

(*s2).height()

Результат будет одним и тем же.




Содержание  Назад  Вперед