C-面向對象程序設計教程-第-版-陳維興-林小茶課后習題答案及解析_第1頁
C-面向對象程序設計教程-第-版-陳維興-林小茶課后習題答案及解析_第2頁
C-面向對象程序設計教程-第-版-陳維興-林小茶課后習題答案及解析_第3頁
C-面向對象程序設計教程-第-版-陳維興-林小茶課后習題答案及解析_第4頁
C-面向對象程序設計教程-第-版-陳維興-林小茶課后習題答案及解析_第5頁
已閱讀5頁,還剩83頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C++面向對象程序設計教程課后題答案

1.1??什么是面向對象程序設計?

面向對象程序設計是一種新的程序設計范型.這種范型的主要特征是:

程序=對象+消息

面向對象程序的基本元素是對象。

主要結構特點是:

第一,??程序一般由類的定義和類的使用兩部分組成;

第二,??程序中的一切操作都是通過向對象發(fā)送消息來實現(xiàn)的。

1.2??什么是對象?什么是類?對象與類之間的關系是什么?

對象是描述其屬性的數(shù)據(jù)以及對這些數(shù)據(jù)施加的一組操作封裝在一起構成的統(tǒng)一體。

類就是具有相同的數(shù)據(jù)和相同的操作的一組對象的集合,也就是說,類是對具有相

同數(shù)據(jù)結構和相同操作的一類對象的描述。

類和對象之間的關系是抽象和具體的關系。類是多個對象進行綜合抽象的結果,一

個對象是類的一個實例。

1.3??現(xiàn)實世界中的對象有哪些特征?請舉例說明。

現(xiàn)實世界中的對象具有以下特征:

1)????????每一個對象必須有一個名字以區(qū)別于其他對象;

2)????????用屬性來描述對象的某些特征;

3)????????有一組操作,每組操作決定對象的一種行為;

4)????????對象的行為可以分為兩類:一類是作用于自身的行為,另一類是作用于

其他對象的行為。

例如一個教師是一個對象。每個教師對象有自己的名字來和別的教師區(qū)別。教師具

有編號,姓名,年齡,職稱,專業(yè)等屬性。教師擁有走路,吃飯,授課等行為操作。

走路,吃飯是作用于自身的行為,授課是作用于其他對象的行為。

1.4??什么是消息?消息具有什么性質?

一個對象向另一個對象發(fā)出的請求成為“消息、”o

消息具有以下3個性質:

1)????????同一個對象可以接收不同形式的多個消息,做出不同的相應;

2)????????相同形式的消息可以傳遞給不同的對象,所做出的響應可以是不同的;

3)????????對消息的響應并不是必須的,對象可以響應消息,也可以不響應。

1.5??什么是抽象和封裝?請舉例說明。

抽象是將有關事物的共性歸納、集中的過程。

例如:把所有具有大學生學籍的人歸為一類,成為“大學生”,這就是一個抽象。

封裝是指把數(shù)據(jù)和實現(xiàn)操作的代碼集中起來放在對象內部,并盡可能隱藏對象的內

部細節(jié)。

例如:每一臺洗衣機都有出廠日期、機器編號等屬性,也有啟動、暫停、選擇等操

作。人們在使用洗衣機的時候只需要按下對應的按鈕,而不用關心具體的內部實現(xiàn)。

這就是封裝。

1.6??什么是繼承?請舉例說明。

繼承就是允許派生類使用基類的數(shù)據(jù)和操作,同時,派生類還可以增加新的操作和

數(shù)據(jù)。

例如:哺乳動物是一種熱血、有毛發(fā)、用奶哺育幼崽的動物;狗是有犬牙、食肉、

特定的骨骼結構、群居的哺乳動物。狗就繼承了哺乳動物。

1.7??若類之間具有繼承關系,則他們之間具有什么特征?

若類之間具有繼承關系,則他們之間具有下列幾個特征:

1)????????類間具有共享特征(包括數(shù)據(jù)和操作代碼的共享);

2)????????類間具有差別或新增部分(包括非共享的數(shù)據(jù)和操作代碼);

3)????????類具有層次結構。

1.8??什么是單繼承、多繼承?請舉例說明。

單繼承是指每個派生類只直接繼承了一個基類的特征。例如狗繼承自哺乳動物。

多繼承是指多個基類派生出一個派生類的繼承關系。比如玩具車同時繼承自玩具和

車。

1.9??什么是多態(tài)?請舉例說明。

多態(tài)是指不同的對象收到相同的消息時執(zhí)行不同的操作。

例如,有一個窗口類對象,還有一個棋子類對象。當我們發(fā)出“移動”消息時,兩

個對象的行為不同。

