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

Перегрузка бинарных операций - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.95
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
23.08.2010, 23:35     Перегрузка бинарных операций #1
Привет! Начал изучать перегрузку операций. В отступление хочется сказать, что это очень увлекательно и интересно. Но в моей книге, есть один момент, который я не понял. Вернее понял, но не до конца.

Итак, что диктует книга:
Существует правило: объект, стоящий с левой стороны операции, вызывает функцию оператора. Объект, стоящий справа от знака операции, должен быть передан в функцию в качестве аргумента. Операция возвращает значение, которое мы затем используем для своих нужд.
Поясню что ясно, а что нет.
в классе определяем перегрузку операции:
C++
1
Distance operator+(Distance) const;
Затем инициализируем ее:
C++
1
2
3
4
5
6
7
8
9
10
11
Distance Distance::operator+(Distance d2) const
{
   int f = feet + d2.feet;
   float i = inches + d2.inches;
   if (i>=12.0)
   {
      i-=12.0;
      f++;
   }
   return Distance (f,i);
}
Итак если мы теперь в main() попросим сделать так:
C++
1
dist3 = dist1+dist2;
то операнд стоящий слева от бинарной операции (читаем dist1), будет вызывающим и автоматом попадет в feet и inches класса Distance, а правый операнд (dist2) будет передан в качестве аргумента в функцию operator+(). С этим все ясно и понятно.

Объясните пожалуйста, как в таком случае работает
C++
1
dist4=dist1+dist2+dist3
?
В книге об этом умолчали, а я догнать никак не могу.
Предположу:
Сначала в operator+() поступают dist1 как вызывающая и dist2 как параметр. Потом, когда все посчитано, сумма этих объектов по умолчанию попадает в operator+() как вызывающая а dist3 как параметр, не? )
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2010, 23:35     Перегрузка бинарных операций
Посмотрите здесь:

C++ Перегрузка операций
C++ перегрузка операций С++
C++ перегрузка бинарных операций
C++ Перегрузка операций
Перегрузка операций C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
23.08.2010, 23:37     Перегрузка бинарных операций #2
half-node, Да скорее всего.
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
23.08.2010, 23:40  [ТС]     Перегрузка бинарных операций #3
Просто, раньше Лафоре очень любил приводить графики работы с памятью в подобных операциях. А тут тишина. Хотелось бы знать, создается некий "temp" объект и занимает ли он память?
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
23.08.2010, 23:47     Перегрузка бинарных операций #4
Посмотри как по стандарту вычисляется выражение - по-моему,справа-налево,то есть,сначала вычислится 2+3 а потом 1 + (2+3) . Но я мог и напутать. Дополнительный (безымянный)объект создаётся с помощью конструктора с новыми данными и возвращается оператором.
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
24.08.2010, 00:17  [ТС]     Перегрузка бинарных операций #5
Цитата Сообщение от #pragma Посмотреть сообщение
Посмотри как по стандарту вычисляется выражение - по-моему,справа-налево,то есть,сначала вычислится 2+3 а потом 1 + (2+3) . Но я мог и напутать.
Книга говорит обратное, в данном случае
т.е. (1+2)+3
Дополнительный (безымянный)объект создаётся с помощью конструктора с новыми данными и возвращается оператором.
Следовательно, дополнительная память, таки выделяется? Спасибо.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
24.08.2010, 04:04     Перегрузка бинарных операций #6
Цитата Сообщение от half-node Посмотреть сообщение
Следовательно, дополнительная память, таки выделяется? Спасибо.
Создается временный объект, который уничтожается после присваивания
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
24.08.2010, 08:26  [ТС]     Перегрузка бинарных операций #7
Цитата Сообщение от Nameless One Посмотреть сообщение
Создается временный объект, который уничтожается после присваивания
Ну да, я понял. Но память таки выделяется в момент создания объекта. Это важно, как мне кажется.
Спасибо.
Crudelis
Шаровик затейник
 Аватар для Crudelis
