了解操作员
Understanding Operators
我们的教授为我们提供了一个练习测试,其答案可以帮助我们进行即将进行的测试。我不明白此代码的答案是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)
没有进入它,因为您从未在int
和V
之间进行减法。
-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;
}
相关文章:
- 正在尝试了解输入验证循环
- 了解 GLM- openGL 中的相机转换
- C++我需要了解在哪里使用指针和双指针
- 如何深入了解明显的腐败
- <<操作员在下面的行中工作
- 了解嵌套循环打印星号图案
- C++ 与操作员不匹配<<
- 了解每月第一天函数的代码
- 操作员C++的模棱两可的过载
- 了解C++标准::shared_ptr
- C++中>>操作员过载时出现问题?
- NaN 上的宇宙飞船操作员
- 尝试了解在导入的静态方法上使用删除方法时的错误
- C++:需要帮助了解运算符重载错误
- 在学习数据结构之前对STL有一个了解是好的吗?
- 了解算法的性能差异(如果以不同的编程语言实现)
- 了解删除C++
- 了解内存序列和标准::memory_order_relaxed
- 了解其工作原理
- 了解操作员