Страницы

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

пятница, 9 ноября 2018 г.

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

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? Что в данном случае я не смогу поменять с возвращаемым объектом?


Ответ

Почему возвращаемое значение не является ссылкой? Разве не рациональнее было бы написать 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++ в постфиксной форме
Хотя возможно, что это просто результат копипасты.

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

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