#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 после списка аргументов в объявлении)
Комментариев нет:
Отправить комментарий