Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> operator+ и.т.п, Нужен пример использования 
V
    Опции темы
kkkggg
Дата 15.6.2006, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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;
}

Помогитье довести данный пример до ума...  
PM MAIL   Вверх
Daevaorn
Дата 15.6.2006, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Код

#include <iostream.h>
class complex 
{
public:
    int r,i;
    complex(int re, int im):r(re),i(im) {}
    complex& operator+(const complex&); //!!!
};
complex& complex::operator+( const complex& a )
{
   r += a.r;
   i += a.i;
   return *this;
}

int main()
{
complex a = complex(1,3);
complex b = complex(6,8);
complex c = a + b;

return 0;
}

Для справки: есть std::complex 
PM MAIL WWW   Вверх
kkkggg
Дата 15.6.2006, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 28.4.2006

Репутация: нет
Всего: нет



Теперь довайте разбираться  smile 
complex& operator+(const complex&);

Что означает "&" ? Я помню что это раздел "Указатели", и называется он амперсент.
Простой пример его использования: 

char c = 'a';
char *p = &c; // Теперь *р хранит адрес переменной с.


Я непойму зачем он ставится после типа в нашем примере?
 
PM MAIL   Вверх
Daevaorn
Дата 15.6.2006, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



kkkggg, да, ты прав - это амперсанд. Открой раздел ссылкиsmile 
PM MAIL WWW   Вверх
Prehistorik
Дата 15.6.2006, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 30.5.2006
Где: СПб

Репутация: 1
Всего: 3



Код

complex& operator+(const complex&);


В списке параметров он ставится для того, чтобы не забивать стек. А вот после возращаемого типа для тогго же....

Код

complex& complex::operator+( const complex& a )
{
   r += a.r;
   i += a.i;
   return *this;
}


А вот это не совсем верно. Потому как в примере

Код

complex a = complex(1,3);
complex b = complex(6,8);
complex c = a + b;


переменная "a" теперь содержит значение (7,11)...

по мне, так надо вот так....
Код

complex& complex::operator+( const complex& a )
{
   return complex(r + a.r, i + a.i);
}

 
--------------------
Есть только один бог - Ассемблер, и С - пророк его. 
PM MAIL   Вверх
Daevaorn
Дата 15.6.2006, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Prehistorik @  15.6.2006,  12:12 Найти цитируемый пост)
А вот это не совсем верно. Потому как в примере

Точно. Вместо operator+ написал operator+=. Каюсь 
PM MAIL WWW   Вверх
Void
Дата 15.6.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(Prehistorik @  15.6.2006,  13:12 Найти цитируемый пост)
по мне, так надо вот так....

Код
complex& complex::operator+( const complex& a )
{
   return complex(r + a.r, i + a.i);
}

А теперь подумай, на что ты возвращаешь ссылку, и почему это работать не будет. 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Earnest
Дата 15.6.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Правильный оператор "+" должен возвращать не ссылку, а значение.
И быть константным. Или вообще реализовываться вне класса. И, конечно, не менять значений своих аргументов. Таким как написано выше должен быть оператор +=
Код

complex& complex::operator+=( const complex& a )
{
   r += a.r;
   i += a.i;
   return *this;
}
 


--------------------
...
PM   Вверх
AlanG
Дата 15.6.2006, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.5.2006
Где: РашЫн ФидирейшЫн

Репутация: нет
Всего: нет



Логика operator+. следующая:
Действия производимые над объектами типа + (сложение), 
например: 
complex c = a + b;
вызывают этот оператор(можно сказать функция). Поисходит следующее: объект a генерирует вызов operator+( const complex b), при этом втророй объект (b) посылается в эту функцию в качестве аргумента: complex c = a + b;


Код

#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 b)
{
   //Что-то нужно сделать?
 //Можно сделать что угодно но сейчас ты указал в обявлении этого оператора, что возвратишь 
 //ссылку на объект с типом complex
 //В принципе сдесь делай что угодно, но эта "функция" возбудится когда ты попытаешся "сложить" два объекта
  

   return *this; //this указывает на объект а, объект который сгенерировал вызов
}

