operator --
От: the_moon  
Дата: 29.11.01 07:50
Оценка:
Привет

как перегружается operator -- или ++ в классе,

и вообще где можно взять доку где в одном месте приведены все декларации операторов в С++.

Спасибо
KOPOTbILLIKA KPbIC
Re: operator --
От: migel  
Дата: 29.11.01 08:01
Оценка:
Здравствуйте the_moon, Вы писали:

TM>Привет


TM>как перегружается operator -- или ++ в классе,


TM>и вообще где можно взять доку где в одном месте приведены все декларации операторов в С++.


TM>Спасибо

хм
class MyClass
{
public:
MyClass& operator++(); // prefix
MyClass& operator++(int); //postfix
MyClass& operator--(); // prefix
MyClass& operator--(int); //postfix
}
Re[2]: operator --
От: Аноним  
Дата: 29.11.01 09:06
Оценка:
Здравствуйте migel, Вы писали:

Спасибо, но еще вопросик, а что мне делать с int, че то мне неочевидно и откуда он берется?

M>хм

M>class MyClass
M>{
M>public:
M>MyClass& operator++(); // prefix
M>MyClass& operator++(int); //postfix
M>MyClass& operator--(); // prefix
M>MyClass& operator--(int); //postfix
M>}
Re[3]: operator --
От: Vodka  
Дата: 29.11.01 09:14
Оценка:
Здравствуйте Аноним, Вы писали:

А>Здравствуйте migel, Вы писали:


А>Спасибо, но еще вопросик, а что мне делать с int, че то мне неочевидно и откуда он берется?


M>>хм

M>>class MyClass
M>>{
M>>public:
M>>MyClass& operator++(); // prefix
M>>MyClass& operator++(int); //postfix
M>>MyClass& operator--(); // prefix
M>>MyClass& operator--(int); //postfix
M>>}

int добавляет только для того, чтобы сигнатуры функций, реализующих префиксный и постфиксный операторы, отличались.
Re: operator --
От: Hollander Беларусь http://blogs.rsdn.org/ikemefula
Дата: 29.11.01 09:17
Оценка:
Здравствуйте the_moon, Вы писали:

TM>Привет


TM>как перегружается operator -- или ++ в классе,


TM>и вообще где можно взять доку где в одном месте приведены все декларации операторов в С++.



евангелие от Страуструпа, глава 11 — Перегрузка операторов


А перегружатся так

class X
{
X operator--();
X operator--(int); // член класса
};

X operator--(X&); // глоб функция
X operator--(X&,int);
Re[2]: operator --
От: the_moon  
Дата: 29.11.01 10:01
Оценка:
Спасибо вам братья по разуму :user: ;)
KOPOTbILLIKA KPbIC
Re[2]: operator --
От: Валиуллин Рамиль Вильевич Россия  
Дата: 29.11.01 12:24
Оценка:
Здравствуйте migel, Вы писали:

M>class MyClass

M>{
M>public:
M>MyClass& operator++(); // prefix
M>MyClass& operator++(int); //postfix
M>MyClass& operator--(); // prefix
M>MyClass& operator--(int); //postfix
M>}

Маленькое дополнение:
для постфиксных операторов логичнее возвращать значение не ссылкой, а значением
MyClass operator-- (int); // postfix
Re[3]: operator --
От: the_moon  
Дата: 29.11.01 12:40
Оценка:
Здравствуйте Валиуллин Рамиль Вильевич, Вы писали:

ВРВ>Маленькое дополнение:

ВРВ>для постфиксных операторов логичнее возвращать значение не ссылкой, а значением
ВРВ>MyClass operator-- (int); // postfix

Не идет, потому как память динамически выделяется в нутри, а дубликаты нехочу.
Да.., а почему логичнее, не понял? Ведь все равно будет, я так думаю,
сначала использован объект, а потом вызван оператор, потому возвращенный объект|ссылка
попадет в никуда.
KOPOTbILLIKA KPbIC
Re[4]: operator --
От: Ramil Россия  
Дата: 29.11.01 12:52
Оценка:
Здравствуйте the_moon, Вы писали:

ВРВ>>MyClass operator-- (int); // postfix


TM>Не идет, потому как память динамически выделяется в нутри, а дубликаты нехочу.

TM>Да.., а почему логичнее, не понял? Ведь все равно будет, я так думаю,
TM>сначала использован объект, а потом вызван оператор, потому возвращенный объект|ссылка
TM>попадет в никуда.

Можно делать и так, но тогда придется самому управлять памятью: выделять, потом освобождать в
какой-то момент. Зачем лишние сложности, когда можно обойтись и без них

Кстати у Страуструпа про это очень подробно расписано.
Re[4]: operator --
От: Ramil Россия  
Дата: 29.11.01 12:58
Оценка:
Здравствуйте the_moon, Вы писали:

