Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

Обьясните простым языком об указателях * и & - 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...

3
silent_1991
Эксперт С++
4987 / 3044 / 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.
1
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 функция это делает?
0
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
06.03.2011, 20:38 #4
dimon1984, оператор сложения принимает два операнда типа Distance. Когда функция дружественная, тут уже нет такого, что тот объект, который стоит слева от знака, является вызывающим. Тут функция вызывается для пары объектов - левого и правого. И в случае, если хотя-бы один из объектов имеет тип Distance, вызывается соответствующая версия перегруженной операции. Поскольку второй тип не принадлежит к Distance, для него вызывается конструктор в качестве оператора приведения типа.
1
06.03.2011, 20:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2011, 20:38
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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