![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| kkkggg |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 28.4.2006 Репутация: нет Всего: нет |
Я не могу понять как, описать operator+.
#include <iostream.h> class complex { public: int r,i; complex(int re, int im):r(re),i(im) {} complex operator+(complex); }; complex complex::operator+(complex a) { // Что сдесь нужно писать? } int main() { complex a = complex(1,3); complex b = complex(6,8); complex c = a + b; return 0; } Помогитье довести данный пример до ума... |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Для справки: есть std::complex |
|||
|
||||
| kkkggg |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 28.4.2006 Репутация: нет Всего: нет |
Теперь довайте разбираться
complex& operator+(const complex&); Что означает "&" ? Я помню что это раздел "Указатели", и называется он амперсент. Простой пример его использования: char c = 'a'; char *p = &c; // Теперь *р хранит адрес переменной с. Я непойму зачем он ставится после типа в нашем примере? |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
kkkggg, да, ты прав - это амперсанд. Открой раздел ссылки
|
|||
|
||||
| Prehistorik |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 146 Регистрация: 30.5.2006 Где: СПб Репутация: 1 Всего: 3 |
В списке параметров он ставится для того, чтобы не забивать стек. А вот после возращаемого типа для тогго же....
А вот это не совсем верно. Потому как в примере
переменная "a" теперь содержит значение (7,11)... по мне, так надо вот так....
--------------------
Есть только один бог - Ассемблер, и С - пророк его. |
||||||||
|
|||||||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
А теперь подумай, на что ты возвращаешь ссылку, и почему это работать не будет. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Правильный оператор "+" должен возвращать не ссылку, а значение.
И быть константным. Или вообще реализовываться вне класса. И, конечно, не менять значений своих аргументов. Таким как написано выше должен быть оператор +=
-------------------- ... |
|||
|
||||
| AlanG |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.5.2006 Где: РашЫн ФидирейшЫн Репутация: нет Всего: нет |
Логика operator+. следующая:
Действия производимые над объектами типа + (сложение), например: complex c = a + b; вызывают этот оператор(можно сказать функция). Поисходит следующее: объект a генерирует вызов operator+( const complex b), при этом втророй объект (b) посылается в эту функцию в качестве аргумента: complex c = a + b;
Это сообщение отредактировал(а) AlanG - 15.6.2006, 18:45 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
AlanG, это ты написал, как не надо делать, я надеюсь?
Не говоря уж о том, что код компилироваться не будет (путаешь ссылки с указателями). А еще, в С++ функции редко "возбуждаются", это делают все больше исключения. -------------------- ... |
|||
|
||||
| AlanG |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.5.2006 Где: РашЫн ФидирейшЫн Репутация: нет Всего: нет |
Дополню: В функцию неявно передается сылка на вызываемый объект, т.е. а в данном случае, к этому объекту и к его членам, например в твоем классе complex ты указал переменные r и i, к этим членам можно обратится на "прямую", не указываея объект.
От себя: Лично мне нравится логика operator, она очень проста в понимании, и может пригодится в повседневной работе программисат. Добавлено @ 18:58
Я не смотрю на код, я простопытаюсь логику выделить Может код ошибочный но не в этом суть. |
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
AlanG, ты извини, но такими объяснениями ты новичка вообще запутаешь.
kkkggg, правильный оператор + должен быть таким (2 варианта):
Второй вариант лучше, т.к. позволяет компилятору выполнить преобразование левого операнда (скажем из ... тьфу, только сейчас заметила, что у тебя реальная и мнимая части представлены как целые -------------------- ... |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
все равно operator+ лучше реализовывать через operator+=
тем более, что его, имхо, обязательно нужно реализовывать (тем более в случае complex) -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Никто и не спорит.
-------------------- ... |
|||
|
||||
| AlanG |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.5.2006 Где: РашЫн ФидирейшЫн Репутация: нет Всего: нет |
Можно по подробнее про реальную и мнимую часи И про преобразование левого операнда. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |