如何重载"<<"符号?

guoyongzhen 2003-08-21 09:03:53
各位高手,我定义了一个复数类,现想重载<<符号使它能输出复数(形如3+4i),但用下面的代码不行,请高手指点,谢谢!
#include<iostream.h>
class complex
{
public:
complex(){real=imag=0.0;}
complex(double r){real=r;imag=0.0;}
complex(double r,double i){real=r;imag=i;}
friend complex operator +(complex c1,complex c2);
void operator <<();
friend void print(complex c);
private:
double real,imag;
};
complex operator +(complex c1,complex c2)
{
return complex(c1.real+c2.real,c1.imag+c2.imag);
}
inline void complex::operator <<()
{
if(imag<0)
cout<<real<<imag<<"i"<<endl;
else
cout<<real<<"+"<<imag<<"i"<<endl;
}
void print(complex c)
{
if(c.imag<0)
cout<<c.real<<c.imag<<"i"<<endl;
else
cout<<c.real<<"+"<<c.imag<<"i"<<endl;
}
void main()
{
complex c1(6),c2(2.3,4.5);
print(c1+c2);//这个可以
cout<<c2;//出错
}
...全文
63 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qhgary 2003-08-21
  • 打赏
  • 举报
回复
不用&会发生copy,用了&就没有调用拷贝构造函数
guoyongzhen 2003-08-21
  • 打赏
  • 举报
回复
???
jp311 2003-08-21
  • 打赏
  • 举报
回复
class complex
{
friend inline ostream& operator<< (ostream& os, const complex& rhs) {
if(imag<0)
return cout << c.real << c.imag << "i" << endl;
else
return cout << c.real << "+" << c.imag << "i" << endl;
}
...
};
guoyongzhen 2003-08-21
  • 打赏
  • 举报
回复
感谢楼上各位的解答,问题解决了.
但我又有个新的问题,为什么ostream& operator <<(ostream& os, const complex& c)中要用引用呢?我试着把引用符号去掉,却出错了,说什么os不能访问ostream类中的私有成员,这是怎么回事呢?
请高手赐教,谢谢
maojincxj 2003-08-21
  • 打赏
  • 举报
回复
应该用友元函数,我最近看了(more)effective c++,收获颇多
class complex
{
...
friend inline ostream& operator<< (ostream& os, const complex& rhs);
}


inline ostream& operator <<(ostream& os, const complex& c)
{
if(imag<0)
return cout<<real<<imag<<"i"<<endl;
else
return cout<<real<<"+"<<imag<<"i"<<endl;
}
  • 打赏
  • 举报
回复
inline ostream& operator <<(ostream& os, const complex& c)
{
if(imag<0)
return os<<c.real<<c.imag<<"i"<<endl;
else
return os<<c.real<<"+"<<c.imag<<"i"<<endl;
}

jyfcsdn 2003-08-21
  • 打赏
  • 举报
回复
cout<<c2;//出错
当然会出错,因为你定义的operator <<是complex类的
按照你的定义,应该这样调用 c2<<cout;
但是这样的话不符合习惯
我觉得应该这样定义,一个非成员函数
inline ostream& operator <<(ostream& os, const complex& c)
{
if(imag<0)
return cout<<real<<imag<<"i"<<endl;
else
return cout<<real<<"+"<<imag<<"i"<<endl;
}
jp311 2003-08-21
  • 打赏
  • 举报
回复
inline ostream& complex::operator <<(ostream& os, const complex& c)
{
if(imag<0)
return cout<<real<<imag<<"i"<<endl;
else
return cout<<real<<"+"<<imag<<"i"<<endl;
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