了解操作员

时间:2019-05-09 11:09:42

标签: c++ operators

我们的教授给了我们一个实践测试,并给出了答案,以帮助我们进行即将到来的测试。我不知道此代码的答案是135

我了解什么是课程,但我正在努力解决操作员的工作方式。对于v{6},我知道对于对象vint 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 个答案:

答案 0 :(得分:4)

哇,这是令人困惑的代码,其中包含重复使用的变量名,奇怪的非常规操作等。该代码特别难于遵循,因为V可以由一个整数隐式构造,该整数始终加上7;即使使用调试器,这也花了我一些时间。请永远不要这样写代码,甚至不要玩!!

-vmain的结果不是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)之所以没有出现,是因为您从未在intV之间执行减法。

答案 1 :(得分:1)

-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;  
}