1.10??面向對象程序設計的主要優(yōu)點是什么?

1.可提高程序的重用性;

2.可控制程序的復雜性;

3.可改善程序的可維護性;

4.能夠更好地支持大型程序設計;

5.增強了計算機處理信息的范圍;

能夠很好地適應新的硬件環(huán)境。

2.1簡述C++的主要特點。

1)????????C++是C的超集,保持與C的兼容。

2)????????保持了C的簡潔、高效和接近匯編語言等特點,并對C的功能作了不少

擴充。用C++編寫的程序比C更安全,可讀性更好,代碼結構更為合理。

3)????????程序質量高。

4)????????增加了面向對象機制。

2.2

ttinclude<iostream>

usingnamespacestd;

intmain()

(

inta,b,d,min;

cout<<"Entertwonumbers:";

cin>>a?b;

min=a>b?b:a;

for(d=2;d<min;d++)

(

if(((a%d)==0)&&((b%d)==0))break;

if(d==min)

cout<<"Nocommondenominators7'<<endl;

return0;

)

cout<<"Thelowestcommondenominatoris"<<d<<endl;

return0;

)

2.3有效

2.4沒有函數(shù)聲明;

????????函數(shù)定義沒有寫返回值類型。

2.5(1)等價,函數(shù)聲明可以省略參數(shù)的名字。

????????(2)不等價,第二個的函數(shù)定義不能省略參數(shù)的名字。

2.6-2.10CDAAB

2.11-2.15ACBDC

2.16-2.17DC

2.18

101

2.19

1010

2.20

10

20

2.21舉例說明可以使用const替代#define以消除#define的不安全性。

#include<iostream>

usingnamespacestd;

intmain()

{

inta=1;

#defineT1a+a

#defineT2Tl-Tl

cout?"T2is"?T2?endl;

return0;

上面這個程序,初看應該輸出T2is0

但是實際上,得出T2is2

如果把#define換成const,則可以輸出想要的結果。

2.22用動態(tài)分配空間的方法,計算Fibonacci數(shù)列的前20項,并存儲到動態(tài)分配

的空間中。

ttinclude<iostream>

usingnamespacestd;

intmain()

(

int*pi=newint[20];

*pi=1;

pi[l]=1;

for(inti=2;i<20;i++)

pi[i]=pi[i-2]+pi[i-1];

return0;

2.23重載sroot函數(shù),輸出一個數(shù)的二次方根。

ttinclude<iostream>

usingnamespacestd;

doublesroot(intnum)

(

return(double)sqrt((double)num);

)

doublesroot(longnum)

(

return(double)sqrt((double)num);

)

doublesroot(doublenum)

return(double)sqrt(num);

intmain()

return0;

)

2.24解決百錢問題。將一元人民幣換成1、2、5分的硬幣,有多少種換法?

#include<iostream>

usingnamespacestd;

intmain()

{

intnum=0;〃總共換法的總數(shù)。初始化為0。

for(inti=0;i<=100;i++)

{

for(intj=0;j<=50;j++)

if((i+2*j)>100)

break;

for(intk=0;k<=20;k++)

if((i+2*j+5*k)==100)

num++;

cout?"1分""i<〈"個;"〈<〃2分〃?j"個;"

"5分"<<k<<"個;"<Xendl;

if((i+2*j+5*k)>100)

break;

cout<<num<<endl;

return0;

)

2.25輸入兩個整數(shù),按由小到大的順序輸出。要求使用變量的引用。

#include<iostream>

usingnamespacestd;

voidswap(int&a,int&b)

{

a=a+b;

b=a-b;

a=a-b;

intmain()

inta,b;

cin>>a?b;

if(a>b)

{

swap(a,b);

)

cout<<a<<"<<b<<endl;

return0;

)

2.26用二分法求解f(x)=0的根。

#include<iostream>

usingnamespacestd;

doubleFun(doublex)

return35*x+25;〃假設f(x)=35x+25

intmain()

doublea,b;

cin?a;

if(Fun(a)==0)

(

cout<<"x="<Xa<<endl;

return0;

)

do

{

cin>>b;

)

whi1e((Fun(a)*Fun(b))>=0);

if(Fun(b)==0)

cout<<"x="<〈b<<endl;

return0;

)

if(a>b)

{

a=a+b;

b=a-b;

a=a-b;

)

while(l)

{

if(Fun((a+b)/2)==0)

(

cout?"x="<<(a+b)/2<<endl;

return0;

if(Fun(a)*Fun((a+b)/2)<0)

b=(a+b)/2;

)

if(Fun(b)*Fun((a+b)/2)<0)

(

a=(a+b)/2;

)

)

return0;

)

