2015-01-14 4 views
2

Предположим, у меня есть класс с именем A, и у меня нет реализации класса. Что будет более дорогостоящим по шкале времени выполнения: Операция postfix или prefix ++?Перегрузка оператора ++ на C++

Пример:

void some_function{ 
    ... 
    A x; 

    ++x; 

    x++; 

    ... 
} 

Я читал в Интернете, что оператор суффикс x++ на классах будет делать 2 конструктора вызовов, но никаких объяснений не было дано. Я не могу найти для этого достойного объяснения. почему у нас есть 2 звонка, а у кого нет?

+1

http://www.parashift.com/c++-faq/increment-pre-post-speed.html – EdChum

+0

Возможный дубликат [Что это разница между i ++ и ++ i?] (http://stackoverflow.com/questions/3346450/what-is-the-difference-between-i-and-i) –

+0

@Satus, это не дубликат, это другой вопрос. Я знаю суффикс и префиксные различия. – Itzik984

ответ

7

Существует два возможных ответа на этот вопрос из-за того, что вы не знаете реализации класса (как вы говорите).

Сценарий один: Класс разумно

В этом случае семантика ++ аналогичны встроенных типов и стандартной библиотеки итераторов: ++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, чтобы соответствовать стандартной семантике, то, естественно, все ставки выключены, так как функции могут буквально ничего. Не зная о них больше, их нельзя сравнивать.

+0

Отличный ответ. Спасибо за объяснение – Itzik984

Смежные вопросы