667 / 409 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
24.08.2010, 16:23     Перегрузка бинарных операций #8
Цитата Сообщение от half-node Посмотреть сообщение
dist4=dist1+dist2+dist3
для того чтоб выполнить данную операцию, нужна дружественная перегрузка, т.е. функция:
C++
1
friend NameClass operator+(NameClass&a, NameClass &b);
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
24.08.2010, 16:25  [ТС]     Перегрузка бинарных операций #9
Да нет, не нужна

Добавлено через 35 секунд
Достаточно и враждебной...
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
24.08.2010, 16:25     Перегрузка бинарных операций #10
Crudelis, c чего это вдруг?
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
24.08.2010, 16:31  [ТС]     Перегрузка бинарных операций #11
Я почитал, для меня, вроде как все прозрачно.
Складывается первый и второй объекты, при return Distance (i,f) создается возвращаемый объект и он уже складывается с третьим объектом.
bobromet
24 / 24 / 1
Регистрация: 06.03.2010
Сообщений: 59
27.08.2010, 21:43     Перегрузка бинарных операций #12
Никак не могу разобратся, нужно обработать следующее выражение
C
1
(100 + a + a).view();
вот код полностью

C
1
2
3
4
5
6
7
8
9
10
11
12
void main()
{
    A a( 2,  3);
    a.view();
 
    (a + a + 100).view(); //  работает
    (100 + a + a).view(); //  не работает
 
    /*       а так работает        */
    //A aa(100 + a + a);
    //aa.view();
}
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
class A
{
    int var;
 
public:
    A(int a): var(a){}
    A(int a, int b): var(a + b){}
    A(const A &a)
    {
        var = a.var;
    }
    void view()
    {
        cout << var << endl;
    }
    A operator+(const A &a)
    {
        A tmp(var + a.var);
        return tmp;
    }
    friend int operator+(int i, const A &a)
    {
        A tmp(i + a.var);
        return tmp.var;
    }
};
что то никак немогу сообразить. Блин
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.08.2010, 21:49     Перегрузка бинарных операций #13
bobromet, friend функцию надо перегружать для обоих вариантов. У вас есть
C++
1
friend int operator+(int i, const A&a)
а надо еще
C++
1
friend int operator+(const A&a, int i)
Однако судя по всему в данном случае сие не поможет
У вас вообще при этом коде:
C++
1
 (a + a + 100).view();
вызывается два раза
C++
1
A operator+(const  A &a)
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
27.08.2010, 22:25     Перегрузка бинарных операций #14
Цитата Сообщение от bobromet Посмотреть сообщение
(100 + a + a).view();
можно так
C++
1
(A(100) + a + a).view();
лучше делать
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
class A
{
        int var;
 
public:
        A(int a): var(a){}
        A(int a, int b): var(a + b){}
 .....
        friend A operator+(int,const A&);
};
 
A operator+(int i,const A& a){
        return A(i,a.var);
}
 
int main()
{
        A a( 2,  3);
        a.view();
 
        (a + a + 100).view(); //  работает
        (100 + a + a).view(); //  работает
 
        /*       а так работает        */
        //A aa(100 + a + a);
        //aa.view();
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2010, 23:40     Перегрузка бинарных операций
Еще ссылки по теме:

C++ Перегрузка операций
Перегрузка операций C++
C++ Перегрузка операций

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

Или воспользуйтесь поиском по форуму:
bobromet
24 / 24 / 1
Регистрация: 06.03.2010
Сообщений: 59
27.08.2010, 23:40     Перегрузка бинарных операций #15
Lavroff
Цитата Сообщение от Lavroff Посмотреть сообщение
при этом коде:
C++
1
 (a + a + 100).view();
вызывается два раза
C++
1
A operator+(const  A &a)
Они ведь парами обрабатываются, поэтому два раза. Тут например три раза
C++
1
(a + a + a + 100).view();
alex_x_x, спасибо, красота! Пробовал почти также только возвращал не обьект а адрес.
Люблю этот форум, сейчас сидел бы и тупил дальше.)
Yandex
Объявления
27.08.2010, 23:40     Перегрузка бинарных операций
Ответ Создать тему
Опции темы

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