Страницы

Поиск по вопросам

суббота, 21 декабря 2019 г.

Объясните особенности перегрузки операторов в С++

#cpp


class Integer
{
private:
    int value;
public:
    Integer(int i): value(i) 
    {}
    const Integer operator+(const Integer& rv) const {
        return (value + rv.value);
    }
};


Возьмём за основу этот код. И вот вопросы:
1. Почему возвращаемое значение не является ссылкой? Разве не рациональнее было бы
написать const Integer&... 
2. Что означает, что возвращаемое значение является const? Что в данном случае я
не смогу поменять с возвращаемым объектом?
    


Ответы

Ответ 1



Почему возвращаемое значение не является ссылкой? Разве не рациональнее было бы написать const Integer&... Встречный вопрос: а ссылку на что вы будете возвращать? Результатом операции сложения левого и правого операнда является новый объект. Его вы и возвращаете. В данном месте просто семантика говорит возвращать объект, а не ссылку на него. А дальше... Скорее всего сработает оптимизация VRO и лишних конструкторов/копирований вызываться не будет. Что означает, что возвращаемое значение является const? Что в данном случае я не смогу поменять с возвращаемым объектом? Нет. Нужно спрашивать дизайнера класса. Скорее всего сделано, дабы нельзя было у временного объекта вызвать неконтантные методы, например в таком случае: Integer a{1}; Integer b{2}; (a + b).someMethod(); // или (a + b)++; // при наличии реализации operator++ в постфиксной форме Если метод someMethod() будет без квалификатора const, то, с точки зрения дизайна, он может изменить состояние класса и с данной реализацией будет ошибка компиляции. Поиграться можно тут: http://ideone.com/6ILKdJ Просто присваивание создаст "копию" и константность на вас никак не повлияет: вы уже будете работать с другим объектом, т.е. в код ниже абсолютно легитимен: Integer a{1}; Integer b{2}; Integer c = a + b c++; // при наличии реализации operator++ в постфиксной форме Хотя возможно, что это просто результат копипасты.

Ответ 2



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

Комментариев нет:

Отправить комментарий