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++ в постфиксной форме
Хотя возможно, что это просто результат копипасты.
Комментариев нет:
Отправить комментарий