Главная->Інформатика та програмування->Содержание->Дружественность и функциональная запись

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 11) онлайн

Дружественность и функциональная запись

Иногда дружественная функция позволяет использовать более понятный син-

таксис вызова функции, чем обычный метод. Например, нам нужна функция,

возводящая в квадрат экземпляр объекта типа Distance из приведенного выше

примера и возвращающая значение в квадратных футах как тип float. Пример

MISQ показывает, как это может быть сделано с помощью обычного метода.

Листинг 11.12. Программа MISQ

// misq.cpp

// метод square() для Distance

#include <iostream>

using namespace std;

///////////////////////////////////////////////////////////

class Distance                                     //Класс английских длин

{

private:

                int feet;

                float inches;

public:                                  //конструктор (без аргументов)

                Distance() : feet(0), inches(0.0) 

                {  }                          //constructor (two args)

                Distance(int ft, float in) : feet(ft), inches(in)

                {  }

                void showdist()                               //показать длину

                { cout << feet << "\'-" << inches << '\"';}

                float square();                  //обычный метод

};

//---------------------------------------------------------

float Distance::square()                               //возвращает квадрат

{                                                                                                                            //расстояния

                float fltfeet = feet + inches/12;                //перевод во float

                float feetsqrd = fltfeet * fltfeet;  //возведение в //квадрат

                return feetsqrd;                              //возвратить квадрат

}

///////////////////////////////////////////////////////////

int main()

{

 

 

               

                Distance dist(3, 6.0);      //конструктор с 2 арг. (3'-6")

                float sqft;

 

                sqft = dist.square();       //вычислить квадрат расстояния

                                        //показать расст. и квадрат расст.

                cout << "\nРасстояние = "; dist.showdist();

                cout << "\nКвадрат расст. = " << sqft << " кв. футов\n";

                return 0;

}

В main() программа создает значение Distance, возводит его в квадрат и выво-

дит результат. Вот как это выглядит на экране:

Расстояние = 3'-6'1

Квадрат расст. = 12.25 кв. футов

В main() мы использовали выражение

sqft = dist.square();

чтобы отыскать квадрат dist и присвоить его переменной sqft. Это выполняется

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

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

имеет смысл предпочесть функциональную запись:

 

sqft = square(dist);

 

Такого эффекта можно добиться, сделав square() дружественной функцией

для класса Distance. Это показано в программе FRISQ.

Листинг 11.13. Программа FRISQ

// frisq.cpp

// Дружественная для Distance функция square()

#include <iostream>

using namespace std;

///////////////////////////////////////////////////////////

class Distance                        //Класс английских длин

  {

  private:

    int feet;

    float inches;

  public:                   //Класс английских длин

    Distance() : feet(0), inches(0.0) //конструктор (без аргументов)

      {  }

                                         //конструктор (2 аргумента)

    Distance(int ft, float in) : feet(ft), inches(in) 

      {  }

    void showdist()                //вывести расстояние

      { cout << feet << "\'-" << inches << '\"'; }

    friend float square(Distance); //дружественная ф-ция

  };

//---------------------------------------------------------

 

Листинг 11.13 {продолжение)

                float square(Distance d)                //вернуть квадрат

                {                                     //расстояния

                               float fltfeet = d.feet + d.inches/12; //конвертировать в float

                               float feetsqrd = fltfeet * fltfeet;   //вычислить квадрат

                               return feetsqrd;                      //вернуть квадратные футы

                }

                ///////////////////////////////////////////////////////////

                int main()

                {

                               Distance dist(3, 6.0);//конструктор с двумя аргументами (3'-6")

                               float sqft;

                              

                               sqft = square(dist);               //вернуть квадрат dist

                               //Вывести расстояние и его квадрат

                               cout << "\nРасстояние = "; dist.showdist();

                               cout << "\nКвадрат расст. = " << sqft << " square feet\n";

                               return 0;

                }

 

Тогда как функция Square() в MISQ не требовала аргументов, будучи обычным

методом, во FRISQ ей уже требуются аргументы. Вообще говоря, дружественная

функция требует на один аргумент больше, чем метод. Функция square() во FRISQ

похожа на аналогичную в MISQ, но она обращается к данным объекта Distance

как d.inches или как d.feet, в отличие от обращения inches и feet.

 

 

16