3.1類聲明的一般格式是什么?

class類名

{

[private:]

私有數(shù)據(jù)成員和成員函數(shù)

public:

公有數(shù)據(jù)成員和成員函數(shù)

}

3.2構造函數(shù)和析構函數(shù)的主要作用是什么?它們各自有什么特性?

????????構造函數(shù)是一種特殊的成員函數(shù),它主要用于為對象分配空間,進行初始

化。

構造函數(shù)的名字必須與類名相同,而不能由用戶任意命名。它可以有任意類型的參

數(shù),但不能具有返回值類型。

析構函數(shù)通常用于執(zhí)行一些清理任務,如釋放分配給對象的內存空間等。

析構函數(shù)名與類名相同,但它前面必須加一個波浪號。不能有返回值,也不能有參

數(shù)。

3.3什么是對象數(shù)組?

????????所謂對象數(shù)組,是指每一個數(shù)組元素都是對象的數(shù)組。

3.4什么是this指針?它的主要作用是什么?

????????C++為成員函數(shù)提供了一個名為this的指針,這個指針稱為自引用指針。

每當創(chuàng)建一個對象時,系統(tǒng)就把this指針初始化為指向該對象。

????????一個類的所有對象合用一份成員函數(shù),this指針可以幫助對象辨別出當

前調用的是自己的那個對象的數(shù)據(jù)成員和函數(shù)。

3.5友元函數(shù)有什么作用?

????????友元函數(shù)可以在類的外部訪問類的私有成員或保護成員。

3.6

(1)聲明并定義了P2,P3,并用默認無參構造函數(shù)初始化。

(2)聲明并定義了P2,并調用Point類的拷貝構造函數(shù)用P1對P2進行初始化。

(3)聲明并定義了P2,并調用Point類的拷貝構造函數(shù)用P1對P2進行初始化。

(4)調用拷貝構造函數(shù),將P1的成員值賦值給P4的成員。

3.7-3.10BCCB

3.11-3.15BAABA

3.16-3.17BB

3.18

10,20

30,48

50,68

70,80

90,16

11,120

3.19

????????Constructing

????????10

????????100

????????Destructing

3.20

????????3objectsinexistence

????????4objectsinexistenceafterallocation

????????3objectsinexistenceafterdeletion

3.21

????????CountingatO

????????Countingat9

3.22

????????Defaultconstructorcalled.

????????Defaultconstructorcalled.

????????Defaultconstructorcalled.

????????Construcotor:a=l,b=2

????????Construcotor:a=3,b=4

????????Construcotor:a=5,b=6

3.23

99999999Con

????????Copycon.

????????default.

????????Copycon.

3.24

99999999A=5

99999999B=14

99999999A=9

Q9999999B=14

3.25

9999999957

????????22.25

3.26

????????Constructing

????????Constructing

99999999A=5

99999999B=15

99999999A=10

99999999B=15

????????Destructing

????????Destructing

3.27

????????voidpintStu();函數(shù)只有聲明,沒有定義。

????????age是私有成員,不能用對象直接調用。

3.28

99999999voidprintStuO和voidsetSno(ints)沒有加限定符Student::

99999999voidsetAge(inta)在類中沒有聲明

3.29

99999999構造函數(shù)不能定義為私有。否則無法創(chuàng)建對象。

3.30下面是一個計算器類的定義,請完成該類成員函數(shù)的實現(xiàn)。

classcounter

public:

counter(intnumber);

voidincrement();〃給原始值加1

voiddecrement();〃給原始值減1

intgetvalue();〃取的計數(shù)器值

intprint();〃顯示計數(shù)

private:

intvalue;

};

counter::counter(intnumber)

value=number;

voidcounter::increment()

++value;

voidcounter::decrement()

——value;

intcounter::getvalue()

returnvalue;

intcounter::print()

cout?value<<endl;

returnvalue;

3.31根據(jù)注釋語句提示,實現(xiàn)類Date的成員函數(shù)

^include<iostream>

usingnamespacestd;

classDate

public:

voidprintDate();

voidsetDay(intd);

voidsetMonth(intm);

voidsetYear(inty);

private:

intday,month,year;

);

voidDate::printDate()

(

cout"今天是"<<year<<"年"<<month<<"月"<<day<<"日”<〈endl;

)

voidDate::setDay(intd)

(

day=d;

)

voidDate::setMonth(intm)

(

month=m;

)

voidDate::setYear(inty)

year=y;

intmain()

(

DatetestDay;

testDay.setDay(5);

testDay.setMonth(lO);

testDay.setYear(2003);

testDay.printDate();

return0;

)

3.32建立類cylinder,cylinder的構造函數(shù)被傳遞了兩個double值,分別表示圓

