程序設計教程機械工業(yè)出社課后習題答案 操作符重載_第1頁
程序設計教程機械工業(yè)出社課后習題答案 操作符重載_第2頁
程序設計教程機械工業(yè)出社課后習題答案 操作符重載_第3頁
程序設計教程機械工業(yè)出社課后習題答案 操作符重載_第4頁
程序設計教程機械工業(yè)出社課后習題答案 操作符重載_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第7章 操作符重載1、 為什么要對操作符進行重載?是否所有的操作符都可以重載?答:通過對C+操作符進行重載,我們可以實現(xiàn)用C+的操作符按照通常的習慣來對某些類(特別是一些數(shù)學類)的對象進行操作,從而使得程序更容易理解。除此之外,操作符重載機制也提高了C+語言的靈活性和可擴充性,它使得C+操作符除了能對基本數(shù)據(jù)類型和構造數(shù)據(jù)類型進行操作外,也能用它們來對類的對象進行操作。 不是所有的操作符都可以重載,因為“.”, “.*”, “:”, “?:”,sizeof這五個操作符不能重載。2、 操作符重載的形式有哪兩種形式?這兩種形式有什么區(qū)別?答:一種就是作為成員函數(shù)重載操作符;另一種就是作為全局(友元

2、)函數(shù)重載操作符。當操作符作為類的非靜態(tài)成員函數(shù)來重載時,由于成員函數(shù)已經(jīng)有一個隱藏的參數(shù)this,因此對于雙目操作符重載函數(shù)只需要提供一個參數(shù),對于單目操作符重載函數(shù)則不需提供參數(shù)。當操作符作為全局函數(shù)來重載時,操作符重載函數(shù)的參數(shù)類型至少有一個為類、結構、枚舉或它們的引用類型。而且如果要訪問參數(shù)類的私有成員,還需要把該函數(shù)說明成相應類的友元。對于雙目操作符重載函數(shù)需要兩個參數(shù),對于單目操作符重載函數(shù)則需要給出一個參數(shù)。操作符=、 ( )、 以及->不能作為全局函數(shù)來重載。另外,作為類成員函數(shù)來重載時,操作符的第一個操作數(shù)必須是類的對象,全局函數(shù)重載則否。3、 定義一個時間類Time,

3、通過操作符重載實現(xiàn):時間的比較(=、!=、>、>=、<、<=)、時間增加/減少若干秒(+=、-=)、時間增加/減少一秒(+、-)以及兩個時間相差的秒數(shù)(-)。解:class Timeprivate :int hour, minute, second;public :Time()hour=minute=second=0;Time(int h)hour=h;minute=second=0;Time(int h, int m)hour=h;minute=m;second=0;Time(int h, int m, int s)hour=h;minute=m;second=s;T

4、ime(const Time &t)hour=t.hour;minute=t.minute;second=t.second;bool operator =(Time &t)if (hour=t.hour && minute=t.minute && second=t.second)return true;return false;bool operator !=(Time &t)return !(*this = t);bool operator > (Time &t)if (hour>t.hour)return true

5、;else if (hour=t.hour && minute>t.minute)return true;else if (hour=t.hour && minute=t.minute && second>t.second)return true;elsereturn false;bool operator >=(Time &t)return *this > t | *this = t;bool operator <(Time &t) return !(*this >= t);bool oper

6、ator <=(Time &t)return !(*this > t);Time &operator +=(int s)second+=s;while (second>=60)second-=60;minute+;while (minute>=60)minute-=60;hour+;while (hour>=24)hour-=24;return *this;Time &operator -=(int s)second-=s;while (second<0)second+=60;minute-;while (minute<0)mi

7、nute+=60;hour-;while (hour<0)hour+=24;return *this;Time &operator +() /對Time t,操作為:+t*this += 1;return *this;Time operator +(int) /對Time t,操作為:t+Time t=*this;*this += 1;return t;Time &operator -() *this -= 1;return *this;Time operator -(int) Time t=*this;*this -= 1;return t;int operator -

