Vector2 Add (const Vector2& other) const
{
return Vector2(x+ other.x, y+ other.y);
}
Функция является членом класса Vector2.
Если функция является константной, что означает, что она обещает не преобразовывать класс, почему мы тогда возвращаем этот тип, но все равно можем добавлять к нему что-то? Я искренне смущен этим. Нужна ясность, спасибо.
Это в классе Vector2, да
@BeardlessDev Опубликуйте минимальный воспроизводимый пример, пожалуйста. Функция возвращает еще один экземпляр Vector2 no. Манипуляции с самим классом unstance там не выполняются.
«Но можно ли еще что-то добавить к нему?...» Вы ничего к нему не добавляете. Вы создаете объект с помощью конструктора, а затем возвращаете этот объект.
Код не изменяет ни *this, ни other. Он создает совершенно новый Vector2, а не const.
@BeardlessDev Как я уже сказал в ответе ниже, когда вы написали Vector2(x+ other.x, y+ other.y), вы на самом деле не изменяете объект, а вместо этого создаете новый объект, используя параметризованный ctor, а затем возвращаете этот объект.
@KarlKnechtel Я не думаю, что этот дурак ответит на вопрос ОП. Похоже, они на самом деле знают, что внутри тела константной функции-члена мы не можем изменить объект класса. Вопрос, который они задают, заключается в том, что они, похоже, думают, что return Vector2(x+ other.x, y+ other.y); каким-то образом выглядит так, как будто он меняет свойства объекта.
@user12002570 user12002570 ... подожди, что? Я искренне не могу понять, как можно думать, что использование конструктора, то есть того, что специально существует для создания нового экземпляра, будет изменять *this изнутри функции-члена. Вы уверены, что это заблуждение ОП? (Это важно, потому что, предполагая, что это может быть что-то, о чем мог подумать кто-то другой, вопрос необходимо отредактировать так, чтобы он точно отражал это заблуждение - с правильной терминологией.)
@KarlKnechtel Возможно, вам/мне это покажется невозможным (поскольку мы опытные пользователи C++). Но вполне возможно, что новичок/новичок может не знать всех деталей и подумать, что объект изменяется в этом операторе возврата. Я имею в виду, что мы должны быть открыты для мышления других людей. Нам (опытным пользователям) вопрос может показаться глупым/очень простым, но для тех, кто новичок в C++, синтаксис может предположить, что объект меняется. Я просто говорю о некоторых возможностях и открыт для таких возможностей. Вопрос в том, чтобы подтвердить ОП, что объект на самом деле не меняется.
Невозможно правильно исправить неправильное представление, не понимая, что лежит в основе мыслительного процесса.
Совершенно ясно, о чем спрашивает ОП (по крайней мере, для меня). И дураки не применимы.





почему мы тогда возвращаем этот тип, но все равно можем добавлять к нему что-то?
На самом деле вы никак не изменяете текущий объект класса. Вместо этого, когда вы пишете Vector2(x+ other.x, y+ other.y), вы создаете другой объект типа класса, используя параметризованный ctor с x+ other.x и y+ other.y в качестве аргументов, а затем возвращаете этот другой объект.
Когда кто-то сбит с толку, он не обязательно смущен в том смысле, что делает логические выводы из ошибочного предположения, иногда он просто смущен и вообще не мыслит особенно логически. Все, что нужно, это четкое объяснение.
@john Да, важно прояснить понимание ОП того факта, что оператор возврата, использующий ctor, на самом деле не меняет объект. Это цель моего ответа. И обманы неприменимы, поэтому я снова открыл.
Если функция является константной, что означает, что она обещает не преобразовывать класс, почему мы тогда возвращаем этот тип, но все равно можем добавлять к нему что-то?
Вот ваше заблуждение: класс
const предотвращает изменение текущего класса >>экземпляр<< (*this), но не позволяет создавать другой экземпляр класса и возвращать его по значению.
По сути, этот код можно переписать следующим образом (вероятно, оптимизированный компилятором для получения тех же результатов):
Vector2 Add (const Vector2& other) const
{
Vector2 result =
Vector2(this->x+ other.x, this->y+ other.y);
return result;
}
Возможно, так будет яснее, что происходит на самом деле.
Это внутри области определения класса? В противном случае
constне имеет значения.