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

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

Войти
Регистрация
Восстановить пароль
 
FCI
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 4
#1

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

14.08.2012, 12:03. Просмотров 509. Ответов 9
Метки нет (Все метки)

Здравствуйте. Можете, пожалуйста, объяснить, как, например, перегрузить операцию умножения вида 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++):

Перегрузка операторов: Можно ли вынести "тело" оператора (расчеты) из H в CPP? - C++
Помогите новичку! Пишу класс и вынес его в отдельные файлы *.CPP и *.H Теперь пытаюсь переопределить операторы. Начал с = По примеру...

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this - C++
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в зависимости от чего зависит агрумент при...

Перегрузка операторов - C++
вот есть такое задание Для заданного по варианту класса выполнить следующие действия: 1) описать все типы конструкторов и деструктор...

[c++] Перегрузка операторов - C++
Для заданных A = (A – a1, A, A + a2) и B = (B – b1, B, B + b2) Найти сумму A + B = (A + B – a1 – b1, A + B, A + B + a2 + b2); ...

Перегрузка операторов - C++
Помогите решить задачу на c++ мучаюсь 3 день Перегрузить операторы «==» и «!=» для строк. Оператор «==» возвращает соответственно 1,...

Перегрузка операторов - C++
Столкнулся с проблемой при написании лабораторной по перегрузке операторов. Задание таково: описать класс, содержащий координаты отрезка,...

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

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

RVO не поможет избавится от копии объекта, который создается в теле оператора и затем модифицируется. Возможно соптимизируется возврат этого объекта, но он в любом случае будет создаваться.
FCI
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 4
14.08.2012, 12:51  [ТС] #6
Разумно.-Спасибо!
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
14.08.2012, 12:54 #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
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
14.08.2012, 13:00 #8
Признаюсь, не освоил &&.
Меня вот что смущает:
допустим клиенту нужен объект, умноженный на число. А старый не нужен.
В этом случае operator *= понятно как работает. Просто модифицируется старый объект.
А при operator * что происходит?

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

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

Если знаете детали всего этого хозяйства, проясните плиз.
zss
Модератор
Эксперт С++
6365 / 5929 / 1923
Регистрация: 18.12.2011
Сообщений: 15,237
Завершенные тесты: 1
14.08.2012, 13:25 #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.
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
14.08.2012, 13:26 #10
zss, Разговор был про оптимизации, применяемые компилятором вообщем-то.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2012, 13:26
Привет! Вот еще темы с ответами:

Перегрузка операторов - C++
Помогите, пожалуйста, решить задачу При создании собственных типов данных с помощью классов наиболее общей операцией является проверка...

Перегрузка операторов - C++
В общем учу эту тему и ввожу код один в один как в уроке, но в уроке он компилится, а у меня нет. Ругается на "c1++;", подскажите...

Перегрузка операторов - C++
#include<locale> #define MAX 20 class Base { public: float **arr; int size; int size2; Base(void);

Перегрузка операторов - C++
#include <stdio.h> #include <stdlib.h> class matrix { protected: int **mass; int n; public: ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.08.2012, 13:26
Ответ Создать тему
Опции темы

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