这是我的代码
#include<iostream>
using namespace std;
class Complex
{
private:
double re;
double im;
public:
Complex(double x=0,double y=0):re(x),im(y){}
friend ostream& operator<<(ostream&os,const Complex&a);
friend istream& operator>>(istream &is,const Complex&a);
};
ostream& operator<<(ostream&os,const Complex&a)
{
os<<"a"<<a.re<<"+j"<<a.im<<endl;
return os;
}
istream& operator>>(istream&is,const Complex&a)
{
is>>a.re>>a.im;
return is;
}
int main()
{
Complex d;
cout<<"enter the value of object";
cin>>d;
cout<<"value is"<<d;
return 0;
}
当我执行程序时运行并自动停止它给出以下内容作为输出
返回的进程-1073741571(0xC00000FD)执行时间:3.066 s按任意键继续。
主要问题是您将第二个参数设置为operator>>
const
。 const
引用不能用于修改对象,但是operator>>
应该这样做。
现在,问题是,为什么它要编译?
这是因为您使Complex
的构造函数变为非explicit
,并且可以使用double
类型的一个参数进行调用。
因此
is>>a.re>>a.im;
实际上会再次调用您的operator>>
重载,方法是使用提到的非a.re
构造函数,并且将a.im
或double
参数从Complex
转换为explicit
, C0]可以再次绑定到Complex
的const
参考。
为了避免此类问题,如果没有任何特殊原因,应使默认情况下可以使用仅一个参数operator>>
调用的构造函数。
因此,您实际上在explicit
中具有无限递归(如果启用警告,编译器可能会告诉您有关此内容的信息)。这在理论上导致不确定的行为,并且在实践中导致堆栈溢出,从而导致分段错误。
上述代码的问题是我在const对象上使用>>运算符,因此实际代码如下
operator>>