Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;重写逻辑失败_C++_Oop - Fatal编程技术网

C++ C++;重写逻辑失败

C++ C++;重写逻辑失败,c++,oop,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){}

嘿,伙计们,我的一个方法有问题(重写运算符,~) 当我试图打印我的对象时,意外的事情发生了。。。需要帮忙吗

这是我的全部密码

#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();
}
#包括“stdafx.h”
#包括
使用名称空间std;
阶级情结
{
私人:
双Re,Im;
公众:
复数(double _Re=0,double _Im=0):Re(_Re),Im(_Im){}//类构造函数
void print()常量
{

cout您缺少一个
复合体(Re,-Im);
在:

因此,返回一个隐式转换的
复数(-Im)
(逗号运算符)。 您可以使用显式构造函数来避免这样的陷阱。

中的逗号

return (Re, -Im);
不会做你认为它会做的事

在括号中包围某些内容不会调用构造函数。 括号将被丢弃,表达式的计算结果为

return Re, -Im;
return -Im;
逗号表示每个术语的值,结果是最右边的术语。 因为表达式
Re
不起任何作用,所以表达式的计算结果为

return Re, -Im;
return -Im;
但这会调用构造函数,该构造函数的虚项默认值为0。 所以你得到-3表示真实部分,0表示想象部分

相反,这一行应该是

return complex(Re, -Im);
这构成了你认为它应该是什么

    return (Re, -Im);
这是使用逗号运算符,在这里它求值
Re
(数字不起任何作用),然后求值并“返回”
-Im
(-3)。然后,返回类型应该是
复杂的
,因此它尝试将-3转换为
复杂的
。它找到这个构造函数:
复杂的(double\Re=0,double\Im=0)
,并使用它:
复杂(-3,0)

直接的解决办法是在返回中添加单词
complex

    return complex(Re, -Im);
或者,在C++11中,使用
{}
告诉编译器您打算调用构造函数:

    return {Re, -Im};

由于您接受构造函数的默认值(
0
),编译器采用以下表达式:
return(Re,-Im);
计算
Re
(它是2)扔掉,并通过调用
-Im
这样的构造函数来创建一个新的
复合体
。这就是获得有趣值的方式。

返回(re,-im)-->返回复数(re,-im)…有时20分钟和2眼不足以注意一个丢失的单词!不要用标识符开始标识符,然后使用大写字母,如< C++ >代码> >代码> > IM > /CODE >。这些是为C++库和其他实现细节保留的。