柱體的半徑和高度。用類cylinder計算圓柱體的體積,并存儲在一個double變量

中。在類cylinder中包含一個成員函數(shù)vol,用來顯示每個cylinder對象的體積。

constintPI=3.14;

classcylinder

private:

doubleradius,height,volume;

public:

cylinder(intrad,inthei);

doublegetVolume();

voidvol();

cylinder::cylinder(intrad,inthei)

radius=rad;

height=hei;

doublecylinder::getVolume()

volume=PI*radius*radius"height;

returnvolume;

voidcylinder::vol()

(

cout<<“圓柱體的體積是:“<<volume?endl;

)

3.33構建一個類book,其中包含有兩個私有數(shù)據(jù)成員qu和price,將qu初始化為

r5,將price初始化為qu的10倍,建立一個有5個元素的數(shù)組對象。顯示每個對

象數(shù)組元素的qu*price值。

classbook

(

private:

intqu,price;

public:

book(intqu);

intmult();

};

book::book(intq)

if(q<1IIq>5)

qu=1;

else

qu=q;

price=10*qu;

intbook::mult()

returnqu*price;

intmain()

bookbooks[5]={1,2,3,4,5};

for(inti=0;i<5;i++)

(

cout<<books[i].mult()?”

)

)

3.34修改3.33,通過對象指針訪問對象數(shù)組,使程序以相反的順序顯示每個對象

數(shù)組元素的qu*price值。

classbook

(

private:

intqu,price;

public:

book(intqu);

intmult();

};

book::book(intq)

{

if(q<1IIq>5)

{

qu=1;

)

else

{

qu=q;

}

price=10*qu;

)

intbook::mult()

returnqu*price;

intmain()

