C++第四章習題解答_第1頁
C++第四章習題解答_第2頁
C++第四章習題解答_第3頁
C++第四章習題解答_第4頁
C++第四章習題解答_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、21第四章 類與對象習題第四章 類與對象習題一. 基本概念與基礎知識自測題4.1 填空題5.1.1 引入類定義的關鍵字是 (1) 。類的成員函數通常指定為 (2) ,類的數據成員通常指定為 (3) 。指定為 (4) 的類成員可以在類對象所在域中的任何位置訪問它們。通常用類的 (5) 成員表示類的屬性,用類的 (6) 成員表示類的操作。答案:(1) class(2) 公有的public(3) 私有的private(4) 公有的public(5) 數據(6) 函數4.1.2 類的訪問限定符包括 (1) 、 (2) 和 (3) 。私有數據通常由(4) 函數來訪問(讀和寫)。這些函數統(tǒng)稱為 (5) 。

2、答案:(1) public(公有的)(2) private(私有的)(3) protected(保護的)(4) 公有的成員函數(5) 類的接口4.1.3 通常在邏輯上,同一類的每個對象都有 (1) 代碼區(qū),用以存儲成員函數。而在物理上通常只有 (2) 代碼區(qū)。只有在 (3) 定義,并 (4) 的函數和加了關鍵字 (5) 的函數例外。答案:(1) 獨立的(2) 共用的(3) 在類說明中(4) 不包括循環(huán)等復雜結構(5) inline4.1.4 C+中支持三種域: (1) 、 (2) 、 (3) 。函數域被包括在 (4) 中,全局域被包括在 (5) 中。using指示符以關鍵字using開頭,后面

3、是關鍵字 (6) ,最后是 (7) 。這樣表示以后在該名字空間中所有成員都 (8) 。如不使用using指示符則在使用時要加:,稱為 (9) 運算符。答案:(1) 局部域(local scope)(2) 名字空間域(namespace scope)(3) 類域(class scope)(4) 局部域(5) 名字空間域(6) namespace(7) 名字空間名(8) 可以直接被使用(9) 域4.1.5 引用通常用作函數的 (1) 和 (2) 。對數組只能引用 (3)不能引用 (4) 。答案:(1) 參數(2) 返回值(3) 數組元素(4) 數組名本身4.1.6 構造函數的任務是 (1) 。構造

4、函數無 (2) 。類中可以有 (3) 個構造函數,它們由 (4) 區(qū)分。如果類說明中沒有給出構造函數,則C+編譯器會 (5) ??截悩嬙旌瘮档膮凳?(6) ,當程序沒有給出復制構造函數時,系統(tǒng)會自動提供 (7) 支持,這樣的復制構造函數中每個類成員 (8) 。答案:(1) 初始化數據成員(2) 函數返回類型說明(3) 多(4) 不同的參數表(5) 自動給出一個默認的構造函數(6) 同一類對象的引用(7) 默認的的復制構造函,稱為默認的按成員語義支持。(8) 被依次復制4.1.7 一個類有 (1) 個析構函數。 (2) 時,系統(tǒng)會自動調用析構函數。答案:(1) 一(2) 對象注銷時4.1.8

5、運算符重載時,其函數名由 (1) 構成。成員函數重載雙目運算符時,左操作數是 (2) ,右操作數是 (3) 。答案:(1) 關鍵字operator和該運算符(2) 對象(3) 該函數的參數4.1.9 面向過程的程序設計中程序模型描述為 (1) ,面向對象程序設計的程序模型可描述為 (2) 。答案:(1)“程序=算法+數據結構”。其數據與數據處理是分離的。(2)程序=(對象+對象+對象)+消息;對象=(算法+數據結構)。面向對象設計將數據和對數據的操作方法放在一起,形成一個相對獨立的整體對象(Object),并通過簡單的接口與外部聯(lián)系。對象之間通過消息(Message)進行通訊。4.2 簡答題4

