Модераторы: 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   Вверх
Earnest
Дата 16.6.2006, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Да вот же код класса с интами в качестве реальной и мнимой частей:
Код

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

Цитата(AlanG @  16.6.2006,  10:01 Найти цитируемый пост)
И про преобразование левого операнда.

Если определено преобразование из double в complex (например, не explicit конструктор с один аргументом double), то в таком случае:
Код

double a = ...;
complex b = ...;
complex с = a + b;   // будет работать только при внешнем операторе +
complex d = b + a;   // будет работать в любом случае

компилятор сможет использовать оператор сложения комплексных чисел только в том случае, если он определен как внешний. А с точки зрения математики такая запись вполне естественна и не должна зависеть от порядка аргументов. 


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


Шустрый
*


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

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



Цитата

Да вот же код класса с интами в качестве реальной и мнимой частей:

Реальное здесь переменные r и i, а мнимое, их инициализация  (:r(re),i(im) {}
)что ли?  Чет не вкурю логику smile .

Цитата

Если определено преобразование из double в complex (например, не explicit конструктор с один аргументом double), то в таком случае:

Определено программой или пользователем? Если пользователем, то как?

Цитата

complex с = a + b;   // будет работать только при внешнем операторе +

А я считал что будет работать из-за того что второй аргумент является типом[ B]complex[/B], Оператор ветдь принимает тип complex. Или я ошибаюсь smile ???

Можно по подробнее описывать, а то я моло что понимаю smile , все-таки начинающий.

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


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


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

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



Цитата

Определено программой или пользователем? Если пользователем, то как?

программу пишет программист  smile 
Код

struct A
{
    A(int) {}
};

struct B
{
    explicit B(int) {}
};

void F(A a) {}
void G(B b) {}

int main()
{
    F(12); // OK
    G(12); // Error
    return 0;
}
 


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

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


Эксперт
****


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

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



Цитата(AlanG @  16.6.2006,  13:32 Найти цитируемый пост)
А я считал что будет работать из-за того что второй аргумент является типом[ B]complex[/B], 

Если сложение реализовано как метод класса complex, то преобразовать a (которое у нас double)  в комплекс, а потом вызвать для него operator + компилятор не догадается. А для double оператора + (complex) нет.
То, как компилятор разрешает перегруженные имена, называется поиском Кенига. Во многих книгах по C++ это описано, почитай, весьма полезно. Вкратце, компилятор начинает с поиска подходящего метода класса. Если не нашел, ищет глобальный оператор в данной области действия (scope). И т.д. Важно то, что при поиске методов класса компилятор использует точный тип левого операнда. Т.е. методы класса complex вообще проверяться не будут, т.к. левый операнд у нас double.
 


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


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


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

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



Цитата

То, как компилятор разрешает перегруженные имена, называется поиском Кенига.

Я полагаю поиск Кенига - это поиск имен в пространстве имен аргумента
Т. е если параметр принадлежит какому-то пространству имен и вызывается функция с этим параметром в качестве аргумента, то перегрузка идет с учетом поиска этой функции в этом пространстве имен 


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

PM MAIL   Вверх
UnrealMan
Дата 17.6.2006, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(MAKCim @  15.6.2006,  20:52 Найти цитируемый пост)
все равно operator+ лучше реализовывать через operator+=

В общем случае такой подход, как мне кажется, не очень-то хорош.
Если требуется безопасный в отношении исключений код (в данной задаче это неактуально), то в operator+= появятся накладные расходы по сохранению старого значения, которые совершенно незачем переносить в operator+. Если же делать наоборот (operator+= реализовывать через operator+), то в данной задаче имеем лишнее копирование в operator+=. Так что если хочется общности, то лучше использовать стороннюю функцию и выражать оба оператора через неё:

Код
static complex &Addition(complex &dst, const complex &src)
{
    dst.r += src.r;
    dst.i += src.i;
    return dst;
}
friend complex operator +(complex a, const complex &b)
{
    return Addition(a, b);
}
complex &operator +=(const complex &c)
{
    return Addition(*this, c);

/* примерный код для обеспечения безопасности (если бы таковая потребовалась):
    complex tmp = *this;
    swap(Addition(tmp, c));
    return *this;
*/
}
void swap(complex &c)
{
    std::swap(r, c.r);
    std::swap(i, c.i);
}
 

Это сообщение отредактировал(а) UnrealMan - 17.6.2006, 18:01
PM MAIL   Вверх
UnrealMan
Дата 17.6.2006, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Earnest @  15.6.2006,  18:14 Найти цитируемый пост)
Правильный оператор "+" должен возвращать не ссылку, а значение.
И быть константным. 

Насколько строго должно выполняться требование константности? 
PM MAIL   Вверх
AlanG
Дата 17.6.2006, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

. А для double оператора + (complex) нет.

И все таки: Определение operator + () в классе предполагает (нужна для) обработку при соответствующих действиях (типа + (сложение) или / (деление)) над объектами соответствующего класса??? При чем вызываются эти операторы обычно  левым оператором (вернее operatorу() неявно передается ссылка на этот объект), при бинарной операции? Т.е. это как команда для компилятора, что нужно совершить те действия которые объявлены в теле operato+().   

Это сообщение отредактировал(а) AlanG - 17.6.2006, 13:44
PM MAIL   Вверх
UnrealMan
Дата 17.6.2006, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(AlanG @  17.6.2006,  13:43 Найти цитируемый пост)
При чем вызываются эти операторы обычно  левым оператором (вернее operatorу() неявно передается ссылка на этот объект), при бинарной операции? 

