第六章作業(yè)內容(答案)_第1頁
第六章作業(yè)內容(答案)_第2頁
第六章作業(yè)內容(答案)_第3頁
第六章作業(yè)內容(答案)_第4頁
第六章作業(yè)內容(答案)_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第六章作業(yè)內容一、選擇題1運算符重載時不需要保持的性質是:( A ) A操作數(shù)類型 B操作數(shù)個數(shù) C優(yōu)先級 D結合性 理由:操作數(shù)實際上對應的是重載函數(shù)的參數(shù),按照重載函數(shù)的定義,其構成的條件是參數(shù)不同,對于運算符來說,要求其操作數(shù)個數(shù)必須相同,就是參數(shù)個數(shù)相同,因此就需要要求參數(shù)類型不同,即操作數(shù)類型不同。2在C+中,要實現(xiàn)動態(tài)聯(lián)編,必須使用(D)調用虛函數(shù)。A類名 B派生類指針 C對象名 D基類指針理由:3. 有如下類定義和變量定義:#include<iostream.h>class Xint a; void setX (int x) a=x; public: void sho

2、wX() cout<<"a="<<a<<endl; ;class Y: private X/*類定義省略*/;class Z: public X/*類定義省略*/;Y objY;Z objZ;下列語句中正確的是:( D )AobjY.setX(3);BobjY.showX();CobjZ.setX(4);DobjZ.showX(); 理由:因為類Y,Z對X的繼承方式不同,Y對X 是私有繼承,Z對X 是公有繼承,導致了X類的成員都是Y類的私有成員,而 X類的成員在Z類中的訪問方式都和在X類中一樣不變。因此,setX、showX都是Y類的私有

3、成員,所以Y類的對象objY不能直接訪問setX、showX;setX是Z類的私有成員,showX是Z類的公有成員,所以Z類的對象objZ可以直接訪問showX,而不能訪問 setX函數(shù);4. 有如下類定義: #include<iostream.h>class A int xx;public: A():xx(0)cout<<'A' A(int n):xx(n)cout<<'B'class B: public A int yy; public:B():yy(0)cout<<yy;B(int n):A(n+1),yy(

4、n) cout<<yy;B(int m,int n):A(m),yy(n) cout<<yy;下列選項中,輸出結果為A0的語句是:( D ) AB y1(0,0); BB y2(1); CB y3(0); DB y4; 理由:要使輸出結果為A0,主要看定義的派生類對象B調用的是哪一個構造函數(shù)(基類和派生類),分析構造函數(shù):l 基類構造函數(shù)中,默認構造函數(shù)輸出“A”,即調用無慘構造函數(shù)l 派生類構造函數(shù)中,沒有給基類傳遞參數(shù)的是默認構造函數(shù),且輸出“0”所以,定義對象的語句一定沒有參數(shù),即B y4;5 己知表達式a+中的“+”是作為友元函數(shù)重載的運算符,則與a+等效的運算

5、符函數(shù)調用形式為:( C ) Aa .orerator+(1); Boperator+(a); Coperator+(a, 0); Da.operator+(a, 0 ); 理由:既然是友元函數(shù),a+又是后置+運算符,所以其運算符重載函數(shù)有兩個參數(shù),一個是當前對象,一個是后置標志,多一個int類型參數(shù)。調用的形式是:a+; 或operator+(a,0);所以,選擇(C).其他選項:6下列函數(shù) 中,不能說明為虛函數(shù)的是(C)。A私有成員函數(shù) B公有成員函數(shù) C構造函數(shù) D析構函數(shù)理由:7以下基類中的成員函數(shù),哪個表示純虛函數(shù)(C)。 Avirtual void vf(int);Bvo

6、id vf(int)=0; Cvirtual void vf( )=0;Dvirtual void vf(int) 理由:8類定義如下。class Apublic:virtual void func1( ) virtual void func2( ) ;class B:public Apublic:void func1( ) cout<<”class B func1”<<endl;virtual void func2( ) cout<<”class B func2”<<endl;則下面正確的敘述是(A) AA:func2( )和B:func1(

7、)都是虛函數(shù) BA:func2( )和B:func1( )都不是虛函數(shù) CB:func1( )是虛函數(shù),而A:func2( )不是虛函數(shù) DB:func1( )不是虛函數(shù),而A:func2( )是虛函數(shù)理由:9C+中多態(tài)性包括兩種多態(tài)性:編譯時的和運行時的,前者是通過_來實現(xiàn)的(A)A函數(shù)和運算符的重載B類繼承關系C虛函數(shù)D抽象類理由:10下列關于虛函數(shù)的說明中,正確的是( B)。 A從虛基類繼承的函數(shù)都是虛函數(shù) B虛函數(shù)不能是靜態(tài)成員函數(shù) C只能通過指針或引用調用虛函數(shù) D抽象類中的成員函數(shù)都是虛函數(shù)理由:11下列運算符中,_運算符不能重載為成員函數(shù)。CA賦值運算符= B函數(shù)調用運算符( )