{

bookbooks[5]={1,2,3,4,5};

book*p=books;

P+=4;

for(inti=0;i<5;i++)

{

cout?p->mult()?“”

—p;

return0;

3.35構建一個類Stock,含字符數(shù)組stockcode口及整型數(shù)組成員quan、雙精度型

數(shù)據(jù)成員price。構造函數(shù)含3個參數(shù):字符數(shù)組na口及q、p。當定義Stock的類

對象時,將對象的第一個字符串參數(shù)賦給數(shù)據(jù)成員stockcode,第2和第3個參數(shù)

分別賦給quan、price。未設置第2和第3個參數(shù)時,quan的值為1000,price的

值為8.98.成員函數(shù)print沒有形參,需使用this指針,顯示對象數(shù)據(jù)成員的內容。

編寫程序顯示對象數(shù)據(jù)成員的值。

ttinclude<iostream>

usingnamespacestd;

classStock

(

private:

charstockcode[25];

intquan;

doubleprice;

public:

Stock(charna口,intq=1000,doublep=8.98);

Stock(charna口);

voidprint();

);

Stock::Stock(charna[],intq=1000,doublep=8.98)

(

strcpy(stockcode,na);

quan=q;

price=p:

)

voidStock::print()

{

cout<<"stockcode:“?this->stockcode<<"quan:"<<this->quan<<

“price:"?this->price?endl;

)

intmain()

Stockstockl(“600001〃,3000,5.67);

Stockstock2(“600002");

stockl.print();

stock2.print();

return0;

)

3.36編寫一個程序,已有若干學生的數(shù)據(jù),包括學號、姓名、成績,要求輸出這些

學生的數(shù)據(jù)并計算出學生人數(shù)和平均成績(要求將學生人數(shù)和總成績用靜態(tài)數(shù)據(jù)成

員表示)。

ttinclude<iostream>

usingnamespacestd;

classstudent

{

private:

charname[25],studentNo[10];

intscore;

staticintsum;

staticinttotalScore;

public:

student(charna[],charstuNo[],intsc);

voidshow();

staticvoidshowTotal();

student::student(charna[],charstuNo口,intsc)

strcpy(name,na);

strcpy(studentNo,stuNo);

score二sc;

++sum;

totalScore+二sc;

}

voidstudent::show()

cout<<"姓名:"?name<<endl;

cout<<“學號:"<<studentNo<<endl;

cout<<"成績:"<<score?endl;

)

voidstudent::showTotal()

(

cout<<"總人數(shù):"?sum<<endl;

cout<<”平均成績:"?(double)totalScore/sum<<endl;

)

intstudent::sum=0;

intstudent::totalScore=0;

intmain()

(

studentsi("張無忌","111254",75);

students2(“李莫愁","254114",60);

students3("小龍女","112587",88);

si.show();

s2.show();

s3.show();

student::showTotal();

return0;

4.1有哪幾種繼承方式?每種方式的派生類對基類成員的繼承性如何?

????????公有繼承,私有繼承和保護繼承。

????????基類的私有成員,無論哪種繼承方式都不能訪問。

????????公有繼承不改變基類的公有和保護成員的訪問限制。

????????私有繼承將基類的公有和保護成員都變成私有。

????????保護繼承將基類的公有和保護成員都變成保護。

4.2派生類能否直接訪問基類的私有成員?若否,應如何實現(xiàn)?

????????不能??梢栽诨惱锾砑右粋€公有成員函數(shù)來訪問私有成員,派生類就能

繼承這個公有成員函數(shù),實現(xiàn)對基類私有成員的訪問。

4.3保護成員有哪些特性?保護成員以公有方式或私有方式繼承后的訪問特性如

何?

????????保護成員只能被本類或本類的派生類所訪問,在類或派生類外是不能被訪

問的。

????????后面一問見第一題的答案。

4.4派生類構造函數(shù)和析構函數(shù)的執(zhí)行順序是怎樣的?

????????構造函數(shù)是先執(zhí)行父類的構造函數(shù),再執(zhí)行類中其他類對象的構造函數(shù),

再執(zhí)行本類的構造函數(shù)。如果同級有多個構造函數(shù),則按聲明順序執(zhí)行。

????????析構函數(shù)與構造函數(shù)的執(zhí)行順序剛好相反。

4.5派生類構造函數(shù)和析構函數(shù)的構造規(guī)則是怎樣的?

????????派生類名(參數(shù)總表):基類名(參數(shù)總表)

Q9999999{

??????????????????派生類新增數(shù)據(jù)成員的初始化語句

}

派生類中的析構函數(shù)與基類無關。

4.6什么是多繼承?多繼承時,構造函數(shù)與析構函數(shù)的執(zhí)行順序是怎樣的?

????????多繼承是指一個類同時繼承自多個不同的基類。

????????執(zhí)行順序同4.4

4.7在類的派生中為何要引入虛基類?虛基類構造函數(shù)的調用順序是如何規(guī)定的?

????????如果一個類有多個直接基類,而這些直接基類又有一個共同的基類,則在

最底層的派生類中會保留這個簡介的共同基類數(shù)據(jù)成員的多份同名成員。在訪問這

些同名成員的時候,會產生二義性。為了解決二義性,引入了虛基類。

1)????????如果虛基類中定義有帶形參的構造函數(shù),并且沒有定義默認形式的構造

函數(shù),則整個繼承結構中,所有直接或間接的派生類都必須在構造函數(shù)的成員初始

化表中列出對虛基類構造函數(shù)的調用,以初始化在虛基類中定義的數(shù)據(jù)成員。

2)????????建立一個對象時,如果這個對象中含有從虛基類繼承來的成員,則虛基

類的成員是由最遠派生類的構造函數(shù)通過調用虛基類的構造函數(shù)進行初始化的。該

派生類的其他基類對虛基類構造函數(shù)的調用都自動被忽略。

3)????????若同一層次中同時包含虛基類和非虛基類,應先調用虛基類的構造函數(shù),

再調用非虛基類的構造函數(shù),最后調用派生類的構造函數(shù)。

4.8-4.11ACCB

4.12

????????ConstructorBl.

????????ConstructorB2.

????????ConstructorA.

????????3

????????2

????????1

4.13

????????主食二bread

????????副食=steak

4.14

????????0,0,0

????????0,1,0

????????3,6,9

4.15

????????ConstructorBl.

????????ConstructorB2.

????????ConstructorB3.

????????ConstructorA.

????????1

999999992

9999999943

4.16

999999994

4.17

(1,2)

5,6

(6,9)

4.18

????????classbasel

????????classbase2

????????classlevel2

????????classbase2

????????classlevell

????????classtoplevel

4.19

#include<iostream>

usingnamespacestd;

ttinclude<iomanip>

classtable

{

public:

table(intp,intq)

(

i=p;

j=q;

)

voidascii(void);

protected:

inti,j;

);

voidtable::ascii()

intk=1;

for(;i<=j;i++)

{

cout?setw(4)?i<<""<<(char)i;

if((k)%12==0)

(

cout<<'\n";

)

k++;

)

cout<<"\n";

)

classdertab1e:publietable

public:

der_table(intp,intq,char*m):table(p,q)

voidprint();

protected:

char*c;

voiddertable::print()

cout<<c

table::ascii();

intmain()

der_tableobCa,'z',''ASCIIvalue---char");

ob.print();

return0;

}

4.20

#include<iostream>

usingnamespacestd;

#include<iomanip>

classarea_cl

