请问一个关于“复数类”的有关问题

请教一个关于“复数类”的问题
这是我写的一个关于复数类的代码,
实现复数的四则运算(+.-.*./)的重载
以及(I/O)输入输出的重载

我的问题出在除号“/”的重载,关于除法的运算输出结果总是0.不知道是否是算法出了问题。
本人新手,不知道问题在哪,请各位高手帮我改改。
#include<iostream.h>
#include<math.h>
class complex{
public:
complex(double r=0.0,double i=0.0){real=r;imag=i;}//构造函数
complex operator +(complex c2);//加号重载
complex operator -(complex c2);//减号重载
complex operator *(complex c2);//乘号重载
complex operator /(complex c2);//除号重载
friend ostream& operator<<(ostream& os,complex& c2); //重载输入输出
  friend istream& operator>>(istream& is,complex& c2);
private:
double real;
double imag;
};
complex complex::operator +(complex c2)//实现加号重载
{
complex c;
c.real=c2.real+real;
c.imag=c2.imag+imag;
return c;
};
complex complex::operator -(complex c2)//实现减号重载
{
complex c;
c.real=real-c2.real;
c.imag=imag-c2.imag;
return c;
};
complex complex::operator *(complex c2)//实现乘号重载
//(a+bi)*(c+di)=(a*c-b*d)+(c*b+a*d)i
{
complex c;
c.imag=c2.real*imag+c2.imag*real;
c.real=c2.real*real-c2.imag*imag;
return c;
};
complex complex::operator /(complex c2)//实现除号重载
{
complex c;
double d=c2.real*c2.real+c2.imag*c2.imag;
c2.imag=imag*c2.real-real*c2.imag;
c2.real=real*c2.real+imag*c2.imag;
return c;
};
ostream& operator<<(ostream& os,complex& c2)//输出重栽
{
  if(c2.imag!=0)
  return os<<c2.real<<((c2.imag>=0.0)?"+":"-")<<fabs(c2.imag)<<"i";
  else
  return os<<c2.real;
};
istream& operator>>(istream& is,complex& c2)//输入重载
{
  cout<<"Enter the real number:";
  cin>>c2.real;
  cout<<"Enter the imaginary number:";
  cin>>c2.imag;
  return is;
};
int main()
{
   
  complex c1,c2;
  complex c3=0;
  cin>>c1;
  cin>>c2;
  cout<<"c1="<<c1<<endl;
  cout<<"c2="<<c2<<endl;
  cout<<"c1+c2="<<c1+c2<<endl;
  cout<<"c1-c2="<<c1-c2<<endl;
  cout<<"c1*c2="<<c1*c2<<endl;
  cout<<"c1/c2="<<c1/c2<<endl;
  return 0;
}  




------解决方案--------------------
complex complex::operator /(complex c2)//实现除号重载 

complex c; 
double d=c2.real*c2.real+c2.imag*c2.imag; 
c.imag=(imag*c2.real-real*c2.imag)/d; 
c.real=(real*c2.real+imag*c2.imag)/d; 
return c; 
};