c++學習運算符重載

運算符重載
1、實驗目的
·學習掌握重定義與類有關的運算符。
·把握重載運算符的時機。
·學習掌握把一個類對象轉換爲另一個類對象。
·學習掌握重載爲成員與友元的區別及其帶參數的情況。
·學習掌握值返回與引用返回的區別及應用時機。
2、實驗內容
(1)
生成一個表示複數的類FS。複數的實部sb和虛部xb作爲其數據成員。提供成員函數print()顯示覆數(格式:-3+5i或6-2i),重載“+”、“-”爲FS類的成員函數,用來計算兩個複數的和、差。
思路導航:
① 定義類,設計構造函數和顯示函數print();
② 重載運算符“+”、“-”爲類FS的成員函數。
③ 實例化FS類的2個對象,並利用重載的運算符對其進行計算。
另外,根據上述定義,試將上述的運算符重載成員函數改寫成友元函數。

#include <iostream>
using namespace std;
class FS {
	public:
		FS(double r=0.0,double i=0.0) {
			real=r;
			imag=i;
//			cout<<"複數對象創建並設置初始值"<<endl;
		}
		~FS(){
//			cout<<"複數對象結束"<<endl;
		}
		void set(double r=0.0,double i=0.0) {
			real=r,imag=i;
		}
		FS operator +(FS &b);
		FS operator -(FS &b);
		FS operator *(FS &b);
		FS operator /(FS &b);
		friend ostream & operator<<(ostream &out,const FS &b);
		void out(void);
	private:
		double real;
		double imag;
};
FS FS::operator +(FS &b) {
	return(FS(real+b.real,imag+b.imag));
}
FS FS::operator -(FS &b) {
	return(FS(real-b.real,imag-b.imag));
}
FS FS::operator *(FS &b) {
	FS temp;
	temp.real=real*b.real-imag*b.imag;
	temp.imag=real*b.imag+imag*b.real;
	return(temp);
}
FS FS::operator /(FS &b) {
	FS temp;
	temp.real=(real*b.real+imag*b.imag)/(b.real*b.real+b.imag*b.imag);
	temp.imag=(imag*b.real-real*b.imag)/(b.real*b.real+b.imag*b.imag);
	return(temp);
}
ostream& operator<<(ostream &out,const FS &b){
	out<<b.real;
	if(b.imag>0)out<<"+";
	out<<b.imag<<"i"<<endl;
	return out;
}
void FS::out(){
//	cout<<real;
//	if(imag>0)cout<<"+";
//	cout<<imag<<"i"<<endl;
}
int main() {
	FS a(1,-2),b(2,1),c;
	cout<<"a=";
	a.out();
	cout<<a<<endl;
	cout<<"b=";
	b.out();
	cout<<b<<endl;
	c=a+b;
	cout<<"c=a+b\nc=";
	c.out();
	cout<<c<<endl;
	c=a-b;
	cout<<"c=a-b\nc=";
	c.out();
	cout<<c<<endl;
	c=a*b;
	cout<<"c=a*b\nc=";
	c.out();
	cout<<c<<endl;
	c=a/b;
	cout<<"c=a/b\nc=";
	c.out();
	cout<<c<<endl;
	return 0;
}

將上述的運算符重載成員函數改寫成友元函數

