了解运算符

缺口

我们的教授给了我们一个带有答案的练习测试,以帮助我们进行即将到来的测试。我不明白这段代码的答案是什么135

我明白什么是类,但我正在为操作员的工作方式而苦苦挣扎。对于v{6}我理解为对象vint v平等13我认为在 int main 中, first -vin(-v - v).print将首先在 return 的运算符中进行评估2 * v,并且它将 return 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 总是加到那个整数上;即使使用调试器,这也花了我一些时间来理解。请永远不要写这样的代码,即使是为了好玩!

-vin的结果main不是int. 它是一个V从表达式2 * v(=26)隐式构造对象,产生一个值为 33 (26+7) 的成员整数。

就像你写的:

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

或者,由于默认参数:

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

然后你把这个新的返回对象提供给 member operator-(const V&)同样的故事适用。它产生表达式3*33 + 2*13 + 3,即 128;这再次用于构造一个新的V(因为这是返回类型!),所以加 7 得到 135。

operator-(int lop, const V& rop)不会进入它,因为您从未在 aint和 a之间执行减法V

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章