猿问

以下代码内容是关于iostream.h和iostream的使用,求解释~

以下程序使用友元函数重载<<、>>,使之能适用于复数类:
#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的私有成员,请问这是什么道理?这两种用法到底有何区别?这个程序怎样能改成使用第二种写法的正确程序呢?

一只名叫tom的猫
浏览 353回答 3
3回答

明月笑刀无情

你这个程序在g++,中改成后面的可以使用。如果学习C++,必须使用VC2003或者以上版本(Anders写的)。VC6/VC98中有很多C++的硬伤,那时候的VC连你说的那个iostream都不能完整支持。语法兼容性才8X%,也就是说很可能你的程序没有任何问题,VC也不能编译通过,#include<iostream.h> 这个就是因为iostream在那个年代还不能完全支持的产物。至于你说的问题,个人感觉像VC 6的bug之一或者环境中另外有一个同名类。此外,main的返回值应当是int,你那样写在现代编译器会报错。

湖上湖

在某些编译器中 就必须用#include<iostream.h>而有的就是必须用#include<iostream>using namespace std;有的是两者都可以 例如你在vs2005就不能用#include<iostream.h>没什么意义就是编译器不认同了

qq_花开花谢_0

同编译器有关吧。两种写法都可以,结果一样。正规写法 (新的国际标准)无 .h:#include<iostream>using namespace std;
随时随地看视频慕课网APP
我要回答