6、.2.1 簡單解釋什么是面向對象程序設計的封裝性。答:對象是一個封裝體,在其中封裝了該對象所具有的屬性和操作。對象作為獨立的基本單元,實現了將數據和數據處理相結合的思想。此外,封裝特性還體現在可以限制對象中數據和操作的訪問權限,從而將屬性“隱藏”在對象內部,對外只呈現一定的外部特性和功能。封裝性增加了對象的獨立性,C+通過建立數據類型類,來支持封裝和數據隱藏。一個定義完好的類一旦建立,就可看成完全的封裝體,作為一個整體單元使用,用戶不需要知道這個類是如何工作的,而只需要知道如何使用就行。另一方面,封裝增加了數據的可靠性,保護類中的數據不被類以外的程序隨意使用。這兩個優(yōu)點十分有利于程序的調試和維

7、護。4.2.2 C+編譯器怎樣對標識符進行解析?答:編譯器對標識符的解析分兩步,第一步查找在聲明中用到的標識符,特別是函數成員聲明中用到的參數類型,第二步是函數成員體內的標識符。4.2.3 為什么說類與對象的概念是客觀世界的反映?答:客觀世界的事物都具有某些屬性和行為(或操作),具有相同屬性和行為的事物可以歸屬于一類,用分類的方法可以提高認識事物的效率。C+中定義的類則是通過抽象的方法將某一類事物共有的靜態(tài)特征(屬性)和動態(tài)特征(行為)概括出來并加以描述,而對象是類的具體實現,所以說類與對象的概念是客觀世界的反映。4.2.4 什么叫類域?為什么說類域是抽象的?答:類域是類體所包括的范圍。每個類

8、定義都引入了一個獨立的類域,在類域中說明的標識符僅在該類的類域中有效。由于類只是一個說明,看上去有數據,有函數,有類型定義,但是它并非實體,不分配內存,當然也不能運行。所以說類域是抽象的。4.2.5 引用作為函數參數時為什么能實現兩個實參之間的數據交換?為什么對應實參不能為引用?為什么返回值為引用的函數可以作為左值?答:引用變量是其關聯(lián)變量的別名,二者在內存中占據同一個存儲單元。在一個以引用作為參數的函數中,交換兩個參數的值,實際上就是交換兩個實參的值。如果函數的參數是引用,調用時需要取得實參的地址,而實參如果已經是一個地址,再進行引用將產生錯誤,故對應實參不能為引用。函數返回引用實際是指明(

9、返回)了相應的關聯(lián)變量,所以聲明返回值為引用的函數實際上是將關聯(lián)變量作為左值參與運算。4.2.6 什么是缺省的構造函數?缺省的構造函數最多可以有多少個?答:如果在類定義中不顯式地定義構造函數,C+編譯器會自動產生一個缺省的構造函數,不過該函數不做具體的初始化工作。只要構造函數是無參的或者只要各參數均有缺省值的,C+編譯器都認為是缺省的構造函數。缺省的構造函數只能有一個。4.2.7 拷貝構造函數用于哪三個方面?答:(1) 用類的一個對象去初始化該類的另一個對象時使用。(2) 當函數的形參是類的對象,調用函數時,進行形參與實參結合時使用。(3) 當函數的返回值是類對象,函數執(zhí)行結束返回調用者時使用

10、。4.2.8 寫出含有對象成員的類的構造函數的格式,并做簡單說明。答:C+中對含對象成員的類對象的構造函數有固定的格式:類名:構造函數名(參數總表):對象成員1(參數名表1),對象成員2(參數名表2),對象成員n(參數名表n)冒號后用逗號隔開的是要初始化的對象成員,附在后面的參數名表1,參數名表n依次為調用相應對象成員所屬的構造函數時的實參表。這些表中的參數通常來自冒號前的參數總表,但沒有類型名。4.2.9 所有類對象未重載的賦值運算符“”是怎樣工作的?為什么它可以進行連續(xù)賦值?答:對所有的類對象,未重載的賦值運算符“ =”稱作缺省的按成員拷貝賦值操作符,同類對象之間可以用“=”直接拷貝。因為

