運算符重載詳解(四)

6.重載流插入運算符“<<”
對“<<”和“>>”重載的函數形式如下:
istream& operator >> (istream&,自定義類&);
ostream& operator << (istream&,自定義類&);

重載運算符“<<”的函數的第1個參數和函數的類型都必須是ostream&類型(即ostream類對象的引用),第2個參數是要進行輸入操作的類。
因此,只能將重載“<<”和“>>”的函數作爲友元函數,而不能講他們定義爲成員函數。
問題:爲什麼重載“<<”和“>>”的函數只能作爲友元函數?
因爲只有在輸出自定義類對象時才能使用重載的運算符,對其他類型的對象是無效的。

例子:

class Complex
{
public:
	Complex(){ real = 0, imag = 0; } //定義構造函數
	Complex(double r, double i){ real = r, imag = i; }//構造函數重載
	Complex operator + (Complex& c2);		//運算符+重載爲成員函數
	friend ostream& operator << (ostream&, Complex&); //運算符<<重載爲友元函數
private:
	double real;	//實部
	double imag;	//虛部
};
Complex operator + (Complex &c1, Complex &c2)
{
	return Complex(real + c2.real, imag + c2.imag);
}
ostream& operator << (ostream& output, Complex& c)
{
	output << c.real << "+" << c.imag <<"i"<< endl;
	return output;
	/*return output作用:能連續向輸出流插入信息,output是ostream類的對象的引用(它是實參cout的引用,或者說output是cout的別名),cout通過傳送地址給output,使他們二者共享同一段存儲單元,因此,return output;就是return cout;將輸出流cout的現狀返回,即保留輸出流的現狀。*/
}//調用函數相當於執行:cout << c.real << "+" << c.imag <<"i" << endl;
int main()
{
	Complex c1(3, 4), c2(5, -10), c3;
	c3 = c1 + c2;    //c1 + c2 解釋爲operator + (c1,c2);	
	cout << c3;      //等價於:operator<<(cout,c3)
	return 0;
}

問題:什麼情況下“<<”是標準類型數據的流插入符,什麼情況下是“<<”是重載的流插入符?
如:cout << c3 << 5 <<endl;
有刪除線的的調用重載的流插入符,後面兩個“<<”不是重載的流插入符,因爲它的右側不是Complex 類對象而是標準類型的數據,是用預定義的流插入符處理的

7.重載流插入運算符“>>”
C++預定義的運算符>>的作用是從一個輸入流中提取數據,如cin>>i;表示從輸入流中提取一個整數賦給變量i

class Complex
{
public:
	friend ostream& operator << (ostream&, Complex&); //運算符<<重載爲友元函數
	friend ostream& operator >> (ostream&, Complex&); //運算符>>重載爲友元函數
private:
	double real;	//實部
	double imag;	//虛部
};
ostream& operator >> (ostream& intput, Complex& c)
{
	intput >> c.real>> c.imag;
	return intput;
}
ostream& operator << (ostream& output, Complex& c)
{
	output << c.real;
	if (c.imag >= 0)  //判斷虛部是正值還是負值,是正,在虛部前加"+"號
		output << "+";
	output << c.imag;
	return output;
}//調用函數相當於執行:cout << c.real << "+" << c.imag <<"i" << endl;
int main()
{
	Complex c1, c2;
	cin >> c1 >> c2;   //3+6i,4-10i;用cin和>>可以裏連續項程序輸入Complex類對象的值,沒遇到一次<<就調用一次重載運算符>>
	cout << c1 << c2; 
	return 0;
}

使用運算符重載的具體做法:
<1>先確定要重載的的哪一個運算符,想把它用於哪一個類。重載運算符只能把一個運算符用於一個指定的類。不要誤以爲用一個運算符重載函數就可以適用於所有的類。
<2>在運算符重載中使用引用(reference)的重要性。利用引用作函數的參數可以在調用函數的過程中不用傳遞值的方式進行虛實結合,而通過傳址方式是形參成爲實參的別名,因此不生成臨時變量(實參的副本),減少了時間和空間的開銷。此外,若重載函數的返回值是對象的引用時,返回的不是常量,而是引用所代表的對象,它可以出現在賦值號的左側而成爲左值,可以被賦值或參與其他操作(如保留cout流的當前值以便能連續使用<<輸出)。但使用引用時要特別小心,因爲修改了引用就等於修改了它所代表的對象。

8.標準類型數據間的轉換
轉換方式包括隱式類型轉換和顯式類型轉換
隱式類型轉換,如:
int i=6; i=7.5+i; 就是隱式類型轉換,將i轉換爲double,相加得13.5,然後再轉換爲int得13
顯式類型轉換,如:
C++形式爲:類型名(數據)
C語言形式:(類型名)數據

C++保留了c語言的這種用法,提倡採用C++提供的方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章