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++库和其他实现细节保留的。