11、缺省的賦值操作返回一個對象的引用,所以它可以進行連續(xù)賦值。4.2.10 為什么在友元函數的函數體內訪問對象成員時,必須用對象名加運算符“”再加對象成員名?答:友元函數不是類的成員函數,在函數體中訪問對象的成員,必須用對象名加運算符“.”加對象成員名。這一點和一般函數一樣。4.2.11 重載復數運算符時,采用下面友元函數聲明:friend Complex operator+(Complex &c1,Complex &c2);為什么不能用于“實數+復數”?怎樣改進才能適用?為什么?答:使用引用類型變量作為運算符重載函數的參數,身為左值的實數類型實參不能被轉換為復數,編譯時無法通過。

12、添加const說明,使實數到復數的轉換隱式地在一份拷貝上進行,則可以實現“實數+復數”運算。修改后的說明為:friend Complex operator+(const Complex &c1, const Complex &c2);4.2.12 類的靜態(tài)數據成員與函數中的靜態(tài)成員有何異同?答:類的靜態(tài)成員為其所有對象共享,不管有多少對象,靜態(tài)成員只有一份存于公用內存中,為該類所有對象公用。函數中的靜態(tài)變量也位于公用內存中,不隨函數調用而重新分配,所以總是保留上次進入并執(zhí)行該函數后留下的信息。4.2.13 C+中結構、聯(lián)合與類三者間有何異同?答:在C+中結構(structure

13、)與類幾乎是完全一樣的類型,差別僅僅在于缺省情況下結構的成員為公有的。聯(lián)合(union)是C+的導出數據類型,在語法與功能上類似于結構,二者的區(qū)別是:結構變量的各成員同時被分配了各自獨立的內存區(qū),而聯(lián)合變量的各個成員的存儲開始地址都相同,所以在任一時刻聯(lián)合變量只能存儲一個成員。4.2.14 對象的第一特征是封裝,那么由對象組成的面向對象的程序怎樣建立各對象之間的有效聯(lián)系?面向對象程序的組織與面向過程有什么不同?答:因為對象的操作主要用來響應外來消息并為其他對象提供服務,所以面向對象的程序利用消息傳遞機制來建立各對象之間的有效聯(lián)系,協(xié)調各對象的運行。一個對象可以向其他對象發(fā)送消息以請求服務,也可

14、以響應其他對象傳來的消息,完成自身固有的某些操作,從而服務于其他對象。面向過程的程序是模塊化的,模塊的組織具有分層結構特點,層與層之間是調用關系。面向對象程序是由一個個封裝的對象組成,而對象是由緊密結合在一起的算法和數據結構組成。對象之間是相互請求和相互協(xié)作的關系。4.2.15 簡敘Windows下應用程序的運行方式。答:Windows系統(tǒng)支持多個應用程序同時執(zhí)行,在界面形式上,它支持多個窗口同時活動。它的運行機制是“消息傳遞和事件驅動(message based and event driven)”。Windows系統(tǒng)使用事件驅動的編程模式。所謂事件的含義非常廣泛。輸入設備的動作,如敲打鍵盤

15、、按鼠標等會產生一系列的事件(注意不是一個事件)。操作系統(tǒng)所作的一舉一動也被當作某種類型的事件,應用程序也會產生各種事件。事件用來標識發(fā)生的某件事情。Windows系統(tǒng)對于應用程序環(huán)境中發(fā)生的每一個事件都會以對應的某種消息的形式標識,并放入相應的Windows建立的消息隊列中,然后由對應的應用程序或窗口函數去處理。窗口函數處理是分層的,前面處理不了的送到后面,最后處理不了剩下的全由缺省的窗口函數處理。4.2.16 類的成員函數在什么情況下應該定義為私有的?這樣做的目的是什么?答:除接口函數和創(chuàng)建本類對象的構造函數和撤消該對象的析構函數外。其余成員函數應該定義為私有的,這是開發(fā)類時故意對外隱蔽起

16、來的操作,而這些往往是最復雜最關鍵的部分。類中故意的隱藏也為以后的升級擴展留下了余地,只要接口不變,內部再變,也不必修改原來的程序,就象MFC(微軟基礎類)升級后,由MFC底層類所編的程序完全不必修改,自動升級。二編程與綜合練習題4.3 構造一個日期時間類(Timedate),數據成員包括年、月、日和時、分、秒,函數成員包括設置日期時間和輸出時間,其中年、月請用枚舉類型,并完成測試。(包括用成員函數和用普通函數)解:本題要求僅是定義類的練習,并非實用的提供日期時間的程序。實用的日期時間程序見附錄二的日期時間函數。#include <iostream>#include <iom

