以下程序使用友元函数重载<<、>>,使之能适用于复数类:#include<iostream.h>class Complex{double Real, Image;public:Complex(double r=0, double i=0){Real=r; Image=i;}friend istream& operator>>(istream &, Complex &);friend ostream& operator<<(ostream &, Complex &);};istream& operator>>(istream &in, Complex &c){ in>>c.Real>>c.Image;return in;}ostream& operator<<(ostream &out, Complex &c){ out<<c.Real;if(c.Image>0) out<<'+'<<c.Image<<'i'; else if(c.Image<0) out<<c.Image<<'i'; out<<endl;return out;}void main( ){Complex c1(1, 2), c2;cout<<c1; cout<<"Please input c1 & c2:\n";cin>>c1>>c2; cout<<c1<<c2; }此程序可以正确运行,但是一旦将#include<iostream.h>改成#include<iostream>using namespace std;编译就无法通过了,提示说重载运算符的函数不能访问Complex的私有成员,请问这是什么道理?这两种用法到底有何区别?这个程序怎样能改成使用第二种写法的正确程序呢?
3 回答
明月笑刀无情
TA贡献1828条经验 获得超4个赞
你这个程序在g++,中改成后面的可以使用。
如果学习C++,必须使用VC2003或者以上版本(Anders写的)。
VC6/VC98中有很多C++的硬伤,那时候的VC连你说的那个iostream都不能完整支持。
语法兼容性才8X%,也就是说很可能你的程序没有任何问题,VC也不能编译通过,#include<iostream.h> 这个就是因为iostream在那个年代还不能完全支持的产物。
至于你说的问题,个人感觉像VC 6的bug之一或者环境中另外有一个同名类。
此外,main的返回值应当是int,你那样写在现代编译器会报错。
湖上湖
TA贡献2003条经验 获得超2个赞
在某些编译器中 就必须用#include<iostream.h>
而有的就是必须用#include<iostream>
using namespace std;
有的是两者都可以 例如你在vs2005就不能用#include<iostream.h>
没什么意义就是编译器不认同了
qq_花开花谢_0
TA贡献1835条经验 获得超7个赞
同编译器有关吧。两种写法都可以,结果一样。
正规写法 (新的国际标准)无 .h:
#include<iostream>
using namespace std;
- 3 回答
- 0 关注
- 347 浏览
添加回答
举报
0/150
提交
取消