возвращаемое значение перегруженного приращения - PullRequest
2 голосов
/ 21 января 2009

В своем языке программирования C ++ Страуструп дает следующий пример для перегрузки inc / dec:

class Ptr_to_T {
    T* p;
    T* array ;
    int size;
public:
    Ptr_to_T(T* p, T* v, int s); // bind to array v of size s, initial value p
    Ptr_to_T(T* p); // bind to single object, initial value p
    Ptr_to_T& operator++(); // prefix
    Ptr_to_T operator++(int); // postfix
    Ptr_to_T& operator--(); // prefix
    Ptr_to_T operator--(int); // postfix
    T&operator*() ; // prefix
}

Почему префиксные операторы возвращаются по ссылке, а постфиксные операторы возвращаются по значению?

Спасибо.

Ответы [ 3 ]

17 голосов
/ 21 января 2009

Оператор postfix возвращает копию значения до того, как оно было увеличено, поэтому он должен в значительной степени возвращать временное значение. Префиксный оператор действительно возвращает текущее значение объекта, поэтому он может возвращать ссылку на его текущее значение.

8 голосов
/ 21 января 2009

Чтобы лучше понять, вы должны представить (или посмотреть), как эти операторы реализованы. Обычно префиксный оператор ++ будет записан более или менее так:

MyType& operator++()
{
    // do the incrementation
    return *this;
}

Поскольку this было изменено "на месте", мы можем вернуть ссылку на экземпляр, чтобы избежать бесполезной копии.

Вот код оператора постфикса ++:

MyType operator++(int)
{
    MyType tmp(*this); // create a copy of 'this'
    ++(*this); // use the prefix operator to perform the increment
    return tmp; // return the temporary
}

Поскольку постфиксный оператор возвращает временное значение, он должен возвращать его по значению (в противном случае вы получите висячую ссылку).

У C ++ Faq Lite также есть параграф на эту тему.

0 голосов
/ 21 января 2009

Предположим, я использую перегруженный преинкремент для увеличения приватного члена. Разве возвращение ссылки на закрытый член не превращает выражение ++ private_var в lvalue, что позволяет напрямую изменять закрытый член?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...