以下程序使用友元函數重載<<、>>,使之能適用于復數類:#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 關注
- 416 瀏覽
添加回答
舉報
0/150
提交
取消