8、(Time &t)/把時間直接換算成秒數(shù)計算int sec1=hour*3600+minute*60+second;int sec2=t.hour*3600+t.minute*60+t.second;return sec2-sec1;4、 利用操作符重載給出一個完整的復數(shù)類的定義。解:class Complexprivate :double real, imag;public :Complex()real = imag = 0;Complex(double r)real = r;imag = 0;Complex(double r, double i)real = r;imag = i;

9、Complex(const Complex &c)real=c.real;imag=c.imag; double modulus() const return real*real+imag*imag; Complex operator -() constComplex temp;temp .real = -real;temp.imag = -imag;return temp; friend bool operator =(const Complex &c1,const Complex &c2); friend bool operator !=(const Complex

10、 &c1,const Complex &c2); friend bool operator > (const Complex &c1,const Complex &c2); friend bool operator >=(const Complex &c1,const Complex &c2); friend bool operator < (const Complex &c1,const Complex &c2); friend bool operator <=(const Complex &c1

11、,const Complex &c2);friend Complex operator+(const Complex &c1,const Complex &c2);friend Complex operator-(const Complex &c1,const Complex &c2);friend Complex operator*(const Complex &c1,const Complex &c2);friend Complex operator/(const Complex &c1,const Complex &

12、c2);bool operator =(const Complex &c1,const Complex &c2)return (c1.real = c2.real) && (c1.imag = c2.imag);bool operator !=(const Complex &c1,const Complex &c2)return !(c1 = c2);bool operator >(const Complex &c1,const Complex &c2)return c1.modulus() > c2.modulus(

13、);bool operator >=(const Complex &c1,const Complex &c2)return c1.modulus() >= c2.modulus();bool operator <(const Complex &c1,const Complex &c2)return c1.modulus() < c2.modulus();bool operator <=(const Complex &c1,const Complex &c2)return c1.modulus() <= c2.m

14、odulus();Complex operator+(const Complex &c1,const Complex &c2)Complex temp;temp.real=c1.real+c2.real;temp.imag=c1.imag+c2.imag;return temp;Complex operator-(const Complex &c1,const Complex &c2)Complex temp;temp.real=c1.real-c2.real;temp.imag=c1.imag-c2.imag;return temp;Complex opera

15、tor*(const Complex &c1,const Complex &c2)Complex temp;temp.real=c1.real*c2.real-c1.imag*c2.imag;temp.imag=c1.real*c2.imag+c1.imag*c2.real;return temp;Complex operator/(const Complex &c1,const Complex &c2)double d=c2.modulus(); if (d != 0) Complex temp; temp.real=(c1.real*c2.real+c1.i

16、mag*c2.imag)/d; temp.imag=(c1.imag*c2.real-c1.real*c2.imag)/d; return temp; else cout << "Error in operation / of Complex" << endl; exit(-1); 5、 定義一個多項式類Polynomial,其實例為多項式:a0+a1x+a2x2+.+anxn,該類具有如下的接口:class Polynomial .public:Polynomial();Polynomial(double coefs, int exps, int

17、size); /系數(shù)數(shù)組、指數(shù)數(shù)組和項數(shù)Polynomial(const Polynomial&); Polynomial();Polynomial& operator=(const Polynomial&);int degree() const; /最高冪指數(shù)double evaluate(double x) const; /計算多項式的值bool operator=(const Polynomial&) const;bool operator!=(const Polynomial&) const;Polynomial operator+(const

18、Polynomial&) const;Polynomial operator-(const Polynomial&) const;Polynomial operator*(const Polynomial&) const;Polynomial& operator+=(const Polynomial&);Polynomial& operator-=(const Polynomial&);Polynomial& operator*=(const Polynomial&);解:class Polynomialdouble *p

19、coefs;int *pexps;int num_of_items; int add(const Polynomial &p, double *coefs, int *exps) const; int subtract(const Polynomial &p, double *coefs, int *exps) const;public :Polynomial();Polynomial(double coefs, int exps, int size);Polynomial(const Polynomial &p);Polynomial();Polynomial &am

20、p;operator=(const Polynomial &p);int degree() const;double evaluate(double x) const;bool operator=(const Polynomial &p) const;bool operator!=(const Polynomial &p) const;Polynomial operator+(const Polynomial &p) const;Polynomial operator-(const Polynomial &p) const;Polynomial oper

