Форум программистов, компьютерный форум CyberForum.ru

обьясните функцию простым языком :) - C++

Восстановить пароль Регистрация
 
dimon1984
40 / 38 / 0
Регистрация: 22.01.2011
Сообщений: 670
06.03.2011, 20:15     обьясните функцию простым языком :) #1
Обьясните плиз, почему в main() возможна такая d3 = 10.0 + d1; операция? Тоесть на первом месте стоит 10.0 потом обьект. Я понял что это делает друж-ная функция, но хотелось бы узнать как это она делает? Семантику можно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class Distance                //Класс английских расстояний
  {
  private:
    int feet;
    float inches;
  public:
    Distance()                //конструктор без аргументов
      { feet = 0; inches = 0.0; }
    Distance( float fltfeet ) //конструктор (1 арг.)
      {    //Переводит float в Distance
      feet = int(fltfeet);    //feet – целая часть
      inches = 12*(fltfeet-feet); //слева - дюймы
      }
    Distance(int ft, float in)    //конструктор (2 арг.)
      { feet = ft; inches = in; }
    void showdist()              //Вывести длину
      { cout << feet << "\'-" << inches << '\"';}
    friend Distance operator + (Distance, Distance); //дружественный
  };
//---------------------------------------------------------
 
Distance operator + (Distance d1, Distance d2) // d1 + d2
  {
  int f = d1.feet + d2.feet;       //+ футы
  float i = d1.inches + d2.inches; //+ дюймы
  if(i >= 12.0)                    //если больше 12 дюймов,
    { i -= 12.0; f++;  }           //уменьшить на 12 дюймов,
                                   //прибавить 1 фут
  return Distance(f,i);            //Новая длина с суммой
  }
//---------------------------------------------------------
int main()
  {
  Distance d1 = 2.5;         //конструктор переводит
  Distance d2 = 1.25;        //float-feet в Distance
  Distance d3;
  cout << "\nd1 = "; d1.showdist(); 
  cout << "\nd2 = "; d2.showdist();
 
  d3 = d1 + 10.0;            //distance + float: OK
  cout << "\nd3 = "; d3.showdist();
  d3 = 10.0 + d1;            //float + Distance: OK
  cout << "\nd3 = "; d3.showdist();
  cout << endl;
  return 0;
  }
Тоесть к примеру здесь очевидно и понятно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class beta;              //нужно для объявления frifunc
 
class alpha
    {
    private:
      int data;
    public:
      alpha() : data(3) {  }           //конструктор без
                                       //аргументов
      friend int frifunc(alpha, beta); //дружественная
                                       //функция
    };
///////////////////////////////////////////////////////////
class beta
    {
    private:
      int data;
    public:
      beta() : data(7) {  }            //конструктор без
                                       //аргументов
friend int frifunc(alpha, beta);       //дружественная
                                       //функция
    };
///////////////////////////////////////////////////////////
int frifunc(alpha a, beta b)           //определение функции
    {
    return( a.data + b.data );
    }
//---------------------------------------------------------
int main()
    {
    alpha aa;
    beta bb;
 
    cout << frifunc(aa, bb) << endl;   //вызов функции
    return 0;
    }
здесь у функции два аргументы (обьекта) и функция обращается к их полям(данным), а в первом примере не очевидно немного не понятно. Обьясните плиз.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
06.03.2011, 20:29     обьясните функцию простым языком :) #2
Т.е. у вас не вызвало подозрений то, что можно записать d1 + 10.0, а только случай 10.0 + d1? Ведь оператор сложения перегружен только для пары объектов типа Distance.
Ладно, суть в том, что конструктор объекта может неявно быть использован в качестве оператора приведения типа. Т.е. запись d1 + 10.0 фактически преобразуется в d1 + Distance (10.0). Аналогично с 10.0 + d1. Чтобы этого избежать (иногда это бывает полезно), надо конструктор объявить с ключевым словом explicit.
dimon1984
40 / 38 / 0
Регистрация: 22.01.2011
Сообщений: 670
06.03.2011, 20:34  [ТС]     обьясните функцию простым языком :) #3
d1 + 10.0 это не вызвало подозрений, потомучто есть конструктор по умолчанию
C++
1
2
3
4
5
    Distance( float fltfeet ) //конструктор (1 арг.)
      {    //Переводит float в Distance
      feet = int(fltfeet);    //feet – целая часть
      inches = 12*(fltfeet-feet); //слева - дюймы
      }
перегруженная операция + вызывается же из обьекта Distance, поэтому оператору + как и обьекту известно как обрабатывать тип float.
А типу float ведь не известно как обрабатывать тип Distance. Как friend функция это делает?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
06.03.2011, 20:38     обьясните функцию простым языком :) #4
dimon1984, оператор сложения принимает два операнда типа Distance. Когда функция дружественная, тут уже нет такого, что тот объект, который стоит слева от знака, является вызывающим. Тут функция вызывается для пары объектов - левого и правого. И в случае, если хотя-бы один из объектов имеет тип Distance, вызывается соответствующая версия перегруженной операции. Поскольку второй тип не принадлежит к Distance, для него вызывается конструктор в качестве оператора приведения типа.
Yandex
Объявления
06.03.2011, 20:38     обьясните функцию простым языком :)
Ответ Создать тему
Опции темы

Текущее время: 11:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru