C ++重写逻辑失败

时间:2014-03-24 21:25:48

标签: c++ oop

嘿伙计我的一个方法有问题(覆盖运算符,〜) 当我尝试打印我的对象时,出现意外情况......需要一些帮助

这是我的整个代码

#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分钟,我无法看到我在哪里错。

4 个答案:

答案 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。所以这就是你如何获得有趣的价值。