21、ator*(const Polynomial &p) const;Polynomial &operator+=(const Polynomial &p);Polynomial &operator-=(const Polynomial &p);Polynomial &operator*=(const Polynomial &p);int Polynomial:add(const Polynomial &p, double *coefs, int *exps) const int count=0,i=0,j=0; while (i&l

22、t;num_of_items && j<p.num_of_items) if (pexpsi = p.pexpsj) if (pcoefsi != -p.pcoefsj) coefscount = pcoefsi + p.pcoefsj; expscount = pexpsi; count+; i+; j+; else if (pexpsi < p.pexpsj) coefscount = pcoefsi; expscount = pexpsi; count+; i+; else coefscount = p.pcoefsj; expscount = p.pexps

23、j; count+; j+; if (i<num_of_items) while (i<num_of_items) coefscount = pcoefsi; expscount = pexpsi; count+; i+; else while (j<p.num_of_items) coefscount = p.pcoefsj; expscount = p.pexpsj; count+; j+; return count;int Polynomial:subtract(const Polynomial &p, double *coefs, int *exps) con

24、st int count=0,i=0,j=0; while (i<num_of_items && j<p.num_of_items) if (pexpsi = p.pexpsj) if (pcoefsi != p.pcoefsj) coefscount = pcoefsi - p.pcoefsj; expscount = pexpsi; count+; i+; j+; else if (pexpsi < p.pexpsj) coefscount = pcoefsi; expscount = pexpsi; count+; i+; else coefscount

25、 = -p.pcoefsj; expscount = p.pexpsj; count+; j+; if (i<num_of_items) while (i<num_of_items) coefscount = pcoefsi; expscount = pexpsi; count+; i+; else while (j<p.num_of_items) coefscount = -p.pcoefsj; expscount = p.pexpsj; count+; j+; return count;Polynomial:Polynomial()pcoefs=NULL;pexps=NU

26、LL;num_of_items=0;Polynomial:Polynomial(double coefs, int exps, int size)num_of_items=size;pcoefs=new doublenum_of_items;pexps=new intnum_of_items; int i;for (i=0; i<num_of_items; i+)pcoefsi=coefsi;pexpsi=expsi; /按指數(shù)排序(冒泡排序) for (i=num_of_items; i>1; i-) bool exchange=false; for (int j=1; j<

27、;i; j+) if (pexpsj < pexpsj-1) /交換pexpsj和pexpsj-1 int temp1=pexpsj; pexpsj = pexpsj-1; pexpsj-1 = temp1; /交換pcoefsj和pcoefsj-1 double temp2 = pcoefsj; pcoefsj = pcoefsj-1; pcoefsj-1 = temp2; exchange = true; if (!exchange) break; Polynomial:Polynomial(const Polynomial &p)num_of_items=p.num_of_

28、items;pcoefs=new doublenum_of_items;pexps=new intnum_of_items;for (int i=0; i<num_of_items; i+)pcoefsi=p.pcoefsi;pexpsi=p.pexpsi;Polynomial:Polynomial()delete pcoefs;delete pexps; pcoefs=NULL; pexps=NULL; num_of_items=0;Polynomial& Polynomial:operator=(const Polynomial &p)delete pcoefs; d

29、elete pexps; num_of_items=p.num_of_items;pcoefs=new doublenum_of_items;pexps=new intnum_of_items;for (int i=0; i<num_of_items; i+)pcoefsi=p.pcoefsi;pexpsi=p.pexpsi;return *this;int Polynomial:degree() constif (num_of_items = 0) return 0; else return pexpsnum_of_items-1;double Polynomial:evaluate(

30、double x) constdouble sum=0;for (int i=0; i<num_of_items; i+)double temp=pcoefsi;for (int j=0; j<pexpsi; j+)temp *= x;sum += temp;return sum;bool Polynomial:operator=(const Polynomial &p) constif (num_of_items != p.num_of_items) return false;for (int i=0; i<num_of_items; i+)if (pcoefsi!

31、=p.pcoefsi | pexpsi!=p.pexpsi)return false;return true;bool Polynomial:operator!=(const Polynomial &p) const return !(*this = p);Polynomial Polynomial:operator+(const Polynomial &p) constdouble *coefs=new doublenum_of_items+p.num_of_items;int *exps=new intnum_of_items+p.num_of_items;int coun

32、t=add(p,coefs,exps);Polynomial temp(coefs, exps, count); delete coefs; delete exps;return temp;Polynomial Polynomial:operator-(const Polynomial &p) constdouble *coefs=new doublenum_of_items+p.num_of_items;int *exps=new intnum_of_items+p.num_of_items;int count=subtract(p,coefs,exps);Polynomial te

33、mp(coefs, exps, count); delete coefs; delete exps;return temp;Polynomial Polynomial:operator*(const Polynomial &p) const Polynomial sum,temp=*this; for (int i=0; i<p.num_of_items; i+) for (int j=0; j<num_of_items; j+) temp.pcoefsj = pcoefsj * p.pcoefsi; temp.pexpsj = pexpsj + p.pexpsi; sum

34、 += temp; return sum;Polynomial &Polynomial:operator+=(const Polynomial &p)double *coefs=new doublenum_of_items+p.num_of_items;int *exps=new intnum_of_items+p.num_of_items;int count=add(p,coefs,exps); delete pcoefs; delete pexps; pcoefs = coefs; /有多余的空間,實際的項數(shù)由count決定。 pexps = exps; /同上。 num_

35、of_items = count;return *this;Polynomial &Polynomial:operator-=(const Polynomial &p)double *coefs=new doublenum_of_items+p.num_of_items;int *exps=new intnum_of_items+p.num_of_items;int count=subtract(p,coefs,exps); delete pcoefs; delete pexps; pcoefs = coefs; /有多余的空間,實際的項數(shù)由count決定。 pexps = e

36、xps; /同上。 num_of_items = count;return *this;Polynomial &Polynomial:operator*=(const Polynomial &p)Polynomial sum,temp=*this; for (int i=0; i<p.num_of_items; i+) for (int j=0; j<num_of_items; j+) temp.pcoefsj = pcoefsj * p.pcoefsi; temp.pexpsj = pexpsj + p.pexpsi; sum += temp; *this = s

37、um;return *this;6、 用操作符重載重新實現(xiàn)習題6-8中的第17題集合類的一些操作:<=(包含于)、=(相等)、!=(不等)、 |(并集)、 &(交集)、-(差集)、+=(增加元素)、-=(刪除元素)等。解:#include <iostream>using namespace std;struct Nodeint value;Node * next;class IntSetpublic:IntSet();IntSet(const IntSet& s);IntSet();bool is_empty() const; /判斷是否為空集。int siz

38、e() const; /獲取元素個數(shù)。bool is_element(int e) const; /判斷e是否屬于集合。void display() const; /顯示集合中的所有元素。bool operator <=(const IntSet& s) const; /判斷s是否包含于集合。bool operator =(const IntSet& s) const; /判斷集合是否相等。bool operator !=(const IntSet& s) const; /判斷集合是否不相等。IntSet& operator +=(int e); /將e加

39、入到集合中。IntSet& operator -=(int e); /把e從集合中刪除。IntSet operator |(const IntSet& s) const; /計算集合的并集。IntSet operator &(const IntSet& s) const; /計算集合的交集。IntSet operator -(const IntSet& s) const; /計算集合的差。 IntSet &operator = (const IntSet& s); /集合賦值private:int count;Node *head;Int

40、Set:IntSet()count=0;head=NULL;IntSet:IntSet(const IntSet &s)head = NULL;count = 0;Node *p=s.head;for (int i=0; i<s.count; i+)*this += (p->value);p = p->next;IntSet:IntSet()Node *p;while (head!=NULL)p = head;head = head->next;delete p;count=0;bool IntSet:is_empty() constreturn count=0

