我们的教授给了我们一个带有答案的练习测试,以帮助我们进行即将到来的测试。我不明白这段代码的答案是什么135
。
我明白什么是类,但我正在为操作员的工作方式而苦苦挣扎。对于v{6}
我理解为对象v
的int v
平等13
。我认为在 int main 中, first -v
in(-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 总是加到那个整数上;即使使用调试器,这也花了我一些时间来理解。请永远不要写这样的代码,即使是为了好玩!
-v
in的结果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] 删除。
我来说两句