17、anip>using namespace std;enum YRY2000,Y2001,Y2002,Y2003,Y2004,Y2005;/enum MTJan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec;class Timedateprivate:YR year;MT month;int date;int hh;int mm;int ss;public:Timedate()year=Y2000;month=Jan;date=1;hh=0;mm=0;ss=0;Timedate(YR a,MT b,int c)year=a;month=b;date

18、=c;hh=12;mm=30;ss=0;void getdate(YR &,MT &,int &);/使用引用一次取得3個數值void gettime(int &,int &,int &);void putdate(YR ,MT ,int );void puttime(int ,int ,int );void list();void Timedate:getdate(YR &y,MT &m,int &d)y=year;m=month;d=date;void Timedate:gettime(int &a,int &

19、amp;b,int &c)a=hh;b=mm;c=ss;void Timedate:putdate(YR a,MT b,int c)year=a;month=b;date=c;void Timedate:puttime(int a,int b,int c)hh=a;mm=b;ss=c;void Timedate:list()/成員函數,直接訪問私有的數據成員cout<<"year/month/date :"switch(year)case Y2000:cout<<"2000"break;case Y2001:cout<

20、;<"2001"break;case Y2002:cout<<"2002"break;case Y2003:cout<<"2003"break;case Y2004:cout<<"2004"break;case Y2005:cout<<"2005"break;switch(month)case Jan:cout<<'/'<<"Jan"break;case Feb:cout<&l

21、t;'/'<<"Feb"break;case Mar:cout<<'/'<<"Mar"break;case Apr:cout<<'/'<<"Apr"break;case May:cout<<'/'<<"May"break;case Jun:cout<<'/'<<"Jun"break;case Jul:cout&

22、lt;<'/'<<"Jul"break;case Aug:cout<<'/'<<"Aug"break;case Sep:cout<<'/'<<"Sep"break;case Oct:cout<<'/'<<"Oct"break;case Nov:cout<<'/'<<"Nov"break;case Dec:

23、cout<<'/'<<"Dec"break;cout<<'/'<<date<<endl;cout<<"hour:minite:second :"cout<<hh<<':'<<mm<<':'<<ss<<endl;void list(Timedate td)/普通函數,通過接口函數訪問私有的數據成員YR year;MT month;int date;in

24、t hh;int mm;int ss;td.getdate(year,month,date);cout<<"year/month/date :"switch(year)case Y2000:cout<<"2000"break;case Y2001:cout<<"2001"break;case Y2002:cout<<"2002"break;case Y2003:cout<<"2003"break;case Y2004:cout<&

25、lt;"2004"break;case Y2005:cout<<"2005"break;switch(month)/,case Jan:cout<<'/'<<"Jan"break;case Feb:cout<<'/'<<"Feb"break;case Mar:cout<<'/'<<"Mar"break;case Apr:cout<<'/'

26、<<"Apr"break;case May:cout<<'/'<<"May"break;case Jun:cout<<'/'<<"Jun"break;case Jul:cout<<'/'<<"Jul"break;case Aug:cout<<'/'<<"Aug"break;case Sep:cout<<'/

27、'<<"Sep"break;case Oct:cout<<'/'<<"Oct"break;case Nov:cout<<'/'<<"Nov"break;case Dec:cout<<'/'<<"Dec"break;td.gettime(hh,mm,ss);cout<<'/'<<date<<endl;cout<<&q

28、uot;hour:minite:second :"cout<<hh<<':'<<mm<<':'<<ss<<endl; int main()Timedate A(Y2004,Mar,3),B;A.list();B.list();B.putdate(Y2005,Oct,18);B.puttime(17,30,00);list(B);return 0;4.4 設計并測試一個矩形類(Rectangle),屬性為矩形的左下與右上角的坐標,矩形水平放置。操作為計算矩形周長與面積。測試包括用成員