41、?true:false;int IntSet:size() constreturn count;bool IntSet:is_element(int e) constfor (Node *p=head;p!=NULL;p=p->next)if (p->value = e) return true;return false;bool IntSet:operator <=(const IntSet& s) constfor (Node *p=s.head;p!=NULL;p=p->next)if(!is_element(p->value) return fal

42、se;return true;bool IntSet:operator =(const IntSet& s) constif (count!=s.count)return false;else if (*this <= s && s <= *this)return true;elsereturn false;bool IntSet:operator !=(const IntSet& s) const return !(*this = s);void IntSet:display() constfor (Node *p=head;p!=NULL;p=p

43、->next)cout << p->value << 't'cout << endl;IntSet& IntSet:operator +=(int e)if(!is_element(e)Node *p=new Node;p->value = e;p->next = head;head = p;count+;return *this;IntSet& IntSet:operator -=(int e)if(is_element(e)if (head->value=e)Node *p=head;head

44、 = head->next;delete p;elsefor (Node *p=head; p->next!=NULL; p=p->next)if (p->next->value=e)Node *temp=p->next;p->next = temp->next;delete temp;break;count-;return *this;IntSet IntSet:operator |(const IntSet& s) constIntSet set(s);Node *p=head;while (p!=NULL)if (!set.is_e

45、lement(p->value)set += p->value;p=p->next;return set;IntSet IntSet:operator &(const IntSet& s) constIntSet set;Node *p=head;while (p!=NULL)if (s.is_element(p->value)set += p->value;p = p->next;return set;IntSet IntSet:operator -(const IntSet& s) constIntSet set;Node *p=

46、head;while (p!=NULL)if (!s.is_element(p->value)set += p->value;p = p->next;return set;IntSet &IntSet:operator = (const IntSet& s) Node *p;while (head!=NULL)p = head;head = head->next;delete p;count=0; p=s.head;for (int i=0; i<s.count; i+)*this += (p->value);p = p->next;

47、return *this;7、 定義一個帶下標范圍檢查、數(shù)組整體賦值和比較功能的一維int型數(shù)組類:IntArray。解:#include <iostream>using namespace std;class IntArrayint *p_buf;int size;public:IntArray(int n)size = n;p_buf = new intsize;for (int i=0; i<size; i+)p_bufi = 0;IntArray(const IntArray& x)size = x.size;p_buf = new intsize;for (

48、int i=0; i<size; i+)p_bufi = x.p_bufi;IntArray()delete p_buf;p_buf = NULL;size = 0;int& operator(int i) /取某位置上的字符,if (i < 0 | i >= size) cerr << "超出數(shù)組范圍!n"exit(-1);return p_bufi;int operator(int i) const /取某位置上的字符,用于常量對象if (i < 0 | i >= size) cerr << "超出

49、數(shù)組范圍!n"exit(-1);return p_bufi;IntArray& operator =(IntArray& x) if (&x = this) return *this;if (size != x.size) cerr << "兩個數(shù)組尺寸不同!n"exit(-1);for (int i=0; i<size; i+)p_bufi = x.p_bufi;return *this;bool operator =(IntArray& x)if (&x = this) return true;for

50、(int i=0; i<size; i+)if (p_bufi != x.p_bufi) return false;return true;bool operator !=(IntArray& x)return !(*this = x); 8、 定義一個不受計算機字長限制的整數(shù)類INT,要求INT與INT以及INT與C+基本數(shù)據(jù)類型int之間能進行、×、÷和運算,并且能通過cout輸出INT類型的值。解:#include <iostream>#include <cstring>using namespace std;class INTc

51、har *p_buf; /從低位到高位存儲整型數(shù),int buf_len, /p_buf所占空間大?。?0的倍數(shù)) sign; /整型數(shù)的符號(1為正,-1為負)void Add(const INT &i); /把i加到*this中void Minus(const INT &i); /從*this中減去iINT(char *p, int len, int s=1); /新對象的p_buf在已有的空間p上(不再另外分配空間)。public :INT();INT(int i);INT(char *num);INT(const INT &i);INT();INT &operator=(const INT &i); INT& INT:operator+=(const INT &i); INT& INT:operator-=(const INT &i);friend INT operator+(const INT &i1, const INT &i2);friend INT operator-(const INT

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論