Понимание операторов - PullRequest
0 голосов
/ 09 мая 2019

Наш профессор дал нам практический тест с ответами, чтобы помочь нам в нашем предстоящем тесте.Я не понимаю, как ответ для этого кода 135.

Я понимаю, что такое класс, но я борюсь за то, как работают операторы.Для v{6} я понимаю, что для объекта v int v равно 13.Я думал, что в int main, что первое -v в (-v - v).print будет вычислено первым в операторе, который возвращает 2 * v, и что оно вернет 26.Тогда я думал, что они будут помещены в последний оператор

V operator-(int lop, const V& rop)
{
    return rop - lop;
}

, но я не думаю, что это так.Я поместил этот код в Visual Studio, чтобы возиться с ним, но я не понимаю, что происходит.

#include <iostream>
using namespace std;

class V
{
    int v;

public:
    V(int a = 3, int b = 7) : v{a + b}
    {
    }

    void print()
    {
        cout << v;
    }

    V operator-(const V& rop) const
    {
        return (3 * v) + (2 * rop.v) + 3;
    }

    V operator-()
    {
        return 2 * v;
    }
};

V operator-(int lop, const V& rop)
{
    return rop - lop;
}

int main() 
{
    V v{6};
    (-v - v).print();

    return 0;  
}

Ответы [ 2 ]

4 голосов
/ 09 мая 2019

Вау, это запутанный код, с повторно используемыми именами переменных, странными нетрадиционными операциями и тому подобным.Код особенно трудно следовать, потому что V может быть неявно составлен из целого числа, причем 7 всегда добавляется к этому целому числу;даже с отладчиком это заняло у меня несколько минут.Пожалуйста, никогда не пишите такой код, даже для развлечения!

Результат -v в main - это не int.Это V объект, неявно созданный из выражения 2 * v (= 26), в результате чего получается целое число члена со значением 33 (26 + 7).

Это как если бы вы написали:

V operator-()
{
    return V(2 * v);
}

или из-за аргумента по умолчанию:

V operator-()
{
    return V(2 * v, 7);
}

Затем вы берете этот новый возвращенный объект и передаете его члену operator-(const V&);применяется та же история.Это производит выражение 3*33 + 2*13 + 3, которое является 128;опять же, это используется для создания нового V (потому что это тип возврата!), поэтому добавьте 7, чтобы получить 135.

operator-(int lop, const V& rop) не входит в него, потому что вы никогда не выполняли вычитание междуint и V.

1 голос
/ 09 мая 2019

Результат -v - это не int, а V.
Таким образом, будет использовано вычитание, перегруженное членами.

Это эквивалентный код, без синтаксического сахара операторов, но с явным преобразованием возвращаемых значений:

class V
{
public:
    V(int a = 3, int b = 7) : v{a + b}
    {
    }

    void print()
    {
        cout << v;
    }

    V subtract(const V& rop) const
    {
        return V((3 * v) + (2 * rop.v) + 3);
    }

    V negate()
    {
        return V(2 * v);
    }
private:
    int v;
};


int main() 
{
    V v{6};
    (v.negate().subtract(v)).print();

    return 0;  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...