Существует два возможных ответа на этот вопрос из-за того, что вы не знаете реализации класса (как вы говорите).
Сценарий один: Класс разумно
В этом случае семантика ++
аналогичны встроенных типов и стандартной библиотеки итераторов: ++x
является прединкремента, x++
является postincrement.
В таком случае ++x
возвращает значение x
после приращения. На самом деле ожидается, что ++x
вернет x
по ссылке, делая ++ ++ x
юридическим. Типичным вариантом будет:
A& A::operator++()
{
increment_somehow();
return *this;
}
Как вы видите, копирование (строительство) не требуется.
x++
, с другой стороны, возвращает значение до прирост. Это означает, что он должен хранить значение где-нибудь, чтобы вернуть его. Типичная реализация будет:
A A::operator++(int)
{
A old(*this); // copy construction
++(*this); // re-use preincrement to keep semantics consistent
return old; // move construction of return value (possibly elided)
}
Как мои комментарии выше показывает, есть два конструктора вызовов, связанные (несмотря на то, один из них может быть опущена).
Сценарий два: Класс произволен
Если префикс и постфикс ++
не indended, чтобы соответствовать стандартной семантике, то, естественно, все ставки выключены, так как функции могут буквально ничего. Не зная о них больше, их нельзя сравнивать.
http://www.parashift.com/c++-faq/increment-pre-post-speed.html – EdChum
Возможный дубликат [Что это разница между i ++ и ++ i?] (http://stackoverflow.com/questions/3346450/what-is-the-difference-between-i-and-i) –
@Satus, это не дубликат, это другой вопрос. Я знаю суффикс и префиксные различия. – Itzik984