Об операторе перегрузки

Мой вопрос в том, почему this->var автоматически выберет 12, а obj.var просто выберет 55? Почему this->var не 55? Это потому, что позиция, в которой он размещен? (Я имею в виду this->var+obj.var, где this-> помещается перед знаком «+»), и если я изменю код следующим образом: res.var= obj .var-это->вар; , кажется, что this->var все еще 12. Таким образом, похоже, что код obj1 + obj2, если obj2 находится «после» знака «+», это тот, который выбрасывается в &obj, это правильный вывод ? Спасибо!

#include <iostream>
using namespace std;
class MyClass {
    public:
        int var;
        MyClass() { }
        MyClass(int a)
        : var(a) { }
        MyClass operator+(MyClass &obj) {//here's my problem
            MyClass res;
            res.var= this->var+obj.var;//here's my problem
            return res; 
        }
};
int main() {
    MyClass obj1(12), obj2(55);
    MyClass res = obj1+obj2;//here's mt problem
    cout << res.var;
}

Добро пожаловать в Stack Overflow. Причина в том, что операторы работают слева направо. Итак, obj1 (который в операторе + равен this) является левым, поэтому у него будет 12. Думайте об этом как о вызове функции: obj1.Add(obj2). В этом случае вы передаете obj2 (что равно 55). Здесь происходит то же самое.

Andy 25.06.2019 04:51

Это 2 отдельных объекта. this в этом контексте относится к obj1, который содержит значение 12, а var относится к obj2, который содержит значение 55.

user10957435 25.06.2019 05:05

Кроме того, если это вас сбивает с толку, я настоятельно рекомендую получить книга С++, чтобы помочь вам.

user10957435 25.06.2019 05:06
obj1 + obj2 то же, что obj1.operator+(obj2).
molbdnilo 25.06.2019 08: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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
4
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

В С++ все операторы имеют правила ассоциативности. Аддиктивные, мультипликативные, сдвиговые, логические и т. д. операторы являются лево-правоассоциативными. Унарные операторы присваивания ассоциативны справа налево. Поэтому всякий раз, когда вы используете левые ассоциативные операторы, компилятор читает их слева направо, как и ваш код.

Ассоциативность имеет значение только тогда, когда задействовано более одного оператора (например, в 3 - 2 - 1), и здесь она совершенно неуместна. *this оператора-члена — это всегда левый операнд.

molbdnilo 26.06.2019 01:39

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

Как использовать тип std::variant с директивой %type
Как запустить gcov на голом железе (без файловой системы)
Есть ли способ избежать попадания функции constexpr, используемой в заголовочном файле, в глобальную область без дополнительного пространства имен для нее?
Избегайте проверки одного и того же условия на каждом этапе цикла в C++
Почему изменение ссылки на указатель не меняет его исходное значение?
Как использовать массив абстрактных объектов? Недопустимая ошибка абстрактного типа
Как в С++ я могу вернуть число к его нормальной форме после использования научного свойства из функции setiosflags() в библиотеке #include "iomanip"
Как перегрузить метод базового класса, переданный в качестве параметра в класс шаблона в С++?
С++ fstream не найдет относительный путь
Я действительно не понимаю, почему я получаю сообщение об ошибке при создании общего указателя класса шаблона