Что ещё за левый оператор такой? :-) Наверно, ты имел в виду левый операнд, но тогда не понятно, как это операнд может вызывать оператор :-)

Для данного найденного в коде плюсика ищется соответствующий (наиболее подходящий – исходя из количества операндов, а также их типов) operator+. А вообще да будет Страуструп тебе в помощь. 
PM MAIL   Вверх
Earnest
Дата 17.6.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(UnrealMan @  17.6.2006,  14:17 Найти цитируемый пост)
Насколько строго должно выполняться требование константности?  

Это общепринятая идиома: оператор + не изменяет своих операндов - т.е. является константным, если определяется как метод.

Цитата(MAKCim @  16.6.2006,  22:08 Найти цитируемый пост)
Я полагаю поиск Кенига - это поиск имен в пространстве имен аргумента

Насколько я помню, это принцип поиска имен в С++ вообще, в том числе и то, что ты сказал.
 


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


Опытный
**


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

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



Цитата(Earnest @  17.6.2006,  17:26 Найти цитируемый пост)
Это общепринятая идиома: оператор + не изменяет своих операндов 

Я про другую константность подумал: возвращаемого значения. 
PM MAIL   Вверх
MAKCim
Дата 17.6.2006, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата

Насколько я помню, это принцип поиска имен в С++ вообще, в том числе и то, что ты сказал.

Поиск Кенига понятие более конкретное в отличие от просто "поиск" 


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

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


Эксперт
****


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

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



Цитата(UnrealMan @  17.6.2006,  19:07 Найти цитируемый пост)
Я про другую константность подумал: возвращаемого значения.  

Возвращаемое значение делают константным, чтобы ему нельзя было присваивать, т.е. компилятор ругался на конструкции типа a+b = f;
С моей точки зрения это из разряда "святее папы римского", т.е. не слишком обязательно. 


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


Шустрый
*


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

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



Цитата

Для данного найденного в коде плюсика ищется соответствующий (наиболее подходящий – исходя из количества операндов, а также их типов) operator+.

Ну это понятно.   

Цитата

А вообще да будет Страуструп тебе в помощь.  

Уже помогает, купил >1000 страниц логического счястья smile 
 
PM MAIL   Вверх
takedo
Дата 19.6.2006, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



UnrealMan, ставлю плюсик, но по моему не освещён вопрос о том, что плюс может быть в выражении с = (а+б+с)*в+..., то есть когда в формуле участвуют несколько операторов smile  


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
UnrealMan
Дата 19.6.2006, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(takedo @  19.6.2006,  12:28 Найти цитируемый пост)
но по моему не освещён вопрос о том, что плюс может быть в выражении с = (а+б+с)*в+..., то есть когда в формуле участвуют несколько операторов 

Там же: 3.2 Сводка операций
Там, правда, есть небольшая ошибочка в приоритетах: постфиксные инкремент и декремент на самом деле имеют тот же приоритет, что и [] (а также другие операторы в этой группе), а sizeof expr, напротив, имеет меньший приоритет (такой же, как у префиксного инкремента и т.д.) 
PM MAIL   Вверх
kkkggg
Дата 28.6.2006, 05:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

#include <iostream.h>
class complex 
{
public:
double r,i;
complex (double re,double im) {r=re; i=im;}
complex& operator+(const complex&);
};

complex& complex::operator+(const complex& ARG)
{
    complex temp = complex(0,0);
    temp.r = r + ARG.r;
    temp.i = i + ARG.i;
    return temp;
}

int main ()
{
complex a = complex(3,5);
complex b = complex(3,5);
complex c = complex(2,4);
complex d = a+b+c;                                 //!!
cout << a.r << "  " << a.i << endl;
cout << b.r << "  " << b.i << endl;
cout << c.r << "  " << c.i << endl;
cout << d.r << "  " << d.i << endl;

return 0;
}


Проблема в вычислениях, когда d = a+b всё ок, а когда d = a+b+c, вот тут проблема. Посмотрите что не так, может оператор я не доконца определил? 
PM MAIL   Вверх
AlanG
Дата 28.6.2006, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Проблема в вычислениях, когда d = a+b всё ок, а когда d = a+b+c, вот тут проблема. Посмотрите что не так, может оператор я не доконца определил?  

Наверно так, думаю что надо еще один аргумент определить в операторе, если ты конечно хочешь принимать два аргумента. Кстати напомню, что в оператор кроме аргументов передается еще и ссылка на вызывающий объект, т.е. в данном случае это объект d, он передается не явно, и ссылатся на него можно с помощъю this в  теле оператора.

Код

complex& complex::operator+(const complex& ARG, const complex& ARG2)


Все таки у тебя он  определен один, с принимающими аргументами в одном кол-ве (const complex& ARG). Можно в принципе определить несколько, с разным кол-вом аргументов, и тогда компилятор сам выберет самый подходящий оператор:
Код


complex& complex::operator+(const complex& ARG)  //Оператор принимает один аргумент
{
    complex temp = complex(0,0);
    temp.r = r + ARG.r;
    temp.i = i + ARG.i;
    return temp;
}

 complex& complex::operator+(const complex& ARG, const complex& ARG2)  //Оператор !один аргумент
{
    complex temp = complex(1,1);
    temp.r = r + ARG.r;
    temp.i = i + ARG2.i;
    return temp;
}





    

Это сообщение отредактировал(а) AlanG - 28.6.2006, 07:59
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.0838 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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