#include <iostream>
using namespace std;
class FS {
	public:
		FS(double r=0.0,double i=0.0) {
			real=r;
			imag=i;
//			cout<<"複數對象創建並設置初始值"<<endl;
		}
		~FS() {
//			cout<<"複數對象結束"<<endl;
		}
		void set(double r=0.0,double i=0.0) {
			real=r,imag=i;
		}
		friend FS operator +(FS &a,FS &b);
		friend FS operator -(FS &a,FS &b);
		friend FS operator *(FS &a,FS &b);
		friend FS operator /(FS &a,FS &b);
		friend ostream & operator<<(ostream &out,const FS &b);
		void out(void);
	private:
		double real;
		double imag;
};
FS operator +(FS &a,FS &b) {
	return(FS(a.real+b.real,a.imag+b.imag));
}
FS operator -(FS &a,FS &b) {
	return(FS(a.real-b.real,a.imag-b.imag));
}
FS operator *(FS &a,FS &b) {
	FS temp;
	temp.real=a.real*b.real-a.imag*b.imag;
	temp.imag=a.real*b.imag+a.imag*b.real;
	return(FS(a.real*b.real-a.imag*b.imag,a.real*b.imag+a.imag*b.real));
}
FS operator /(FS &a,FS &b) {
	FS temp;
	temp.real=a.real*b.real+a.imag*b.imag;
	temp.imag=a.imag*b.real-a.real*b.imag;
	return(temp);
}
ostream& operator<<(ostream &out,const FS &b){
	out<<b.real;
	if(b.imag>0)out<<"+";
	out<<b.imag<<"i"<<endl;
	return out;
}
void FS::out() {
//	cout<<real;
//	if(imag>0)cout<<"+";
//	cout<<imag<<"i"<<endl;
}
int main() {
	FS a(2,-1),b(-1,2),c;
	cout<<"a="<<a<<endl;
	a.out();
	cout<<"b="<<b<<endl;
	b.out();
	c=a+b;
	cout<<"c=a+b\nc="<<c<<endl;
	c.out();
	c=a-b;
	cout<<"c=a-b\nc="<<c<<endl;
	c.out();
	c=a*b;
	cout<<"c=a*b\nc="<<c<<endl;
	c.out();
	c=a/b;
	cout<<"c=a/b\nc="<<c<<endl;
	c.out();
	return 0;
}

(2)
編寫一個時間類,實現時間的加、減、讀和輸出:

#include <iostream>
using namespace std;
class Time {
	public:
		Time(int h=0,int m=0,int s=0) {
			hour=h,minute=m,second=s;
		}
		void SetTime();
		void Display();
		Time operator + (Time &a);
		Time operator - (Time &a);
		friend ostream & operator<<(ostream &out,const Time &b);
	private:
		int hour,minute,second;
};
void Time::SetTime() {
	do {
		cout<<"input hour:"<<endl;
		cin>>hour;
	} while(hour<=0||hour>24);
	do {
		cout<<"input minute:"<<endl;
		cin>>minute;
	} while(minute<0||minute>=60);
	do {
		cout<<"input second:"<<endl;
		cin>>second;
	} while(second<0||second>=60);
}
void Time::Display() {
//	cout<<hour<<":"<<minute<<":"<<second<<endl;
}
Time Time::operator + (Time &a) {
	int h,m,s;
	h=hour,m=minute,s=second;
	if(second+a.second>=60) {
		s=second+a.second-60;
		m=minute+1;
	} else s=s+a.second;
	if(m+a.minute>=60) {
		m=m+a.minute-60;
		h=hour+1;
	} else m=m+a.minute;
	if(h+a.hour>24) {
		h=h+a.hour-24;
	} else h=h+a.hour;
	return(Time(h,m,s));
}
Time Time::operator - (Time &a) {
	int h,m,s;
	h=hour,m=minute,s=second;
	if(second-a.second<0) {
		s=second-a.second+60;
		m=minute-1;
	} else s=second-a.second;
	if(m-a.minute<0) {
		m=m-a.minute+60;
		h=hour-1;
	} else m=m-a.minute;
	if(h-a.hour<0) {
		h=h-a.hour+24;
	} else h=h-a.hour;
	return(Time(h,m,s));
}
ostream & operator<<(ostream &out,const Time &b){
	out<<"("<<b.hour<<':'<<b.minute<<':'<<b.second<<")";
	return out;
}
int main() {
	Time a,b,c;
	cout<<"請輸入A的時間:"<<endl;
	a.SetTime();
	cout<<"請輸入B的時間:"<<endl;
	b.SetTime();
	cout<<"A的時間爲:"<<a<<endl;
	a.Display();
	cout<<"B的時間爲:"<<b<<endl;
	b.Display();
	cout<<"c=a+b=";
	c=a+b;
	cout<<c<<endl;
	c.Display();
	cout<<endl<<"c=a-b=";
	c=a-b;
	cout<<c<<endl;
	c.Display();
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章