29、函數和普通函數。解:這里的矩形的4邊分別與x軸y軸平行,為最簡單的情況。注意參數有缺省值的函數的聲明和定義格式。#include <iostream>#include <cmath>using namespace std;class Rectangle double left, top ;double right, bottom;public:Rectangle(double l=0, double t=0, double r=0, double b=0); Rectangle(); /析構函數,在此函數體為空void Assign(double l,double t,

30、double r,double b);double getLeft() return left; / 以下四個函數皆為內聯(lián)成員函數double getRight() return right;double getTop()return top;double getBottom()return bottom;void Show();double Area();double Perimeter();/ 構造函數,帶缺省參數,缺省值為全0,在聲明中指定Rectangle:Rectangle(double l , double t, double r, double b) left = l; top

31、= t;right = r; bottom = b; void Rectangle:Assign(double l, double t, double r, double b)/賦值left = l; top = t;right = r; bottom = b;void Rectangle:Show()/成員函數直接使用私有的數據成員cout<<"left-top point is ("<<left<<","<<top<<")"<<'n'cout&

32、lt;<"right-bottom point is ("<<right<<","<<bottom<<")"<<'n'double Rectangle:Area()return fabs(right-left)*(bottom-top);double Rectangle:Perimeter()return 2*(fabs(right-left)+fabs(bottom-top);int main()Rectangle rect; rect.Show();

33、rect.Assign(100,200,300,400);rect.Show();Rectangle rect1(0,0,200,200);rect1.Show();Rectangle rect2(rect1);rect2.Show();cout<<"面積"<<rect.Area()<<'t'<<"周長"<<rect.Perimeter()<<endl;return 0;4.5 定義一個圓類(Circle),屬性為半徑(radius)、圓周長和面積,操作為輸入半徑并計

34、算周長、面積,輸出半徑、周長和面積。要求定義構造函數(以半徑為參數,缺省值為0,周長和面積在構造函數中生成)和拷貝構造函數。解:通常所有數據成員都在構造函數中賦初值??截悩嬙旌瘮狄员绢惖囊脼閰?。#include<iostream>#include<cmath>using namespace std;class Circledouble r,Area,Circumference;public:Circle(double a=0);Circle(Circle &);void SetR(double R);double GetR()return r;double

35、GetAreaCircle()return Area;double GetCircumference()return Circumference;Circle:Circle(double a)r=a;Area=r*r*3.14159265;Circumference=2*r*3.14159265;Circle:Circle(Circle & cl)r=cl.r;Area=cl.Area;Circumference=cl.Circumference;void Circle:SetR(double R)r=R;Area=r*r*3.14159265;Circumference=2*r*3.

36、14159265;int main()Circle cl1(2),cl2,cl3=cl1;cout<<"圓半徑:"<<cl3.GetR()<<'t'<<"圓周長:"<<cl3.GetCircumference()<<'t'<<"圓面積:"<<cl3.GetAreaCircle()<<endl;cl2.SetR(4);cout<<"圓半徑:"<<cl2.G

37、etR()<<'t'<<"圓周長:"<<cl2.GetCircumference()<<'t'<<"圓面積:"<<cl2.GetAreaCircle()<<endl;return 0;4.6 設計一個學校在冊人員類(Person)。數據成員包括:身份證號(IdPerson),姓名(Name),性別(Sex),生日(Birthday)和家庭住址(HomeAddress)。成員函數包括人員信息的錄入和顯示。還包括構造函數與拷貝構造函數。設計一個

38、合適的初始值。解:本題為指出構造函數等的調用,加了一些提示語句。#include<iostream>#include<cstring>using namespace std;enum Tsexmid,man,woman;class Personchar IdPerson19;/身份證號,18位數字char Name20;/姓名Tsex Sex;/性別int Birthday;/生日,格式1986年8月18日寫作19860818char HomeAddress50;/家庭地址public:Person(char *,char *,Tsex,int,char *);Pers

39、on(Person &);Person();Person();void PrintPersonInfo();void inputPerson();/其他接口函數;Person:Person(char *id,char *name,Tsex sex,int birthday,char *homeadd)cout<<"構造Person"<<endl;strcpy(IdPerson,id);strcpy(Name,name);Sex=sex;Birthday=birthday;strcpy(HomeAddress,homeadd);Person:P

40、erson()cout<<"缺省構造Person"<<endl;IdPerson0='0'Name0='0'Sex=mid;Birthday=0;HomeAddress0='0'Person:Person(Person & Ps)cout<<"拷貝構造Person"<<endl;strcpy(IdPerson,Ps.IdPerson);strcpy(Name,Ps.Name);Sex=Ps.Sex;Birthday=Ps.Birthday;strcpy

41、(HomeAddress,Ps.HomeAddress);Person:Person()cout<<"析構Person"<<endl;void Person:inputPerson()char ch;cout<<"請輸入身份證號,18位數字:"<<endl;cin.getline(IdPerson,19);cout<<"請輸入姓名:"<<endl;cin.getline(Name,20);cout<<"請輸入性別m或w:"<&

42、lt;endl;cin>>ch;if(ch='m') Sex=man;else Sex=woman;cout<<"請輸入生日,格式1986年8月18日寫作19860818:"<<endl;cin>>Birthday;cin.get(); /吸收回車符,否則地址輸不進去cout<<"請輸入地址:"<<endl;cin.getline(HomeAddress,50);void Person:PrintPersonInfo()int i;cout<<"

43、身份證號:"<<IdPerson<<'n'<<"姓名:"<<Name<<'n'<<"性別:"if(Sex=man)cout<<"男"<<'n'else if(Sex=woman)cout<<"女"<<'n' else cout<<" "<<'n'cout<&l

44、t;"出生年月日:"i=Birthday;cout<<i/10000<<"年"i=i%10000;cout<<i/100<<"月"<<i%100<<"日"<<'n'<<"家庭住址:"<<HomeAddress<<'n'int main()Person Ps1("320102811226161","朱海鵬",

45、man,19811226,"南京市黃浦路1號"),Ps2(Ps1),Ps3;Ps1.PrintPersonInfo();Ps2.PrintPersonInfo();Ps3.inputPerson();Ps3.PrintPersonInfo();return 0;4.7 對上面4道題中的類對象的數據,由友元函數來進行訪問。并對比友元函數、成員函數和普通函數使用上的不同。解:友元函數可直接訪問私有成員。友元函數在類中聲明時不問訪問權限。僅以5.4題為例。#include <iostream>#include <cmath>using namespace

46、std;class Rectangle double left, top ;double right, bottom;public:Rectangle(double l=0, double t=0, double r=0, double b=0); Rectangle(); /析構函數,在此函數體為空void Assign(double l,double t,double r,double b);double getLeft() return left; / 以下四個函數皆為內聯(lián)成員函數double getRight() return right;double getTop()return t

47、op;double getBottom()return bottom;void Show();friend void showprint(Rectangle);double Area();double Perimeter();/ 構造函數,帶缺省參數,缺省值為全0,在聲明中指定Rectangle:Rectangle(double l , double t, double r, double b) left = l; top = t;right = r; bottom = b; void Rectangle:Assign(double l, double t, double r, double

48、b)/賦值left = l; top = t;right = r; bottom = b;double Rectangle:Area()return fabs(right-left)*(top-bottom);double Rectangle:Perimeter()return 2*(fabs(right-left)+fabs(top-bottom);void Rectangle:Show()/成員函數cout<<"left-top point is ("<<left<<","<<top<<&q

49、uot;)"<<'n'cout<<"right-bottom point is ("<<right<<","<<bottom<<")"<<'n'void showprint(Rectangle rt)/友元函數,要加類名,但直接調用私有數據成員cout<<"left-top point is ("<<rt.left<<","<&l

50、t;rt.top<<")"<<'n'cout<<"right-bottom point is ("<<rt.right<<","<<rt.bottom<<")"<<'n'void print(Rectangle rt)/普通函數,要用接口函數間接調用私有數據成員cout<<"left-top point is ("<<rt.getLeft()&l

51、t;<","<<rt.getTop()<<")"<<'n'cout<<"right-bottom point is ("<<rt.getRight()<<","<<rt.getBottom()<<")"<<'n'int main()Rectangle rect; rect.Show();rect.Assign(100,400,300,200);rect

52、.Show();Rectangle rect1(0,200,200,0);rect1.Show();Rectangle rect2(rect1);rect2.Show();print(rect);showprint(rect);cout<<"面積"<<rect.Area()<<'t'<<"周長"<<rect.Perimeter()<<endl;return 0;4.8 為復數類(Complex)增加重載的運算符-、-=、*=和/=。設+為實部和虛部各自增一,亦請重載前

53、置與后置+運算符。分別使用成員函數和友元函數各做一遍。并測試。解:注意后+,返回的是原值,但實部和虛部已各自增一,所以要先保留原值,再+。這里是使用成員函數。#include<iostream>using namespace std;class complex private: double real; /實部 double imag; /虛部 public: complex(double r = 0.0 ,double i = 0.0 ); /構造函數 void print(); /顯示復數 complex operator +(complex c); /重載復數"+&

54、quot; complex operator -(complex c); /重載復數"-" complex operator *(complex c); /重載復數"*" complex operator /(complex c); /重載復數"/" complex operator +=(complex c); /重載復數"+=" complex operator -=(complex c); /重載復數"-=" complex operator *=(complex c); /重載復數&qu

55、ot;*=" complex operator /=(complex c); /重載復數"/=" complex operator +(); /重載復數前綴"+" complex operator +(int); /重載復數后綴"+"complex:complex(double r,double i)real = r;imag = i;complex complex:operator +(complex c) /重載復數"+"complex temp;temp.real=real+c.real;temp.

56、imag=imag+c.imag;return temp; /返回局部變量,函數聲明不可為引用,這時返回了局部變量的地址complex complex:operator -(complex c) /重載復數"-"complex temp;temp.real=real-c.real;temp.imag=imag-c.imag;return temp;complex complex:operator *(complex c) /重載復數"*"complex temp; temp.real=real*c.real-imag*c.imag; temp.imag=

57、real*c.imag+imag*c.real;return temp;complex complex:operator /(complex c) /重載復數"/"complex temp; double d; d=c.real*c.real+c.imag*c.imag; temp.real=(real*c.real+imag*c.imag)/d; temp.imag=(c.real*imag-real*c.imag)/d; return temp;complex complex:operator +=(complex c) /重載復數"+="compl

58、ex temp;temp.real=real+c.real;temp.imag=imag+c.imag;real=temp.real;imag=temp.imag;return temp;complex complex:operator -=(complex c) /重載復數"-="complex temp;temp.real=real-c.real;temp.imag=imag-c.imag;real=temp.real;imag=temp.imag;return temp;complex complex:operator *=(complex c) /重載復數"

59、;*="complex temp; temp.real=real*c.real-imag*c.imag; /如果沒有用temp過渡,real賦了新值,下一行的計算就錯了 temp.imag=real*c.imag+imag*c.real;real=temp.real; imag=temp.imag; return temp;complex complex:operator /=(complex c) /重載復數"/="complex temp; double d; d=c.real*c.real+c.imag*c.imag; temp.real=(real*c.r

60、eal+imag*c.imag)/d;/如果沒有用temp過渡,real賦了新值,下一行的計算就錯了 temp.imag=(c.real*imag-real*c.imag)/d;real=temp.real;imag=temp.imag; return temp;complex complex:operator +() /重載復數前綴"+"complex temp;temp.real=+real;temp.imag=+imag;return temp;complex complex:operator +(int) /重載復數后綴"+"complex te

61、mp(real,imag);real+;imag+;return temp;void complex:print() /顯示復數cout << real;if(imag>=0) cout<<'+'cout<<imag<<'i'<<endl;int main()complex A(30,40),B(15,30),C,D; /定義4個復數對象cout<<"A為:"A.print();C= A.operator+(1);/即C=A+完整的表達式cout<<&q

62、uot;C=A+后,C為:"C.print();cout<<"A為:" A.print();C= A.operator+();/即+Acout<<"C=+A后,C為:"C.print();cout<<"A為:" A.print();C=A*B;cout<<"C=A*B后,C為:" C.print();A*=B;cout<<"A*=B后,A為:" A.print();C=A/B;cout<<"C=A/B后,C為:" C.print();A/=B;cout<<"A/=B后,A為: " A.print();cout<<"B為:" B.print();D=A+B+C;cout<<"D=A+B+C后,D為:" D

溫馨提示

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

評論

0/150

提交評論