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

cpp, перегрузка операторов - C++

Восстановить пароль Регистрация
 
FCI
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 4
14.08.2012, 12:03     cpp, перегрузка операторов #1
Здравствуйте. Можете, пожалуйста, объяснить, как, например, перегрузить операцию умножения вида const obj& operator*(double а), только справа. Сам сделал следующее:
C++
1
2
3
4
5
6
7
friend const orbital operator*(double c,const obj&M);....
const obj operator*(double c,const obj&M)
{
    obj m(M);
    (M.coef)*=c;
    return m;
}
Хотелось бы, чтоб оператор принимал double и одну const obj&M и возвращал ссылку.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2012, 12:03     cpp, перегрузка операторов
Посмотрите здесь:

Перегрузка операторов C++
[c++] Перегрузка операторов C++
Перегрузка операторов C++
C++ Перегрузка операторов С++
C++ перегрузка операторов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.08.2012, 12:20     cpp, перегрузка операторов #2
FCI, Вот ссылку оператору * возвращать абсолютно не следует, не логично это
FCI
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 4
14.08.2012, 12:44  [ТС]     cpp, перегрузка операторов #3
A как избежать создания нового объекта класса?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.08.2012, 12:49     cpp, перегрузка операторов #4
FCI, А зачем этого избегать собственно? И в какой момент?
Есть такая вещь как RVO (Return Value Optimisation), только вот когда ее задействовать решает компилятор-с.

Добавлено через 1 минуту
http://alenacpp.blogspot.com/2008/02/rvo-nrvo.html
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
14.08.2012, 12:49     cpp, перегрузка операторов #5
в этом операторе - никак. он должен возвращать именно объект.
если хочется ссылку получать, то нужно реализовать operator *=,
а оператор * реализовать за его счет. так будет правильнее всего

RVO не поможет избавится от копии объекта, который создается в теле оператора и затем модифицируется. Возможно соптимизируется возврат этого объекта, но он в любом случае будет создаваться.
FCI
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 4
14.08.2012, 12:51  [ТС]     cpp, перегрузка операторов #6
Разумно.-Спасибо!
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.08.2012, 12:54     cpp, перегрузка операторов #7
DU, Ну он еще и rvalue-reference может возвращать вообщем-то (если о С++11 говорить).

Добавлено через 1 минуту
DU, В теле оператора не обязательно создавать объект ( и тогда может быть будет copy-elision).

C++
1
2
3
4
5
obj operator(double c, obj m)
{
   m.coef*=c;
   return m;
}
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
14.08.2012, 13:00     cpp, перегрузка операторов #8
Признаюсь, не освоил &&.
Меня вот что смущает:
допустим клиенту нужен объект, умноженный на число. А старый не нужен.
В этом случае operator *= понятно как работает. Просто модифицируется старый объект.
А при operator * что происходит?

вариант 1:
Obj oldObj;
Obj newObj = oldObj * 1.0; // вот тут результат попадает в новый объект. И он будет создаваться, быстро или медленно, но будет.

вариант 2:
Obj oldObj;
oldObj = oldObj * 1.0; // а вот тут что будет?

Если знаете детали всего этого хозяйства, проясните плиз.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,165
Завершенные тесты: 1
14.08.2012, 13:25     cpp, перегрузка операторов #9
Цитата Сообщение от DU Посмотреть сообщение
а вот тут что будет?
Что напишете в операторе operator*, то и будет.
В Вашем примере
C++
1
2
3
4
5
6
const obj operator*(const obj&M,double c)
{
    obj m(M);
    (M.coef)*=c;
    return m;
}
oldObj.coef умножится на c.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2012, 13:26     cpp, перегрузка операторов
Еще ссылки по теме:

C++ Перегрузка операторов
C++ Перегрузка операторов
Перегрузка операторов: Можно ли вынести "тело" оператора (расчеты) из H в CPP? C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.08.2012, 13:26     cpp, перегрузка операторов #10
zss, Разговор был про оптимизации, применяемые компилятором вообщем-то.
Yandex
Объявления
14.08.2012, 13:26     cpp, перегрузка операторов
Ответ Создать тему
Опции темы

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