int main()
{
complex a = complex(1,3);
complex b = complex(6,8);
complex *c = a + b; //Первый аргумент сгенерирует operator+,  результатом всего является присвоение ссылки на объект с типом complex, имя ему ты дал [B]c[/B].

return 0;
}


  

Это сообщение отредактировал(а) AlanG - 15.6.2006, 18:45
PM MAIL   Вверх
Earnest
Дата 15.6.2006, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



AlanG, это ты написал, как не надо делать, я надеюсь?
Не говоря уж о том, что код компилироваться не будет (путаешь ссылки с указателями).
А еще, в С++ функции редко "возбуждаются", это делают все больше исключения. smile  


--------------------
...
PM   Вверх
AlanG
Дата 15.6.2006, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.5.2006
Где: РашЫн ФидирейшЫн

Репутация: нет
Всего: нет



Дополню: В функцию неявно передается сылка на вызываемый объект, т.е. а в данном случае, к этому объекту и к его членам, например в твоем классе complex ты указал переменные и i, к этим членам можно обратится на "прямую", не указываея объект.

Код

class complex 
{
public:
    int r,i;
    complex(int re, int im){r=re; i=im;}
    complex operator+(complex);
};



complex* complex::operator+(complex b)
{
    r=i*b.i; //Перемножим переменные i из разных объектов, и присвоим итог переменной i
    //Заметь, что сдесь использовались две переменные, одня из "текущего" объекта,  а другая из b

   return *this; //this указывает на объект а, объект который сгенерировал вызов
}
int main()
{
complex a = complex(1,3);
complex b = complex(6,8);
complex *c = a + b; //Первый аргумент сгенерирует operator+,  результатом всего является присвоение ссылки на объект с типом complex, имя ему ты дал [B]c[/B].

return 0;


От себя: Лично мне нравится логика operator, она очень проста в понимании, и может пригодится в повседневной работе программисат.

Добавлено @ 18:58 
Цитата

AlanG, это ты написал, как не надо делать, я надеюсь?

Я не смотрю на код, я простопытаюсь логику выделить smile 
Может код ошибочный но не в этом суть. 
PM MAIL   Вверх
Earnest
Дата 15.6.2006, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



AlanG, ты извини, но такими объяснениями ты новичка вообще запутаешь. 

kkkggg
правильный оператор + должен быть таким (2 варианта):

Код

// 1 версия: оператор-член класса 
const complex complex::operator+(const complex& rhs) const
{
   complex res;
   res.r = r+rhs.r;
   res.i = i +rhs.i;
   return res;
}

// 2 версия: внешний оператор 
const complex operator+(const complex& lhs,const complex& rhs)
{
   complex res;
   res.r = lhs.r+rhs.r;
   res.i = lhs.i +rhs.i;
   return res;
}


Второй вариант лучше, т.к. позволяет компилятору выполнить преобразование левого операнда (скажем из ... тьфу, только сейчас заметила, что у тебя реальная и мнимая части представлены как целые  smile ... ну да ладно). 

 


--------------------
...
PM   Вверх
MAKCim
Дата 15.6.2006, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



все равно operator+ лучше реализовывать через operator+=
тем более, что его, имхо, обязательно нужно реализовывать
(тем более в случае complex) 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Earnest
Дата 16.6.2006, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Никто и не спорит.  


--------------------
...
PM   Вверх
AlanG
Дата 16.6.2006, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.5.2006
Где: РашЫн ФидирейшЫн

Репутация: нет
Всего: нет



Цитата

Второй вариант лучше, т.к. позволяет компилятору выполнить преобразование левого операнда (скажем из ... тьфу, только сейчас заметила, что у тебя реальная и мнимая части представлены как целые   ... ну да ладно). 

Можно по подробнее про реальную и мнимую часи smile ?
И про преобразование левого операнда.

 
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0691 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.