{

protected:

doubleheight;

doublewidth;

public:

area_cl(doubler,doubles)

height=r;

width=s;

virtualdoublearea()=0;

);

classrectangle:publicarea_c1

(

public:

rectangle(doubler,doubles):area_cl(r,s){}

virtualdoublearea();

};

doublerectangle::area()

(

returnheight*width;

classisosceles:publicarea_c1

public:

isosceles(doubler,doubles):area_cl(r,s){}

virtualdoublearea();

);

doubleisosceles::area()

(

return(height*width)/2;

)

intmain()

{

rectangler(10,5);

isoscelesi(4,6);

area_c1*a;

a=&r;

cout<<"矩形的面積是:"<<a->area()<<endl;

a&i;

cout<<”三角形的面積是:“<<a->area()<<endl;

return0;

}

4.21

#include<iostream>

usingnamespacestd;

#include<iomanip>

classTime

{

public:

Time(inth,intm,ints)

(

hours=h;

minutes=m;

seconds=s;

voiddisplay()

cout<<“出生時間:“〈<hours?"時"<<minutes?"分"?seconds

"秒"?endl;

)

protected:

inthours,minutes,seconds;

);

classDate

(

public:

Date(intm,intd,inty)

{

month=m;

day=d;

year=y;

voiddisplay()

cout<<“出生年月:"?year<<"年"?month<X"月"?day?

日“?endl;

)

protected:

intmonth,day,year;

};

classBirthtime:publicTime,publicDate

{

public:

Birthtime(charname[],intm,intd,inty,inth,intmi,ints):Time(h,

mi,s),Date(m,d,y)

strcpy(Childname,name);

voidshowName()

cout<<“我的名字是:"<<Childname<<endl;

)

private:

charChildname[25];

);

intmain()

{

Birthtimeb("xiaoming”,3,6,2012,11,12,42);

b.showName();

b.Time::display();

b.Date::display();

return0;

4.22

^include<iostream>

usingnamespacestd;

#include<iomanip>

classperson

protected:

charnumber[25];

charname[25];

public:

person(charnum[],charna[])

strcpy(number,num);

strcpy(name,na);

}

voidshowName()

cout〈<“編號:"<〈number<<姓名:"<<name;

)

);

classstudent:publicperson

(

private:

intclassNumber,score;

public:

student(charnum口,charna[],inteNumber,intsc):person(num,na)

{

classNumber=eNumber;

score=sc;

voidshow()

showName();

cout?"班號:"?classNumber<<"成績:"<<score<<endl;

)

);

classteacher:publicperson

(

private:

chartitle[25],department[25];

public:

teacher(charnum口,charna口,chartit口,chardepart[]):person(num,

na)

(

strcpy(title,tit):

strcpy(department,depart);

voidshow()

showName();

cout?"職稱:"?title<<"部門:"<<department<<endl;

)

)

C++第五章習題

1.什么是靜態(tài)聯(lián)編?什么是動態(tài)聯(lián)編?

????????靜態(tài)聯(lián)編是指系統(tǒng)在編譯時就決定如何實現(xiàn)某一動作。

????????動態(tài)聯(lián)編是指系統(tǒng)在運行時動態(tài)實現(xiàn)某一動作。

1.編譯時的多態(tài)性與運行時的多態(tài)性有什么區(qū)別?他們的實現(xiàn)方式有什么不

同?

靜態(tài)聯(lián)編支持的多態(tài)性稱為編譯時多態(tài)性,也稱靜態(tài)多態(tài)性。編譯時多態(tài)性是通過

函數(shù)重載和模板實現(xiàn)的。

動態(tài)聯(lián)編所支持的多態(tài)性稱為運行時多態(tài)性,也稱動態(tài)多態(tài)性。是通過虛函數(shù)來實

現(xiàn)的。

1.簡述運算符重載規(guī)則。

a)????????C++中絕大部分的運算符允許重載。

b)????????C++只能對已有的C++運算符進行重載。

c)????????運算符重載是針對新類型數(shù)據(jù)的實際需要,對原有運算符進行適當?shù)母?/p>

造完成。應與原有的功能相類似。

d)????????重載不能改變運算符的操作對象的個數(shù)。

e)????????重載不能改變運算符原有的優(yōu)先級。

f)?????????不能改變原有的結合特性。

g)????????參數(shù)至少應有一個是類對象。

h)????????重載函數(shù)可以是普通函數(shù),也可以是類的成員函數(shù),也可以是類的友元

函數(shù)。

i)??????????一般用于類對象的運算符除了賦值運算符都要重載。

1.友元運算符函數(shù)和成員運算符函數(shù)有什么不同?

a)????????對于雙目運算符,成員運算符重載含有一個參數(shù),友元重載含有兩個參

數(shù);對于單目運算符,成員重載沒有參數(shù),友元重載有一個參數(shù)。

b)????????雙目運算符一般可以被重載為友元或成員。但是如果將一個對象和一個

普通類型運算,必須重載為友元。

c)????????調用方式不同。

d)????????一般,雙目運算符用友元,單目運算符用成員。如果操作數(shù)有隱式類型

轉換,則必須用友元。

1.什么是虛函數(shù)?虛函數(shù)與函數(shù)重載有哪些相同點與不同點?

虛函數(shù)就是在基類中被關鍵字virtual說明,并在派生類中重新定義的函數(shù)。

函數(shù)名都相同。

重載函數(shù)的參數(shù)個數(shù)或參數(shù)類型必須有所不同。虛函數(shù)要求函數(shù)名,返回類型,參

數(shù)個數(shù),參數(shù)的類型和順序與基類中的虛函數(shù)原型完全相同。

1.什么是純虛函數(shù)?什么是抽象類?

純虛函數(shù)是一個在基類中說明的虛函數(shù),它在該基類中沒有定義,但要求在它的派

生類中根據(jù)需要對它進行定義,或仍說明為純虛函數(shù)。

如果一個類至少有一個純虛函數(shù),那么就稱這個類為抽象類。

7-12DAADCC

13.

????????不對,參數(shù)個數(shù)必須一樣。

14.

7

6

15.

Thisisc++book.

第一個字符:T

第16個字符:.

第26個字符:數(shù)組下標超界!

16.

m=l.5千米

17.

ttinclude<iostream>

usingnamespacestd;

classtwoDArray

(

inta[2][3];

public:

twoDArray()

for(inti=0;i<2;i++)

for(intj=0;j<3;j++)

a[i][j]=5;

)

twoDArray(intb[][3])

(

for(inti=0;i<2;i++)

for(intj=0;j<3;j++)

=b[i][j];

)

voidshow();

twoDArrayoperator+(twoDArrayn);

twoDArrayoperator-(twoDArrayn);

voidtwoDArray::show()

for(inti=0;i<2;i++)

for(intj=0;j<3;j++)

cout<<a[i][j];

cout?endl;

)

)

twoDArraytwoDArray::operator+(twoDArrayn)

{

twoDArraytemp;

for(inti=0;i<2;i++)

for(intj=0;j<3;j++)

temp.a[i][j]=a[i][j]+n.a[i][j];

returntemp;

twoDArraytwoDArray::operator-(twoDArrayn)

twoDArraytemp;

for(inti=0;i<2;i++)

for(intj=0;j<3;j++)

temp.a[i][j]=a[i][j]-n.a[i][j];

returntemp;

)

intmain()

{

inta[2][3];

for(inti=0;i<2;i++)

for(intj=0;j<3;j++)

cin?a[i][j];

twoDArrayal,a2(a),total,sub;

total=al+a2;

sub=al-a2;

total,show();

sub.sho\v();

return0;

)

18.

ttinclude<iostream>

usingnamespacestd;

classtwoDArray

{

inta[2][3];

public:

twoDArray()

{

for(inti=0;i<2;i++)

for(intj=0;j<3;j++)

a[i][j]=5;

twoDArray(intb[][3])

for(inti=0;i<2;i++)

for(intj=0;j<3;j++)

a[i][j]=

}

voidshow();

friendtwoDArrayoperator+(twoDArraytwoDArrayn);

friendtwoDArrayoperator-(twoDArraytwoDArrayn);

);

voidtwoDArray::show()

(

for(inti=0;i<2;i++)

for(intj=0;j<3;j++)

cout<<a[i][j];

cout?endl;

)

)

twoDArrayoperator+(twoDArrayin,twoDArrayn)

(

twoDArraytemp;

for(inti=0;i<2;i++)

for(intj=0;j<3;j++)

temp.a[i][j]=m.a[i][j]+n.a[i][j];

returntemp;

)

twoDArrayoperator-(twoDArraym,twoDArrayn)

{

twoDArraytemp;

for(inti=0;i<2;i++)

for(intj=0;j<3;j++)

temp.a[i][j]=m.a[i][j]-n.a[i][j];

returntemp;

)

intmain()

(

inta[2][3];

for(inti=0;i<2;i++)

for(intj=0;j<3;j++)

cin?a[i][j];

twoDArrayal,a2(a),total,sub;

total=al+a2;

sub=al-a2;

total,show();

sub.show();

return0;

19.

ttinclude<iostream>

usingnamespacestd;

classcomplex

doublereal,imag;

public:

complex(doublere,doubleim)

real=re;

imag=im;

friendcomplexoperator+(complexa,complexb);

voidprint();

};

