了解操作员

Understanding Operators

本文关键字:操作员 了解      更新时间:2023-10-16

我们的教授为我们提供了一个练习测试,其答案可以帮助我们进行即将进行的测试。我不明白此代码的答案是135

我知道什么是课程,但我在挣扎运营商的工作方式。对于v{6},我了解对象v int v等于13。我认为在INT主体中,(-v - v).print中的第一个-v将首先在返回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;  
}

哇,这是令人困惑的代码,重复使用的变量名称,奇怪的非常规操作等。该代码尤其难以遵循,因为V可以被隐式从整数构造,其中7总是添加到该整数中。即使有一个调试器,这也花了我片刻的时间才能Grok。请切勿像这样编写代码,甚至不是为了娱乐!

main-v的结果不是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之间进行减法。

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