ВРВ>>MyClass operator-- (int); // postfix


TM>Не идет, потому как память динамически выделяется в нутри, а дубликаты нехочу.

TM>Да.., а почему логичнее, не понял? Ведь все равно будет, я так думаю,

Тут не совсем понятно высказывание:
TM>сначала использован объект,
в каком смысле использован?

ТМ>а потом вызван оператор, потому возвращенный объект|ссылка

TM>попадет в никуда.
Re: operator --
От: Sergei  
Дата: 29.11.01 13:31
Оценка:
Здравствуйте the_moon, Вы писали:

TM>Привет


TM>как перегружается operator -- или ++ в классе,


TM>и вообще где можно взять доку где в одном месте приведены все декларации операторов в С++.

В Msdn overload operators
class Point
{
public:
// Declare prefix and postfix increment operators.
Point& operator++(); // Prefix increment operator.
Point operator++(int); // Postfix increment operator.

// Declare prefix and postfix decrement operators.
Point& operator--(); // Prefix decrement operator.
Point operator--(int); // Postfix decrement operator.

};
....
Реализация
Point& Point::operator++()
{
_x++;
_y++;
return *this;
}

Point Point::operator++(int)
{
Point temp = *this;
++*this;
return temp;
}

Аналогично для --

The same operators can be defined in file scope (globally) using the following function heads:


friend Point& operator++( Point& ) // Prefix increment
friend Point& operator++( Point&, int ) // Postfix increment
friend Point& operator--( Point& ) // Prefix decrement
friend Point& operator--( Point&, int ) // Postfix decrement
Re[5]: operator --
От: Аноним  
Дата: 29.11.01 14:45
Оценка:
Здравствуйте Ramil, Вы писали:

R>Тут не совсем понятно высказывание:

TM>>сначала использован объект,
R>в каком смысле использован?

Имелось ввиду если мы имеем цепочку

new_object = old_object++;

то по идее сначала вызовется оператор присваивания у new_object и в качестве параметра будет передан old_object, а затем будет вызван оператор ++ у old_object. Так я думаю будет по логике вещей. Потому то что выдаст operator++ не кому ненужно или я ошибаюсь?

А если у меня будет new_object = ++old_object; то просто сначала вызывается ++ у old_object, а только потом будет вызван оператор присваивания у new_object и опять же получается, то что я верну неважно.

Если ошибаюсь, скажите в чем?
Re[4]: operator --
От: Sergei  
Дата: 29.11.01 15:04
Оценка:
Здравствуйте the_moon, Вы писали:

ВРВ>>Маленькое дополнение:

ВРВ>>для постфиксных операторов логичнее возвращать значение не ссылкой, а значением
ВРВ>>MyClass operator-- (int); // postfix

TM>Не идет, потому как память динамически выделяется в нутри, а дубликаты нехочу.

TM>Да.., а почему логичнее, не понял? Ведь все равно будет, я так думаю,
TM>сначала использован объект, а потом вызван оператор, потому возвращенный объект|ссылка
TM>попадет в никуда.
Если ты хочешь реализовывать постфиксные операторы, то тебе в любом случае неоходимо возращать по значению. Если будешь возвращать по ссылке никакого отличия с префиксным не будет.
Т.е.
Temp=Object++;
В Temp должно быть значение старого объекта, а не нового
Re[2]: operator --
От: Юнусов Булат Россия  
Дата: 29.11.01 21:04
Оценка:
Здравствуйте Sergei, Вы писали:

S>Point& Point::operator++()

S>{
S> _x++;
S> _y++;
S> return *this;
S>}

S>Point Point::operator++(int)

S>{
S> Point temp = *this;
S> ++*this;
S> return temp;
S>}



Я конечно страшно извиняюсь но разве постфиксные инкремент или декремент не ДОЛЖНЫ возвращать const anyobject ?
вроде
const Foo Foo::operator++(int)
{
// делаем что надо
}
const Foo Foo::operator--(int)
{
// делаем что надо
}
Re[6]: operator --
От: Андрей Тарасевич Беларусь  
Дата: 29.11.01 22:28
Оценка:
Здравствуйте Аноним, Вы писали:

А>Имелось ввиду если мы имеем цепочку


А>new_object = old_object++;


А>то по идее сначала вызовется оператор присваивания у new_object и в качестве параметра будет передан old_object, а затем будет вызван оператор ++ у old_object. Так я думаю будет по логике вещей. Потому то что выдаст operator++ не кому ненужно или я ошибаюсь?


А>А если у меня будет new_object = ++old_object; то просто сначала вызывается ++ у old_object, а только потом будет вызван оператор присваивания у new_object и опять же получается, то что я верну неважно.


А>Если ошибаюсь, скажите в чем?


