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

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

Войти
Регистрация
Восстановить пароль
 
dimon1984
40 / 38 / 0
Регистрация: 22.01.2011
Сообщений: 670
#1

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

06.03.2011, 20:15. Просмотров 632. Ответов 3
Метки нет (Все метки)

Обьясните плиз, почему в 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;
    }
здесь у функции два аргументы (обьекта) и функция обращается к их полям(данным), а в первом примере не очевидно немного не понятно. Обьясните плиз.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2011, 20:15     обьясните функцию простым языком :)
Посмотрите здесь:

Обьясните простым языком об указателях * и & - C++
Всё что в книгах прочитал, но толком не могу понять зачем нужны * и &amp;. Обьясните кто может, простым языком...

Народ, обьясните пожалуйста человеческим языком задание - C++
Если можно напишите кусками кода, или хотя-бы словами порядок выполнения

Написать программу более простым языком (как заменить std::cout на printf? ) - C++
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;iomanip&gt; using namespace std; int main() { int const n = 5; int...

Составить функцию, определяющую, является ли ее целый аргумент простым числом. Использовать эту функцию для п - C++
Составить функцию, определяющую, является ли ее целый аргумент простым числом. Использовать эту функцию для подсчета количества простых...

Составить функцию, определяющую, является ли ее целый аргумент простым числом. Использовать эту функцию для п - C++
Составить функцию, определяющую, является ли ее целый аргумент простым числом. Использовать эту функцию для подсчета количества простых...

Обьясните функцию - C++
Обьяните пожалуйста кто сможет строчку где g = rand() / (float) RAND_MAX * groups; int g = peerGroup; while (g == peerGroup) g...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт С++
4961 / 3037 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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 функция это делает?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2011, 20:38     обьясните функцию простым языком :)
Еще ссылки по теме:

Определить функцию, проверяющую, является ли число простым - C++
помогите пожалуйста...и с комментариями желательно УСЛОВИЕ: Определить функцию, проверяющую, является ли данное число простым....

Разработать функцию, проверяющую, является ли число простым - C++
1)Разработать функцию, проверяющую, является ли число простым. С её помощью найти и напечатать все простые числа из интервала от n до m.

Напишите функцию, определяющую является ли число простым - C++
2. Напишите функцию, определяющую является ли число простым (Целое число является простым, если оно делится только на 1 и на само себя....

Определить функцию, проверяющую, является ли данное число простым - C++
4. Определить функцию, проверяющую, является ли данное число простым, и функцию, подсчитывающую количество единиц в двоичной записи...

Составить функцию, определяющую, является ли ее аргумент простым числом - C++
1. Составить функцию, определяющую, является ли ее аргумент простым числом. Использовать эту функцию для установления факта, имеется ли...

Написать функцию, которая проверяет, является ли переданное ей число простым? - C++
Написать функцию, которая проверяет, является ли переданное ей число простым? Число называется простым, если оно делится без остатка только...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт С++
4961 / 3037 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
06.03.2011, 20:38     обьясните функцию простым языком :) #4
dimon1984, оператор сложения принимает два операнда типа Distance. Когда функция дружественная, тут уже нет такого, что тот объект, который стоит слева от знака, является вызывающим. Тут функция вызывается для пары объектов - левого и правого. И в случае, если хотя-бы один из объектов имеет тип Distance, вызывается соответствующая версия перегруженной операции. Поскольку второй тип не принадлежит к Distance, для него вызывается конструктор в качестве оператора приведения типа.
Yandex
Объявления
06.03.2011, 20:38     обьясните функцию простым языком :)
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru