运算符,例如“ >>,<

问题描述 投票:2回答:2

这是我的代码

#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按任意键继续。

c++
2个回答
3
投票

主要问题是您将第二个参数设置为operator>> constconst引用不能用于修改对象,但是operator>>应该这样做。

现在,问题是,为什么它要编译?

这是因为您使Complex的构造函数变为非explicit,并且可以使用double类型的一个参数进行调用。

因此

is>>a.re>>a.im;

实际上会再次调用您的operator>>重载,方法是使用提到的非a.re构造函数,并且将a.imdouble参数从Complex转换为explicit, C0]可以再次绑定到Complexconst参考。

为了避免此类问题,如果没有任何特殊原因,应使默认情况下可以使用仅一个参数operator>>调用的构造函数。

因此,您实际上在explicit中具有无限递归(如果启用警告,编译器可能会告诉您有关此内容的信息)。这在理论上导致不确定的行为,并且在实践中导致堆栈溢出,从而导致分段错误。


0
投票

上述代码的问题是我在const对象上使用>>运算符,因此实际代码如下

operator>>
© www.soinside.com 2019 - 2024. All rights reserved.