complexoperator+(complexa,complexb)

returncomplex(a.real+b.real,a.imag+b.imag);

)

voidcomplex::print()

(

cout<<"("<〈real?":'<<imag<<")"<<endl;

)

intmain()

{

complexcl(2.5,3.7);

complexc2(4.2,6.5);

complextotal=cl+c2;

total,print();

return0;

20.

^include<iostream>

usingnamespacestd;

constdoublePI=3.14;

classContainer

(

protected:

doubler,d;//如果是球形,r是半徑,d為0.如果是圓柱體,r為底面半

徑,d為高。如果是正方體,r為邊長,d為0。

public:

Container(doublea,doubleb=0)

(

r=a;

d=b;

virtualdoubleserface()=0;//計算表面積

virtualdoublevolume()=0;〃計算體積

);

classSphere:publicContainer

(

public:

Sphere(doubler):Container(r){)

doubleserface();

doublevolume();

);

doubleSphere::serface()

(

return4*PI*r*r;

)

doubleSphere::volume()

returnPI*r*r*r;

classCylinder:publicContainer

public:

Cylinder(doublea,doubleb):Container(a,b){)

doubleserface();

doublevolume();

doubleCylinder::serface()

return2*PI*r*d+PI*r*r;

doubleCylinder::volume()

returnPI*r*r*d;

classCube:publicContainer

public:

Cube(doublea):Container(a){}

doubleserface();

doublevolume();

)

doubleCube::serface()

{

return6*r*r;

)

doubleCube::volume()

(

returnr*r*r;

7.1C++為什么要有自己的輸入輸出系統(tǒng)?

????????C++的編譯系統(tǒng)對數(shù)據(jù)類型進行嚴格的檢查,凡是類型不正確的數(shù)據(jù)都不

可能通過編譯。

????????C++中需要定義眾多的用戶自定義類型且能夠輸入輸出。

7.2C++有哪4個預定義的流對象?他們分別與什么具體設備相關聯(lián)?

????????標準輸入流對象cin、標準輸出流對象cout、非緩沖型的標準出錯流對象

cerr和緩沖型的標準出錯流對象clog。

????????cin對應標準輸入設備

????????cout對應標準輸出設備

????????cerr對應標準錯誤輸出設備

????????clog對應標準錯誤輸出設備

7.3.cerr和clog間的區(qū)別是?

????????cerr不經(jīng)過緩沖區(qū)直接顯示錯誤信息。而clog存放在緩沖區(qū),緩沖區(qū)滿

或遇上endl時再輸出。

7.4C++提供哪兩種控制輸入輸出格式的方法?

????????一種是使用ios類中的有關格式控制的流成員函數(shù)進行格式控制,另一種

是使用稱為操縱符的特殊類型的函數(shù)控制。

7.5C++進行文件輸入輸出的基本過程是什么?

????????首先創(chuàng)建一個流對象,然后將這個流對象與文件相關聯(lián),即打開文件,此

時才能進行讀寫操作,讀寫操作完成后再關閉這個文件。

7.6-7.8BCA

7.9

#include<iostream>

ttinclude<iomanip>

usingnamespacestd;

intfactorial(intn)

(

if(n==0||n==1)

returnn;

returnfactorial(n-l)*n;

}

intmain()

for(inti=1;i<=9;i++)

cout<<setw(5)<<factorial(i);

if(i%3==0)

(

cout?endl;

i

}

return0;

)

7.10

#include<iostream>

#include<iomanip>

usingnamespacestd;

intmain()

for(inti=1;i<=7;i++)

cout<<setw(16-i);

for(intj=1;j<=(2*i-1);j++)

(

cout<<'A';

i

cout<<endl;

)

return0;

}

7.11

#include<iostream>

ttinclude<iomanip>

usingnamespacestd;

classmatrix

private:

intdata[2][3];

public:

matrix(){)

friendostream&operator?(ostream&,matrix&);

friendistream&operator?(istream&,matrix&);

friendmatrixoperator+(matrix&,matrix&);

);

ostream&operator<<(ostream&os,matrix&a)

{

for(inti=0;i<2;i++)

(

for(intj=0;j<3;j++)

os<<a.data[i][j]<<

os?endl;

returnos;

)

istream&operator?(istream&in,matrix&a)

(

cout?”請輸入一個2行3列矩陣:〃?endl;

for(inti=0;i<2;i++)

{

for(intj=0;j<3;j++)

(

in?a.data[i][j];

}

)

returnin;

matrixoperator+(matrix&a,matrix&b)

matrixtemp;

for(inti=0;i<2;i++)

{

for(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

提交評論