Ошибаешься. В обоих случаях сначала вызывается оператор ++, а потом оператор присваивания. Вернуть правильный результат, который затем пойдет на присваивание, — это уже задача оператора ++ (префиксного или постфиксного)
Best regards,
Андрей Тарасевич
Re[4]: operator --
От: Андрей Тарасевич Беларусь  
Дата: 29.11.01 22:33
Оценка:
Здравствуйте the_moon, Вы писали:

TM>Здравствуйте Валиуллин Рамиль Вильевич, Вы писали:


ВРВ>>Маленькое дополнение:

ВРВ>>для постфиксных операторов логичнее возвращать значение не ссылкой, а значением
ВРВ>>MyClass operator-- (int); // postfix

TM>Не идет, потому как память динамически выделяется в нутри, а дубликаты нехочу.

TM>Да.., а почему логичнее, не понял? Ведь все равно будет, я так думаю,
TM>сначала использован объект, а потом вызван оператор, потому возвращенный объект|ссылка
TM>попадет в никуда.

Операторы ++ и -- (как постфиксные, так и префиксные) обладают высоким приоритетом. Поэтому во многих случаях сначала будет вызван перегруженный ++/-- и в дальнейших вычислениях будет участвовать именно результат, возвращенный этим оператором. Так что возвращенный объект/ссылка попадет не в никуда.
Best regards,
Андрей Тарасевич
Re[3]: operator --
От: Андрей Тарасевич Беларусь  
Дата: 29.11.01 22:34
Оценка:
Здравствуйте Юнусов Булат, Вы писали:

ЮБ>Я конечно страшно извиняюсь но разве постфиксные инкремент или декремент не ДОЛЖНЫ возвращать const anyobject ?

ЮБ>вроде
ЮБ>const Foo Foo::operator++(int)
ЮБ>{
ЮБ> // делаем что надо
ЮБ>}
ЮБ>const Foo Foo::operator--(int)
ЮБ>{
ЮБ> // делаем что надо
ЮБ>}

Почему ты так считаешь?
Best regards,
Андрей Тарасевич
Re[6]: operator --
От: Ramil Россия  
Дата: 30.11.01 05:48
Оценка:
Здравствуйте Аноним, Вы писали:

А>Имелось ввиду если мы имеем цепочку


А>new_object = old_object++;


А>то по идее сначала вызовется оператор присваивания у new_object и в качестве параметра будет передан old_object, а затем будет вызван оператор ++ у old_object. Так я думаю будет по логике вещей. Потому то что выдаст operator++ не кому ненужно или я ошибаюсь?


А>А если у меня будет new_object = ++old_object; то просто сначала вызывается ++ у old_object, а только потом будет вызван оператор присваивания у new_object и опять же получается, то что я верну неважно.


А>Если ошибаюсь, скажите в чем?


Просто рассмотри следующее:
Перегруженные операторы инкремента/декремента old_object++ или ++old_object это просто краткий вариант old_object.operator++ (0) и old_object.operator () соответственно. Т.е. в выражениях в любом случае используются результат возвращенный этими функциями-членами.
Re[4]: operator --
От: Юнусов Булат Россия  
Дата: 30.11.01 08:07
Оценка:
Здравствуйте Андрей Тарасевич, Вы писали:

АТ>Здравствуйте Юнусов Булат, Вы писали:


ЮБ>>Я конечно страшно извиняюсь но разве постфиксные инкремент или декремент не ДОЛЖНЫ возвращать const anyobject ?

ЮБ>>вроде
ЮБ>>const Foo Foo::operator++(int)
ЮБ>>{
ЮБ>> // делаем что надо
ЮБ>>}
ЮБ>>const Foo Foo::operator--(int)
ЮБ>>{
ЮБ>> // делаем что надо
ЮБ>>}

АТ>Почему ты так считаешь?

Это Мейерс и та немеренная куча наших буржуйских братьев плюсовиков что помогала ему писать его книги так считают
Это потому что постфиксные операторы инк и декремента возвращают не this а по существу левую переменную представитель этого класса

вот пример
S>Point Point::operator++(int)
S>{
S> Point temp = *this;
S> ++*this;
S> return temp;
S>}


Если обявить возврат без const как сделано тут то будет возможна запись ака Point pt; pt++++; А this при этом поменяется только в первом вызове, а во втором будет менятся this от переменной получившейся в ходе первого вызова.
Я конечно не секунды не сомневаюсь что и вы лично и все в этом форуме так не пишут, но какое нибудь юное дарование из 10 А класса (всегда ненавидел юных дарований) считающее себя крутым пользуясь Вашей замечательной библиотекой возьмет и напишет! И не получет желаемого результата и начнет на весь мир трубить как хреново Вы пишете библиотеки (убил бы)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.