C-面向?qū)ο蟪绦蛟O(shè)計(jì)教程-第-版-陳維興-林小茶課后習(xí)題答案及解析_第1頁
C-面向?qū)ο蟪绦蛟O(shè)計(jì)教程-第-版-陳維興-林小茶課后習(xí)題答案及解析_第2頁
C-面向?qū)ο蟪绦蛟O(shè)計(jì)教程-第-版-陳維興-林小茶課后習(xí)題答案及解析_第3頁
C-面向?qū)ο蟪绦蛟O(shè)計(jì)教程-第-版-陳維興-林小茶課后習(xí)題答案及解析_第4頁
C-面向?qū)ο蟪绦蛟O(shè)計(jì)教程-第-版-陳維興-林小茶課后習(xí)題答案及解析_第5頁
已閱讀5頁,還剩83頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

C++面向?qū)ο蟪绦蛟O(shè)計(jì)教程課后題答案

1.1??什么是面向?qū)ο蟪绦蛟O(shè)計(jì)?

面向?qū)ο蟪绦蛟O(shè)計(jì)是一種新的程序設(shè)計(jì)范型.這種范型的主要特征是:

程序=對象+消息

面向?qū)ο蟪绦虻幕驹厥菍ο蟆?/p>

主要結(jié)構(gòu)特點(diǎn)是:

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

第二,??程序中的一切操作都是通過向?qū)ο蟀l(fā)送消息來實(shí)現(xiàn)的。

1.2??什么是對象?什么是類?對象與類之間的關(guān)系是什么?

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

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

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

類和對象之間的關(guān)系是抽象和具體的關(guān)系。類是多個對象進(jìn)行綜合抽象的結(jié)果,一

個對象是類的一個實(shí)例。

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

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

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

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

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

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

其他對象的行為。

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

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

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

1.4??什么是消息?消息具有什么性質(zhì)?

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

消息具有以下3個性質(zhì):

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

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

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

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

抽象是將有關(guān)事物的共性歸納、集中的過程。

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

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

部細(xì)節(jié)。

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

作。人們在使用洗衣機(jī)的時候只需要按下對應(yīng)的按鈕,而不用關(guān)心具體的內(nèi)部實(shí)現(xiàn)。

這就是封裝。

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

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

數(shù)據(jù)。

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

特定的骨骼結(jié)構(gòu)、群居的哺乳動物。狗就繼承了哺乳動物。

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

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

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

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

3)????????類具有層次結(jié)構(gòu)。

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

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

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

車。

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

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

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

個對象的行為不同。

1.10??面向?qū)ο蟪绦蛟O(shè)計(jì)的主要優(yōu)點(diǎn)是什么?

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

2.可控制程序的復(fù)雜性;

3.可改善程序的可維護(hù)性;

4.能夠更好地支持大型程序設(shè)計(jì);

5.增強(qiáng)了計(jì)算機(jī)處理信息的范圍;

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

2.1簡述C++的主要特點(diǎn)。

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

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

擴(kuò)充。用C++編寫的程序比C更安全,可讀性更好,代碼結(jié)構(gòu)更為合理。

3)????????程序質(zhì)量高。

4)????????增加了面向?qū)ο髾C(jī)制。

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;

上面這個程序,初看應(yīng)該輸出T2is0

但是實(shí)際上,得出T2is2

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

