嘿伙计我的一个方法有问题(覆盖运算符,〜) 当我尝试打印我的对象时,出现意外情况......需要一些帮助
这是我的整个代码
#include"stdafx.h"
#include<iostream>
using namespace std;
class complex
{
private:
double Re, Im;
public:
complex(double _Re = 0, double _Im = 0) : Re(_Re), Im(_Im){} //class constructor
void print() const
{
cout << Re << " + " << "i(" << Im << ")" << endl;
}
complex operator~() const
{
return (Re, -Im);
}
};
void main()
{
complex x(2, 3);
x.print();
(~x).print();
}
如果我编译它,我会在屏幕上得到正确的复数,但是当我尝试执行〜重写的运算符时,它会显示给我 - -3 + 0 i
....
真的需要一些帮助。
感谢
很抱歉发布了这些脑力不集中的问题,但我不能自己解决这个问题....看着该死的代码超过30分钟,我无法看到我在哪里错。
答案 0 :(得分:2)
您错过了complex(Re, -Im);
在:
complex operator~() const
{
return (Re, -Im);
}
因此,您返回隐式转换的complex(-Im)
(逗号运算符)。
您可以使用显式构造函数来避免这样的陷阱。
答案 1 :(得分:0)
中的逗号
return (Re, -Im);
不按你的想法行事。
括号中的某些内容不会调用构造函数。 括号被丢弃,表达式被评估为
return Re, -Im;
逗号表示每个术语的评价,结果是最右边的术语。
因为表达式Re
没有做任何事情,所以表达式被评估为
return -Im;
但是这会调用默认值为0的构造函数。 因此,实际部分为-3,想象部分为0。
而应该读取该行
return complex(Re, -Im);
构建你认为应该的东西。
答案 2 :(得分:0)
return (Re, -Im);
这是使用逗号运算符,它评估Re
(数字不执行任何操作),然后计算并“返回”-Im
( - 3)。然后,返回类型应为complex
,因此它会尝试将此-3转换为complex
。它找到了这个构造函数:complex(double _Re = 0, double _Im = 0)
,并使用它:complex(-3, 0)
;
立即解决方案是将单词complex
添加到返回
return complex(Re, -Im);
或者,在C ++ 11中,使用{}
告诉编译器你打算调用构造函数:
return {Re, -Im};
答案 3 :(得分:0)
由于您接受构造函数的默认值(0
),编译器将使用以下表达式:return (Re, -Im);
计算Re
(它为2)抛弃并创建新的{{1}通过调用构造函数来调用complex
:-Im
。所以这就是你如何获得有趣的价值。