Здравствуйте 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>}
Здравствуйте Аноним, Вы писали:
А>Здравствуйте 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 добавляет только для того, чтобы сигнатуры функций, реализующих префиксный и постфиксный операторы, отличались.
Здравствуйте the_moon, Вы писали:
TM>Привет
TM>как перегружается operator -- или ++ в классе,
TM>и вообще где можно взять доку где в одном месте приведены все декларации операторов в С++.
евангелие от Страуструпа, глава 11 — Перегрузка операторов
А перегружатся так
class X
{
X operator--();
X operator--(int); // член класса
};
X operator--(X&); // глоб функция
X operator--(X&,int);
Здравствуйте Валиуллин Рамиль Вильевич, Вы писали:
ВРВ>Маленькое дополнение: ВРВ>для постфиксных операторов логичнее возвращать значение не ссылкой, а значением ВРВ>MyClass operator-- (int); // postfix
Не идет, потому как память динамически выделяется в нутри, а дубликаты нехочу.
Да.., а почему логичнее, не понял? Ведь все равно будет, я так думаю,
сначала использован объект, а потом вызван оператор, потому возвращенный объект|ссылка
попадет в никуда.
Здравствуйте the_moon, Вы писали:
ВРВ>>MyClass operator-- (int); // postfix
TM>Не идет, потому как память динамически выделяется в нутри, а дубликаты нехочу. TM>Да.., а почему логичнее, не понял? Ведь все равно будет, я так думаю, TM>сначала использован объект, а потом вызван оператор, потому возвращенный объект|ссылка TM>попадет в никуда.
Можно делать и так, но тогда придется самому управлять памятью: выделять, потом освобождать в
какой-то момент. Зачем лишние сложности, когда можно обойтись и без них
Кстати у Страуструпа про это очень подробно расписано.
Здравствуйте the_moon, Вы писали:
ВРВ>>MyClass operator-- (int); // postfix
TM>Не идет, потому как память динамически выделяется в нутри, а дубликаты нехочу. TM>Да.., а почему логичнее, не понял? Ведь все равно будет, я так думаю,
Тут не совсем понятно высказывание: TM>сначала использован объект,
в каком смысле использован?
ТМ>а потом вызван оператор, потому возвращенный объект|ссылка TM>попадет в никуда.
Здравствуйте 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.
Здравствуйте Ramil, Вы писали:
R>Тут не совсем понятно высказывание: TM>>сначала использован объект, R>в каком смысле использован?
Имелось ввиду если мы имеем цепочку
new_object = old_object++;
то по идее сначала вызовется оператор присваивания у new_object и в качестве параметра будет передан old_object, а затем будет вызван оператор ++ у old_object. Так я думаю будет по логике вещей. Потому то что выдаст operator++ не кому ненужно или я ошибаюсь?
А если у меня будет new_object = ++old_object; то просто сначала вызывается ++ у old_object, а только потом будет вызван оператор присваивания у new_object и опять же получается, то что я верну неважно.
Здравствуйте the_moon, Вы писали:
ВРВ>>Маленькое дополнение: ВРВ>>для постфиксных операторов логичнее возвращать значение не ссылкой, а значением ВРВ>>MyClass operator-- (int); // postfix
TM>Не идет, потому как память динамически выделяется в нутри, а дубликаты нехочу. TM>Да.., а почему логичнее, не понял? Ведь все равно будет, я так думаю, TM>сначала использован объект, а потом вызван оператор, потому возвращенный объект|ссылка TM>попадет в никуда.
Если ты хочешь реализовывать постфиксные операторы, то тебе в любом случае неоходимо возращать по значению. Если будешь возвращать по ссылке никакого отличия с префиксным не будет.
Т.е.
Temp=Object++;
В Temp должно быть значение старого объекта, а не нового
Я конечно страшно извиняюсь но разве постфиксные инкремент или декремент не ДОЛЖНЫ возвращать const anyobject ?
вроде
const Foo Foo::operator++(int)
{
// делаем что надо
}
const Foo Foo::operator--(int)
{
// делаем что надо
}
Здравствуйте Аноним, Вы писали:
А>Имелось ввиду если мы имеем цепочку
А>new_object = old_object++;
А>то по идее сначала вызовется оператор присваивания у new_object и в качестве параметра будет передан old_object, а затем будет вызван оператор ++ у old_object. Так я думаю будет по логике вещей. Потому то что выдаст operator++ не кому ненужно или я ошибаюсь?
А>А если у меня будет new_object = ++old_object; то просто сначала вызывается ++ у old_object, а только потом будет вызван оператор присваивания у new_object и опять же получается, то что я верну неважно.
А>Если ошибаюсь, скажите в чем?
Ошибаешься. В обоих случаях сначала вызывается оператор ++, а потом оператор присваивания. Вернуть правильный результат, который затем пойдет на присваивание, — это уже задача оператора ++ (префиксного или постфиксного)
Здравствуйте the_moon, Вы писали:
TM>Здравствуйте Валиуллин Рамиль Вильевич, Вы писали:
ВРВ>>Маленькое дополнение: ВРВ>>для постфиксных операторов логичнее возвращать значение не ссылкой, а значением ВРВ>>MyClass operator-- (int); // postfix
TM>Не идет, потому как память динамически выделяется в нутри, а дубликаты нехочу. TM>Да.., а почему логичнее, не понял? Ведь все равно будет, я так думаю, TM>сначала использован объект, а потом вызван оператор, потому возвращенный объект|ссылка TM>попадет в никуда.
Операторы ++ и -- (как постфиксные, так и префиксные) обладают высоким приоритетом. Поэтому во многих случаях сначала будет вызван перегруженный ++/-- и в дальнейших вычислениях будет участвовать именно результат, возвращенный этим оператором. Так что возвращенный объект/ссылка попадет не в никуда.
Здравствуйте Юнусов Булат, Вы писали:
ЮБ>Я конечно страшно извиняюсь но разве постфиксные инкремент или декремент не ДОЛЖНЫ возвращать const anyobject ? ЮБ>вроде ЮБ>const Foo Foo::operator++(int) ЮБ>{ ЮБ> // делаем что надо ЮБ>} ЮБ>const Foo Foo::operator--(int) ЮБ>{ ЮБ> // делаем что надо ЮБ>}
Здравствуйте Аноним, Вы писали:
А>Имелось ввиду если мы имеем цепочку
А>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 () соответственно. Т.е. в выражениях в любом случае используются результат возвращенный этими функциями-членами.
Здравствуйте Андрей Тарасевич, Вы писали:
АТ>Здравствуйте Юнусов Булат, Вы писали:
ЮБ>>Я конечно страшно извиняюсь но разве постфиксные инкремент или декремент не ДОЛЖНЫ возвращать 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 А класса (всегда ненавидел юных дарований) считающее себя крутым пользуясь Вашей замечательной библиотекой возьмет и напишет! И не получет желаемого результата и начнет на весь мир трубить как хреново Вы пишете библиотеки (убил бы)