2.22用動態(tài)分配空間的方法,計(jì)算Fibonacci數(shù)列的前20項(xiàng),并存儲到動態(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;〃假設(shè)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構(gòu)造函數(shù)和析構(gòu)函數(shù)的主要作用是什么?它們各自有什么特性?

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

化。

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

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

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

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

數(shù)。

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

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

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

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

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

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

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

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

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

3.6

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

(2)聲明并定義了P2,并調(diào)用Point類的拷貝構(gòu)造函數(shù)用P1對P2進(jìn)行初始化。

(3)聲明并定義了P2,并調(diào)用Point類的拷貝構(gòu)造函數(shù)用P1對P2進(jìn)行初始化。

(4)調(diào)用拷貝構(gòu)造函數(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是私有成員,不能用對象直接調(diào)用。

3.28

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

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

3.29

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

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

classcounter

public:

counter(intnumber);

voidincrement();〃給原始值加1

voiddecrement();〃給原始值減1

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

intprint();〃顯示計(jì)數(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ù)注釋語句提示,實(shí)現(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的構(gòu)造函數(shù)被傳遞了兩個double值,分別表示圓

柱體的半徑和高度。用類cylinder計(jì)算圓柱體的體積,并存儲在一個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構(gòu)建一個類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構(gòu)建一個類Stock,含字符數(shù)組stockcode口及整型數(shù)組成員quan、雙精度型

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

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

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

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

編寫程序顯示對象數(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編寫一個程序,已有若干學(xué)生的數(shù)據(jù),包括學(xué)號、姓名、成績,要求輸出這些

學(xué)生的數(shù)據(jù)并計(jì)算出學(xué)生人數(shù)和平均成績(要求將學(xué)生人數(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<<“學(xué)號:"<<studentNo<<endl;

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

)

voidstudent::showTotal()

(

cout<<"總?cè)藬?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有哪幾種繼承方式?每種方式的派生類對基類成員的繼承性如何?

????????公有繼承,私有繼承和保護(hù)繼承。

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

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

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

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

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

????????不能。可以在基類里添加一個公有成員函數(shù)來訪問私有成員,派生類就能

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

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

何?

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

問的。

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

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

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

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

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

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

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

Q9999999{

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

}

派生類中的析構(gòu)函數(shù)與基類無關(guān)。

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

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

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

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

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

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

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

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

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

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

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

類的成員是由最遠(yuǎn)派生類的構(gòu)造函數(shù)通過調(diào)用虛基類的構(gòu)造函數(shù)進(jìn)行初始化的。該

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

3)????????若同一層次中同時包含虛基類和非虛基類,應(yīng)先調(diào)用虛基類的構(gòu)造函數(shù),

再調(diào)用非虛基類的構(gòu)造函數(shù),最后調(diào)用派生類的構(gòu)造函數(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++第五章習(xí)題

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

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

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

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

同?

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

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

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

現(xiàn)的。

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

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

b)????????C++只能對已有的C++運(yùn)算符進(jìn)行重載。

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

造完成。應(yīng)與原有的功能相類似。

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

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

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

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

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

函數(shù)。

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

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

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

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

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

普通類型運(yùn)算,必須重載為友元。

c)????????調(diào)用方式不同。

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

轉(zhuǎn)換,則必須用友元。

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

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

函數(shù)名都相同。

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

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

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

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

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

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

7-12DAADCC

13.

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

14.

7

6

15.

Thisisc++book.

第一個字符:T

第16個字符:.

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

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;//計(jì)算表面積

virtualdoublevolume()=0;〃計(jì)算體積

);

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ù)類型進(jìn)行嚴(yán)格的檢查,凡是類型不正確的數(shù)據(jù)都不

可能通過編譯。

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

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

????????標(biāo)準(zhǔn)輸入流對象cin、標(biāo)準(zhǔn)輸出流對象cout、非緩沖型的標(biāo)準(zhǔn)出錯流對象

cerr和緩沖型的標(biāo)準(zhǔn)出錯流對象clog。

????????cin對應(yīng)標(biāo)準(zhǔn)輸入設(shè)備

????????cout對應(yīng)標(biāo)準(zhǔn)輸出設(shè)備

????????cerr對應(yīng)標(biāo)準(zhǔn)錯誤輸出設(shè)備

????????clog對應(yīng)標(biāo)準(zhǔn)錯誤輸出設(shè)備

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

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

或遇上endl時再輸出。

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

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

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

7.5C++進(jìn)行文件輸入輸出的基本過程是什么?

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

時才能進(jìn)行讀寫操作,讀寫操作完成后再關(guā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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論