8、 C輸出運算符<< D后置+理由:輸出運算符<<的第一個操作數(shù)不是當前類的對象,按照C+語言規(guī)定,這種情況只能定義為友元運算符重載函數(shù)。12類B是類A的公有派生類,類A和類B中都定義了虛函數(shù)func( ),p是一個指向類A對象的指針,則p->A:func( )將(A)。 A調用類A中的函數(shù)func( ) B調用類B中的函數(shù)func( ) C根據(jù)p所指的對象類型而確定調用類A中或類B中的函數(shù)func( ) D既調用類A中函數(shù),也調用類B中的函數(shù)理由:二、問答題:1 是否使用了虛函數(shù)就能實現(xiàn)運行時的多態(tài)性?怎樣才能實現(xiàn)運行時的多態(tài)性?答:不是。首先要在基類中定義虛函數(shù)

9、,并在其派生類中定義重名的虛函數(shù)。派生類一定以公有方式繼承了基類。實現(xiàn)運行時的多態(tài)性時,必須使用基類類型的指針變量或引用,使該指針指向該基類的不同派生類的對象,并通過該指針指向虛函數(shù),才能實現(xiàn)動態(tài)的多態(tài)性。2 為什么析構函數(shù)總是要求說明為虛函數(shù)?答:在基類中及其派生類中都動態(tài)分配內存空間時,必須把析構函數(shù)定義為虛函數(shù),實現(xiàn)撤消對象時的多態(tài)性。根據(jù)賦值兼容規(guī)則可以用基類的指針指向派生類對象,如果由該指針撤銷派生類對象,未將析構函數(shù)說明為虛函數(shù),則會調用基類的析構函數(shù),使對象釋放不完全。因此必須將析構函數(shù)說明為虛函數(shù),實現(xiàn)多態(tài)性,自動調用派生類析構函數(shù),使得所定義的派生類對象得到完全的釋放。3.

10、存在這樣的抽象類嗎?該類定義中并沒有定義純虛函數(shù)。答:存在這樣的抽象類,該類繼承的基類中定義了純虛函數(shù),而該類定義中沒有重新定義純虛函數(shù),但該類繼承了純虛函數(shù),所以該類也存在純虛函數(shù),所以也是抽象類。4. 定義虛函數(shù)的目的是什么?定義純虛函數(shù)有什么作用? 答:定義虛函數(shù)的目的是實現(xiàn)動態(tài)多態(tài)性;作用是定義純虛函數(shù)的目的在于基類給派生類提供一個標準的函數(shù)原型,統(tǒng)一接口,為實現(xiàn)動態(tài)多態(tài)性打下基礎,派生類將根據(jù)需要給出純虛函數(shù)的具體實現(xiàn)代碼。三、讀程序按要求做題1以下程序如果將Point類的析構函數(shù)定義為虛函數(shù),輸出結果是什么?試分析原因#include<iostream>using na

11、mespace std;class Pointpublic:Point(float a,float b):x(a),y(b)Point()cout<<"executing Point destructor"<<endl;private:float x;float y;class Circle:public Pointpublic:Circle(int a,int b,int r):Point(a,b),radius(r)Circle ()cout<<"execting Circle destructor"<<

12、;endl;private:float radius;int main()Point*p=new Circle(2.5,1.8,4.5);delete p;return 0;原運行結果為:executing Point destructorPress any key to continue修改后運行結果為:execting Circle destructorexecuting Point destructorPress any key to continue原因:指針p是指向派生類的基類指針,在不生命析構函數(shù)為虛函數(shù)時,編譯器實施靜態(tài)綁定,在刪除基類指針時,只調用指針所屬的基類的析構函數(shù),而不

13、調用派生類的析構函數(shù),析構不完全,出現(xiàn)最初的運行結果。而將基類的析構函數(shù)聲明為虛函數(shù),刪除該在指針時,就會實現(xiàn)動態(tài)多態(tài)性,調用該指針指向的派生類的析構函數(shù),而派生類的析構函數(shù)又會自動調用基類的析構函數(shù),使整個對象完全釋放,出現(xiàn)修改后的運行結果。2找出下面程序運行結果錯誤的原因(未按+、-運算符的要求做),并改正。#include<iostream.h>class coord int x,y; public: coord(int i=0,int j=0); void print(); friend coord & operator+(coord op);/;coord:coo

