我们的教授给了我们一个练习测试和答案,以帮助我们进行即将到来的测试。我不明白这段代码的答案是 135
。
我明白类是什么,但我对运算符的工作方式感到困惑。对于 v{6}
,我理解对于对象 v
,int v
等于 13
。我认为在 int main 中, (-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 添加到该整数;即使使用调试器,我也花了一些时间才理解。请永远不要写这样的代码,即使是为了好玩!
-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
.
关于c++ - 了解运营商,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56058075/