1. 程式人生 > >C++實現輸入輸出運算子過載、友元函式和成員函式實現複數類Complex

C++實現輸入輸出運算子過載、友元函式和成員函式實現複數類Complex

今天答應幫朋友做一個C++題目,頗費了一番周折,終於還是寫出來了,讓很久沒敲程式碼的我反省了一下,也回憶了以前學過的知識。

題目要求如下:

一、按下列要求編制複數類,並除錯通過:

1)  基本的建構函式;

2)  成員運算子+、-實現複數的加減運算;

3)  友元運算子+、-實現更合理的加減運算;

4)  運算子<<和>>實現複數類的輸出輸入。

做題之前小小的閒扯一下這裡要用到的知識點吧。

多型性:是指同樣的訊息被不同型別的物件接收時導致不同的行為。

面向物件的多型性分為四類:過載多型,強制多型,包含多型,引數多型

下面要用到運算子過載多型。

多型性從實現的角度來講分為兩類:

A.編譯時的多型:在編譯過程中確定了同名操作的具體操作物件。

B.執行時的多型:在程式執行過程中動態的確定操作所針對的具體物件。

而確定操作的具體物件的過程也就是傳說中的繫結(聯編)。繫結說的通俗一點就是把一個識別符號名和一個儲存地址聯絡在一起的過程。

而繫結又分為:靜態繫結和動態繫結。

靜態繫結:繫結工作在編譯連線階段完成的情況。

動態繫結:繫結工作在執行階段完成的情況。

下面我們要用到的運算子過載就屬於靜態繫結。

程式程式碼如下:

#include<iostream.h>

class Complex
{
	public:
		Complex(double r=0.0,double i=0.0):real(r),imag(i)
		{
			cout<<"使用了拷貝建構函式"<<endl;
		}
		Complex operator+ (const Complex &c2)const;	//通過成員函式實現兩個複數的加減操作
		Complex operator- (const Complex &c2)const;
		
		friend Complex operator+(const Complex &c1,const Complex &c2);	//通過友元函式實現兩個複數的加減操作
		friend Complex operator-(const Complex &c1,const Complex &c2);
		
		friend istream &operator>> (istream &input,Complex &c);	//過載輸入輸出運算子
		friend ostream &operator<< (ostream &out,const Complex &c);
	
	private:
		double real;
		double imag;			
} ;

Complex Complex::operator+ (const Complex &c2)const
{
	return Complex(this->real+c2.real,this->imag+c2.imag);
}
Complex Complex::operator- (const Complex &c2)const
{
	return Complex(this->real-c2.real,this->imag-c2.imag);
}

Complex operator+(const Complex &c1,const Complex &c2)
{
	return Complex(c1.real+c2.real,c1.imag+c2.imag);
}
Complex operator-(const Complex &c1,const Complex &c2)
{
	return Complex(c1.real-c2.real,c1.imag-c2.imag);
}

istream &operator>> (istream &input,Complex &c)
{
	input>>c.real>>c.imag;
	return input;
}
ostream &operator<< (ostream &out,const Complex &c)
{
	out<<"("<<c.real<<","<<c.imag<<")"<<endl;
	return out;
}

int main()
{
	Complex c1(5,4),c2,c3;
	cin>>c2;	//呼叫輸入運算子

	cout<<c1<<c2<<c3;	//呼叫過載過後的輸出運算子

	c3=c1.operator +(c2);	//明確呼叫成員函式
	cout<<c3;
	
	c3=operator +(c1,c2);	//呼叫友元函式
	cout<<c3;
	
	return 0;
}

程式執行截圖如下:


注:本程式是在VC++6.0中編寫的,用其他編譯器可能需要修改一下標頭檔案,這是VC6.0的一個BUG。