Почему мы можем изменить объект класса внутри константной функции-члена

Vector2 Add (const Vector2& other) const
{
    return Vector2(x+ other.x, y+ other.y);
}

Функция является членом класса Vector2.

Если функция является константной, что означает, что она обещает не преобразовывать класс, почему мы тогда возвращаем этот тип, но все равно можем добавлять к нему что-то? Я искренне смущен этим. Нужна ясность, спасибо.

Это внутри области определения класса? В противном случае const не имеет значения.

πάντα ῥεῖ 25.05.2024 09:47

Это в классе Vector2, да

BeardlessDev 25.05.2024 09:49

@BeardlessDev Опубликуйте минимальный воспроизводимый пример, пожалуйста. Функция возвращает еще один экземпляр Vector2 no. Манипуляции с самим классом unstance там не выполняются.

πάντα ῥεῖ 25.05.2024 09:51

«Но можно ли еще что-то добавить к нему?...» Вы ничего к нему не добавляете. Вы создаете объект с помощью конструктора, а затем возвращаете этот объект.

user12002570 25.05.2024 09:52

Код не изменяет ни *this, ни other. Он создает совершенно новый Vector2, а не const.

BoP 25.05.2024 09:53

@BeardlessDev Как я уже сказал в ответе ниже, когда вы написали Vector2(x+ other.x, y+ other.y), вы на самом деле не изменяете объект, а вместо этого создаете новый объект, используя параметризованный ctor, а затем возвращаете этот объект.

user12002570 25.05.2024 09:57

@KarlKnechtel Я не думаю, что этот дурак ответит на вопрос ОП. Похоже, они на самом деле знают, что внутри тела константной функции-члена мы не можем изменить объект класса. Вопрос, который они задают, заключается в том, что они, похоже, думают, что return Vector2(x+ other.x, y+ other.y); каким-то образом выглядит так, как будто он меняет свойства объекта.

user12002570 25.05.2024 09:59

@user12002570 user12002570 ... подожди, что? Я искренне не могу понять, как можно думать, что использование конструктора, то есть того, что специально существует для создания нового экземпляра, будет изменять *this изнутри функции-члена. Вы уверены, что это заблуждение ОП? (Это важно, потому что, предполагая, что это может быть что-то, о чем мог подумать кто-то другой, вопрос необходимо отредактировать так, чтобы он точно отражал это заблуждение - с правильной терминологией.)

Karl Knechtel 25.05.2024 10:07

@KarlKnechtel Возможно, вам/мне это покажется невозможным (поскольку мы опытные пользователи C++). Но вполне возможно, что новичок/новичок может не знать всех деталей и подумать, что объект изменяется в этом операторе возврата. Я имею в виду, что мы должны быть открыты для мышления других людей. Нам (опытным пользователям) вопрос может показаться глупым/очень простым, но для тех, кто новичок в C++, синтаксис может предположить, что объект меняется. Я просто говорю о некоторых возможностях и открыт для таких возможностей. Вопрос в том, чтобы подтвердить ОП, что объект на самом деле не меняется.

user12002570 25.05.2024 10:13

Невозможно правильно исправить неправильное представление, не понимая, что лежит в основе мыслительного процесса.

Karl Knechtel 25.05.2024 10:18

Совершенно ясно, о чем спрашивает ОП (по крайней мере, для меня). И дураки не применимы.

user12002570 25.05.2024 10:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
11
135
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

почему мы тогда возвращаем этот тип, но все равно можем добавлять к нему что-то?

На самом деле вы никак не изменяете текущий объект класса. Вместо этого, когда вы пишете Vector2(x+ other.x, y+ other.y), вы создаете другой объект типа класса, используя параметризованный ctor с x+ other.x и y+ other.y в качестве аргументов, а затем возвращаете этот другой объект.

Когда кто-то сбит с толку, он не обязательно смущен в том смысле, что делает логические выводы из ошибочного предположения, иногда он просто смущен и вообще не мыслит особенно логически. Все, что нужно, это четкое объяснение.

john 25.05.2024 10:33

@john Да, важно прояснить понимание ОП того факта, что оператор возврата, использующий ctor, на самом деле не меняет объект. Это цель моего ответа. И обманы неприменимы, поэтому я снова открыл.

user12002570 25.05.2024 10:35

Если функция является константной, что означает, что она обещает не преобразовывать класс, почему мы тогда возвращаем этот тип, но все равно можем добавлять к нему что-то?

Вот ваше заблуждение: класс

const предотвращает изменение текущего класса >>экземпляр<< (*this), но не позволяет создавать другой экземпляр класса и возвращать его по значению.

По сути, этот код можно переписать следующим образом (вероятно, оптимизированный компилятором для получения тех же результатов):

Vector2 Add (const Vector2& other) const
{
    Vector2 result = 
        Vector2(this->x+ other.x, this->y+ other.y);
    return result;
}

Возможно, так будет яснее, что происходит на самом деле.

Другие вопросы по теме