14、rd(int i,int j)x=i;y=j;void coord:print()cout<<" x:"<<x<<",y:"<<y<<endl;coord & operator +(coord op)/ +op.x; +op.y; return op;main() coord ob(10,20); ob.print(); +ob;/ ob.print(); operator+(ob);/ ob.print(); return 0;答:錯誤在于+重載函數(shù)改變了原來的+應該實現(xiàn)的功能。因為+

15、運算的實際意義是改變其作用的變量(操作數(shù))的值,所以一定要考慮傳遞的參數(shù)必須被改變(即必須是傳地址(指針/引用),否則就沒有實現(xiàn)原來+的功能。因此,該程序需要修改的語句為:friend coord & operator+(coord op); 修改為:friend coord & operator+(coord &op);coord & operator +(coord op)/ 修改為:coord & operator +(coord &op)3 讀下列程序,按要求做題#include<iostream.h>class B0publ

16、ic:void display()cout<<"B0:display()"<<endl;class B1:public B0public:void display()cout<<"B1:display()"<<endl;class D1:public B1public:void display()cout<<"D1:display()"<<endl;void main()B0 b0,*p;B1 b1;D1 d1;p=&b0;p->display();

17、p=&b1;p->display();p=&d1;p->display();如果把B0修改如下:Class B0public:void virtual display()=0;將主函數(shù)修改為:void main()B0 *p;B1 b1;D1 d1;p=&b0;p->display();p=&b1;p->display();p=&d1;p->display();運行結果結果分別為什么,并分析原因。原運行結果為:B0:display()B0:display()B0:display()Press any key to conti

18、nue修改后運行結果為:B0:display()B1:display()D1:display()Press any key to continue原因:在未修改前,p定義為基類指針,編譯器實施靜態(tài)綁定,雖然將指針指向派生類對象,但是在調用display函數(shù)時,依然調用基類中的display函數(shù)。而在修改后,基類中display函數(shù)被聲明為虛函數(shù),則派生類中同名的display函數(shù)都默認變?yōu)樘摵瘮?shù),所以在指針指向派生類對象時,實施動態(tài)多態(tài)性,調動指針當前指向的派生類對象中的display函數(shù),出現(xiàn)修改后的運行結果四、編程題1寫一個程序,定義抽象基類Shape,由它派生出5個派生類:Circle(

19、圓形)、Square(正方形)、Rectangle(矩形)、Trapezoid(梯形)、Triangle(三角形)。用虛函數(shù)分別計算幾種圖形面積,并求它們的和。要求用基類指針數(shù)組,使它每一個元素指向一個派生類對象。#include<iostream>using namespace std;const double PI=3.14;class Shape/抽象基類public: virtual double area() const=0; virtual void display() const=0;class Circle:public Shape/ 圓面積public: Circ

20、le(double a):r(a) virtual double area()constreturn PI*r*r; virtual void display()const cout<<"圓面積:tt"<<area()<<endl; private: double r;class Rectangle:public Shape/矩形面積public: Rectangle(double a,double b):l(a),w(b) virtual double area()constreturn l*w; virtual void displa

21、y()const cout<<"矩形面積:t"<<area()<<endl; private: double l; double w;class Triangle:public Shape/三角形面積public: Triangle(double a,double b):d(a),h(b) virtual double area()constreturn (d*h)/2; virtual void display()const cout<<"三角形面積:t"<<area()<<end

22、l; private: double d; double h;class Square:public Shape/正方形面積public: Square(double a):a1(a) virtual double area()constreturn a1*a1; virtual void display()const cout<<"正方形面積:t"<<area()<<endl; private: double a1;class Trapezoid:public Shape/梯形面積public: Trapezoid(double sd,

23、double xd,double h):shad(sd),xiad(xd),hight(h) virtual double area()constreturn (shad+xiad)*hight)/2; virtual void display()const cout<<"梯形面積:t"<<area()<<endl; private: double shad; double xiad; double hight;int main() Circle c1(1); Rectangle r1(1,2); Triangle t1(2,1); Sq

24、uare s1(1); Trapezoid tra1(1,2,1);Shape *p5=&c1,&r1,&t1,&s1,&tra1; /*Shape *p5;p0=&c1;p1=&r1;p2=&t1;p3=&s1;p4=&tra1;*/double m=0.0; for (int i=0;i<5;i+) pi->display(); m=m+pi->area(); cout<<"總面積:tt"<<m<<endl;return 0;運行結果為:圓面積: 3.14矩形面積: 2三角形面積: 1正方形面積: 1梯形面積: 1.5總面積: 8.64Press any key to continue2某學校對教師每月工資的計算公式如下:固定工資+課時補貼。教授的固定工資為5000元,每個課時補貼50元;副教授的固定工資為3000元,每個課時補貼30

溫馨提示

  • 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

提交評論