版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第6章:類和對象(一)
練習(xí)題6
6.1判斷題
X1.使用class定義的類,其默認的訪問權(quán)限是公有的,使用struct定義的類,其默認的
訪問權(quán)限是私有的。
,2.類中的成員函數(shù)都是公有的,數(shù)據(jù)成員都是私有的.
x3.定義在類體內(nèi)的成員函數(shù)是內(nèi)聯(lián)函數(shù),定義在類體外的成員函數(shù)不能是內(nèi)聯(lián)函數(shù)。
M4.類定義后,它的成員個數(shù)及名稱就不會再被改變了。
,5.定義或說明對象時,系統(tǒng)會自動調(diào)用構(gòu)造函數(shù)為創(chuàng)建的對象初始化。如果類中沒有
定義任何構(gòu)造函數(shù)時,就無法給定義的對象初始化。
,6.定義一個對象時,系統(tǒng)只為該對象的數(shù)據(jù)成員開辟內(nèi)存空間,而成員函數(shù)是同類對
象共享的。
,7.對象成員的表示方法與結(jié)構(gòu)變量成員的表示方法相同。
,8.創(chuàng)建對象時系統(tǒng)自動調(diào)用相應(yīng)的構(gòu)造函數(shù)為對象初始化,沒有相應(yīng)的構(gòu)造函數(shù)時,
系統(tǒng)會自動生成。
,9.構(gòu)造函數(shù)是一個其名與類名相同的特殊的成員函數(shù).
x10.析構(gòu)函數(shù)是一個函數(shù)體為空的成員函數(shù)。
,11.構(gòu)造函數(shù)和析構(gòu)函數(shù)都是系統(tǒng)自動調(diào)用的成員函數(shù)。
x12.構(gòu)造函數(shù)和析構(gòu)函數(shù)都可以重載。
,13.成員函數(shù)與一般函數(shù)一樣可以重載、內(nèi)聯(lián)和設(shè)置參數(shù)的默認值.
x14.靜態(tài)成員是指靜態(tài)對象的成員.
x15.靜態(tài)數(shù)據(jù)成員必須在構(gòu)造函數(shù)的成員初始化列表中進行初始化。
,16.靜態(tài)成員都可以使用類名加作用域運算符的方法來引用。
x17.靜態(tài)成員函數(shù)中引用靜態(tài)數(shù)據(jù)成員和非靜態(tài)數(shù)據(jù)成員的方式是相同的。
,18.常成員指的是類體內(nèi)使用const關(guān)鍵字說明的常數(shù)據(jù)成員和常成員函數(shù)。
x19.常數(shù)據(jù)成員在常成員函數(shù)中的值是不允許改變的,而在非常成員函數(shù)中是允許改
變的。
,20.常對象需要引用常成員函數(shù),而不能引用非常成員函數(shù)。
*21.常對象的數(shù)據(jù)成員都是常數(shù)據(jù)成員。
,22.友元函數(shù)是說明在類體內(nèi)的非成員函數(shù),它可以訪問類中的所有成員。
,23.可以把一個一般函數(shù)說明為某類的友元函數(shù),也可以將某類的成員函數(shù)說明為另類
的友元函數(shù)。
,24.友元類中的所有成員函數(shù)都是友元函數(shù)。
A/25.類型轉(zhuǎn)換函數(shù)是一種特殊的成員函數(shù),定義時不加類型說明,無函數(shù)參數(shù)。
,26.單參數(shù)的構(gòu)造函數(shù)具有類型轉(zhuǎn)換的作用.
6.2單選題
1.下列關(guān)于類的定義格式的描述中,錯誤的是(C)。
A.類中成員有3種訪問權(quán)限
B.類的定義可分說明部分和實現(xiàn)部分
C.類中成員函數(shù)都是公有的,數(shù)據(jù)成員都是私有的
D.定義類的關(guān)鍵字通常用class,也可用struct
2.下列關(guān)鍵字中,不屬于定義類時使用的關(guān)維字是(D)。
A.classB.struct
C.publicD.default
3.下列關(guān)于成員函數(shù)的描述中,錯誤的是(A)。
A.成員函數(shù)的定義必須在類體外
B.成員函數(shù)可以是公有的,也可以是私有的
C.成員函數(shù)在類體外定義時,前加inline可為內(nèi)聯(lián)函數(shù)
D.成員函數(shù)可以設(shè)置參數(shù)的默認值
4.下列關(guān)于對象的描述中,錯誤的是(D)。
A.定義對象時系統(tǒng)會自動進行初始化
B.對象成員的表示與C語言中結(jié)構(gòu)變量的成員表示相同
C.屬于同一個類的對象占有內(nèi)存字節(jié)數(shù)相同
D.一個類所能創(chuàng)建對象的個數(shù)是有限制的
5.下列關(guān)于構(gòu)造函數(shù)的描述中,錯誤的是(C).
A.構(gòu)造函數(shù)可以重載
B.構(gòu)造函數(shù)名同類名
C.帶參數(shù)的構(gòu)造函數(shù)具有類型轉(zhuǎn)換作用
D.構(gòu)造函數(shù)是系統(tǒng)自動調(diào)用的
6.下列關(guān)于析構(gòu)函數(shù)的描述中,錯誤的是(A)。
A.析構(gòu)函數(shù)的函數(shù)體都為空
B.析構(gòu)函數(shù)是用來釋放對象的
C.析構(gòu)函數(shù)是系統(tǒng)自動調(diào)用的
D.析構(gòu)函數(shù)是不能重載的
7.下列關(guān)于靜態(tài)成員的描述中,錯誤的是(C)。
A.靜態(tài)成員都是使用static來說明的
B.靜態(tài)成員是屬于類的,不是屬于某個對象的
C.靜態(tài)成員只可以用類名加作用域運算符來引用,不可用對象引用
D.靜態(tài)數(shù)據(jù)成員的初始化是在類體外進行的
8.下列關(guān)于常成員的描述中,錯誤的是(C)。
A.常成員是用關(guān)鍵字const說明的
B.常成員有常數(shù)據(jù)成員和常成員函數(shù)兩種
C.常數(shù)據(jù)成員的初始化是在類體內(nèi)定義它時進行的
D.常數(shù)據(jù)成員的值是不可以改變的
9.下列關(guān)于友元函數(shù)的描述中,錯誤的是(B)。
A.友元函數(shù)不是成員函數(shù)
B.友元函數(shù)只可訪問類的私有成員
C.友元函數(shù)的調(diào)用方法同一般函數(shù)
D.友元函數(shù)可以是另一類中的成員函數(shù)
10.下列關(guān)于類型轉(zhuǎn)換函數(shù)的描述中,錯誤的是(C).
A.類型轉(zhuǎn)換函數(shù)是一種成員函數(shù)
B.類型轉(zhuǎn)換函數(shù)定義時不指出類型,也沒有參數(shù)
C.類型轉(zhuǎn)換函數(shù)的功能是將其函數(shù)名所指定的類型轉(zhuǎn)換為該類類型
D.類型轉(zhuǎn)換函數(shù)在一個類中可定義多個
6.3填空題
1.類體內(nèi)成員有3個訪問權(quán)限,說明它們的關(guān)鍵字分別是公有、私有和保護。
2.使用class定義的表中,成員的默認訪問權(quán)限是私有的;由struct定義的類中,成員
的默認的訪問權(quán)限是公有的。
3.如果一個類中沒有定義任何構(gòu)造函數(shù)時,系統(tǒng)會自動提供一個默認構(gòu)造函數(shù);同樣,
類中沒有定義析構(gòu)函數(shù)時,系統(tǒng)會自動提供一個默認析構(gòu)函數(shù)。
4.靜態(tài)成員是屬于類的,它除了可以通過對象名來引用外,還可以使用
類名限定來引用。
5.友元函數(shù)是被說明在類體內(nèi)的非成員函數(shù)。友元函數(shù)可訪問該類中的
成員.
6.完成下列類的定義。
classA
(
public:
A(){a=0;}
iniintGeta(A&m);
private:
inta;
};
intGeta(_A_&m)
{returnm.a;|
6.4分析下列程序的輸出結(jié)果
1.
#include<iostream.h>
classA
{
public:
A()
(
al=a2=0;
coutvv"Defaultconstructorcalled.\n";
)
A(inti,intj);
~A()
{cout?"Destructorcalled.\n";}
voidPrint()
{cout?"a1=<'?a1?',,?"a2="?a2?endl;)
private:
intal,a2;
};
A::A(inti,intj)
(
al=i;
a2=j;
cout?"Constructorcalled.\n";
)
voidmain()
(
Aa,b(5,8);
a.Print();
b.Print();
)
答:Defaultconstructorcalled.
Constructorcalled.
al=0,a2=0
al=5,a2=8
Destructorcalled.
Destructorcalled.
2.
#include<iostream.h>
classB
(
public:
B()
{cout?++b?endl;}
~B()
{cout?b-?endl;}
staticintGetb()
{returnb;}
private:
staticintb;
);
intB::b=10;
voidmain()
(
Bbl,b2,b3;
cout?B::Gctb()?cndl;
)
答:11
12
13
13
13
12
11
3.
#include<iostream.h>
classDate
(
public:
Date(inty,intm,intd)
{
year=y;
month=m;
day=d:
1
friendvoidPrint(Date&);
private:
intyear,monthday;
);
voidPrint(Date&d)
cout?d.year?7'?d.month?7'?d.day?endl;
)
voidmain()
Dated1(2005,10,l),d2(2005,l2,9);
Print(dl);
Print(d2);
)
答:2(X)5/10/1
2(X)5/12/9
#include<iostream.h>
classC
(
public:
C(inti,intj)
{cl=i;c2=j;}
voidSum(Ca,Cb)
(
cl=a.cl+b.cl;
c2=a.c2+b.c2;
)
voidPrint()
{cout?Hc1=n?c1?,;<<"c2="?c2?endl;}
private:
intcl,c2;
);
voidmain()
(
Ca(6,9);
Cb(a);
Cc(b);
c.Sum(a,b);
c.PrintO;
)
答:cl=12,c2=18
#include<iostream.h>
classS
(
public:
S()
{PC=0;}
S(S&s)
(
PC=s.PC;
for(inti=0;i<PC;i++)
elems[i]=s.elems[i];
)
voidEmptyO
{PC=0;)
intIsEmptyO
{returnPC==0;}
intIsMemberOf(intn);
intAdd(intn);
voidPrint();
private:
intelems[100],PC;
intS::IsMemberOf(intn)
for(inti=O;i<PC;i++)
if(elems[i]==n)
return1;
return0;
}
intS::Add(intn)
(
if(IsMcmbcrOf(n))
return1;
elseif(PC==I(X))
return0;
else
{
elems[PC++]=n;
return1;
)
)
voidS::Print()
(
coutvv'{';
for(inti=0;i<PC-l;i++)
couyvelems[i]vv',';
if(PC>0)
cout?elems[PC-l];
cout?')"?endl;
voidmain()
(
Sa;
cout?a.IsEmpty()?endl;
a.Print();
Sb;
for(inti=l;i<=5;i++)
b.Add(i);
b.Print();
cout?b.IsMemberOf(3)?endl;
cout?b.IsEmpty()?endl;
for(i=6;i<=10;i++)
b.Add(i);
Sc(b);
c.Print();
)
答:1
{)
{12345}
1
0
{123,4,5,6,7,8910}
6.5編程題
1.按下列要求編程:
(1)定義一個描述矩形的類Rectangle,包括的數(shù)據(jù)成員有寬(width)和長(length);
(2)計算矩形周長;
(3)計算矩形面積;
(4)改變矩形大小。
通過實例驗證其正確性。
答:編程如下:
#include<iostream.h>
classRectangle
(
public:
Rectangle(inta,intb)
{width=a;length=b;}
intArea()
{returnwdth*length;}
intPeriment()
{return2]width+length);}
voidChangesize(inta,intb)
{width=a;length=b;}
voidPrint();
private:
intwidth,length;
);
voidRectangle::Print()
(
cout?"AREA=',?Area()?endl;
cout?"PERIMENT="?Periment()?endl;
voidmain()
(
Rectangler(5,8);
r.Print();
r.Changesize(3,9);
r.Print();
2.編程實現(xiàn)一個簡單的計算器。要求從鍵盤上輸入兩個浮點數(shù),計算出它們的加、減、
乘、除運算的結(jié)果。
答:編程如下:
#include<iostream.h>
classASMD
(
public:
ASMD(doublea,doubleb)
{x=a;y=b;}
voidAddition()
{cout?x+y?endl;}
voidSubtration()
{cout?x-y?endl;}
voidMultiplyO
{cout?x*y?endl;}
voidDivison()
{cout?x/y?end1;}
voidPrint();
private:
doublex,y;
);
voidASMD::Print()
(
Addition();
Subtration();
Multiply();
Divison();
voidmain()
(
ASMDa(40,8);
a.Print();
3.編一個關(guān)于求多個某門功課總分和平均分的程序。具體要求如下:
(1)每個學(xué)生信息包括姓名和某門功課成績。
(2)假設(shè)5個學(xué)生。
(3)使用靜態(tài)成員計算5個學(xué)生的總成績和平均分。
答:編程如下:
#include<iostream.h>
#include<string.h>
classStudent
(
public:
Student(chars[],intgr)
{strcpy(name,s);grade=gr;totalize+=gr;}
staticvoidPrint();
private:
charname[10];
intgrade;
staticinttotalize;
};
intStudent::totalize=0;
voidStudent::Print()
(
coutvv"總成績?yōu)?vvtotalizevv”,平均成績?yōu)??totalize/5?endl;
voidmain()
(
Studentsl(“ma”,85),s2(“Wang”,96),s3(“Li”,82),s4(“l(fā)u”,78),s5("zhang”,80);
Student::Print();
6.6簡單回答下列問題
1.一個類中是否必須有用戶定義的構(gòu)造函數(shù)?如果用戶沒有定義構(gòu)造函數(shù),又如何對
創(chuàng)建的對象初始化?
答:一個類用戶可以不定義構(gòu)造函數(shù),這時系統(tǒng)自動提供一個默認的構(gòu)造函數(shù),并可用該
構(gòu)造函數(shù)對創(chuàng)建的對象初始化。
2.拷貝構(gòu)造函數(shù)具有幾個參數(shù)?它有類型轉(zhuǎn)換的作用嗎?
答:拷貝構(gòu)造函數(shù)具有一個參數(shù),即為該類對象的引用??截悩?gòu)造函數(shù)沒有類型轉(zhuǎn)換作用.
3.靜態(tài)成員屬于類的,是否每個對象都可以引用該靜態(tài)成員?
答:可以。
4.常對象可以引用非常成員函數(shù)嗎?非常對象可以引用常成員函數(shù)嗎?
答:不可以。可以。
5.友元函數(shù)能否訪問類中的保護成員?友元函數(shù)訪問類中私有成員與成員函數(shù)訪問私有成員
的形式相同嗎?
答:能。相同。
第7章類和對象(二)
練習(xí)題7
7.1判斷題
X1.定義對象指針時也要調(diào)用構(gòu)造函數(shù)。
,2.對象指針可用同類對象的地址值給它賦值。
,3.對象指針成員表示與對象引用相同。
,4.常類型指針有兩種,一種是指針的地址值是常量,另一種是指針?biāo)赶虻淖兞炕驅(qū)?/p>
象是常量。
x5.指向?qū)ο蟮某V羔樀牡刂分凳强梢愿淖兊摹?/p>
,6.指向常對象的指針?biāo)赶虻膶ο笫强梢愿淖兊摹?/p>
M7.this指針是系統(tǒng)生成的指向當(dāng)前被某個成員函數(shù)操作對象的指針。
x8.對象引用可以用一個同類對象的地址值對它賦值。
x9.定義對象引用時,可以對其引用進行初始化,也可以不進行初始化。
x10.對象數(shù)組的元素可以是不同類的對象.
x11.對象指針數(shù)組可以使用不同類的對象的地址值進行初始化。
x12.給對象數(shù)組元素賦值時都要創(chuàng)建臨時對象。
M13.指向一維對象數(shù)組的指針是一個二級指針。
x14.自身類對象可作該類的子對象。
M15.子對象的初始化要在構(gòu)造函數(shù)的成員初始化列表中進行。
/16.使用new運算符創(chuàng)建的對象稱為堆對象。
,17.任何對象都可以使用delete運算符來釋放。
x18.使用new運算符創(chuàng)建的對象數(shù)組其元素都具有默認值。
M19.類的作用域范圍指的是類體內(nèi)。
x20.對象的存儲類只有外部的和靜態(tài)的。
7.2單選題
1.門()函數(shù)是類A的公有成員函數(shù),p是指向類的成員函數(shù)口()的指針,下列表示中正確
的是(C)。
A.p=fl()B.p=fl
C.p=A::flD.p=A::fl()
2.p是指向類A數(shù)據(jù)成員a的指針,a是類A的一個對象.在給a成員賦值為5的下列表
達式中,正確的是(C)。
A.a.p=5B.a->p=5
C.a.*p=5D.*a.p=5
3.VoidSet(A&a);是類A中一個成員函數(shù)的說明,其中A&a的含義是(A)。
A.類A的對象引用a作該函數(shù)的參數(shù)
B.類A的對象a的地址值作函數(shù)的參數(shù)
C.表達式變量A與變量a按位與作函數(shù)參數(shù)
D.指向類A對象指針a作函數(shù)參數(shù)
4.已知:constAa;其中A是一個類名,指向常對象指針的表示為(D)。
A.const*Apa;B.constA*pa;
C.A*constpa;D.const*paA;
5.下列關(guān)于子對象的描述中,錯誤的是(D)。
A.子對象不可以是自身類的對象B.子對象是另一個類的對象
C.子對象的初始化要包含在構(gòu)造函數(shù)中D.一個類中只能有一個子對象
6.執(zhí)行下列說明語句,其調(diào)用構(gòu)造函數(shù)的次數(shù)為(A).
Aa[5],*p[2];其中,A是一個類名
A.5B.6
C.7D.10
7.下列關(guān)于運算符new的描述中,錯誤的是(D)。
A.它可以創(chuàng)建對象或變量
B.它可以創(chuàng)建對象數(shù)組或一般類型數(shù)組
C.用它創(chuàng)建對象或?qū)ο髷?shù)組時要調(diào)用相應(yīng)的構(gòu)造函數(shù)
D.用它創(chuàng)建的對象可以不用delete運算符釋放
8.下列關(guān)于運算符delete的描述中,錯誤的是(B)。
A.使用該運算符可以釋放用new運算符創(chuàng)建的對象或?qū)ο髷?shù)組
B.使用該運算符可以釋放所有對象
C.使用delete運算符時會自動調(diào)用析構(gòu)函數(shù)
D.用它釋放對象數(shù)組時,它作用的指針名前要加下標(biāo)運算符[]
9.定義不同存儲類對象時,必須要加的存儲類說明符是(C)。
A.autoB.extern
C.statieD.register
10.下列關(guān)于this的描述中,錯誤的是(D)。
A.this是一個由系統(tǒng)自動生成的指針
B.this指針是指向?qū)ο蟮?/p>
C.this指針在用對象引用成員函數(shù)時系統(tǒng)創(chuàng)建的
D.this指針只能隱含使用,不能顯式使用
7.3填空題
已知:classA{public:A(inti)(a=i;}
voidprint(){cont?a?endl;)
private:inta;
);
要求:
1.定義一個指向?qū)ο蟮某V羔榩,應(yīng)該是A"constp;。
2.定義一個指向常對象指針p,應(yīng)該是Aconst*。;。
3,定義類A的含有5個元素的一維對象數(shù)組a,應(yīng)該是Aa151:。
4.定義一個對象指針數(shù)組pa,它有5個元素,每個元素是類A對象指針,應(yīng)該是A*pa151;。
5.使用new創(chuàng)建一個堆對象,一個實參值為5,應(yīng)該是A*p:p=newA(5):。
6.使用new創(chuàng)建一個對象數(shù)組,該數(shù)組用指針pa指向,并使數(shù)組的3個元素都是類A的
對象a1的值。應(yīng)該是Aal,*pa;pa=newA[3];向0]=迎[l]=Da[2]=al;。
7.在某個函數(shù)體內(nèi)定義一個靜態(tài)類的對象sa,應(yīng)該是staticAsa;0
8.定義一個類A的對象al,并給它賦值,其實參值為8,應(yīng)該是Aal(8);。
7.4分析下列程序的輸出結(jié)果
1.
#include<iostream.h>
classA
(
public:
A(inti)
{a=i;}
A()
{
a=();
coutvv"Defaultconstructorcalled.',?a?endl;
}
~A()
{cout?"Destructorcalled."?a?endl;}
voidPrint()
{cout?a?endl;)
private:
inta;
);
voidmain()
(
Aa[4],*p;
intn=l;
p=a;
for(inti=0;i<4;i++)
a[i]=A(++n);
for(i=0;i<4;i++)
(p+i)->Print();
)
答:Defaultconstructorcalled.0
Defaultconstructorcalled.0
Defaultconstructorcalled.0
Defaultconstructorcalled.0
Destructorcalled.2
Destructorcalled.3
Destructorcalled.4
Destructorcalled.5
2
3
4
5
Destructorcalled.5
Destructorcalled.4
Destructorcalled.3
Destructorcalled.2
2.
#include<iostream.h>
classB
{
public:
B(inti)
{b=i;}
B()
(
b=0;
cout?"Defaultconstructorcalled."?b?end1;
}
~B()
{cout?"Destructorcalled."?b?endl;}
voidPrint()
{cout?b?endl:)
private:
intb;
);
voidmain()
(
B*pb[4];
intn=l;
for(inti=0;i<4;i++)
pb[i]=newB(n++);
for(i=0;i<4;i++)
pb[i]->Print();
for(i=0;i<4;i++)
delete*(pb+i);
)
答:1
2
3
4
Destructorcalled.1
Destructorcalled.2
Destructorcalled.3
Destructorcalled.4
3.
#include<iostream.h>
classC
public:
C(inti)
{c=i;)
C()
{
c=O;
couK^'Dcfaultconstructorcalled."?c?cndl;
1
-CO
{cout?"Destructorcalled."?c?endl;}
voidPrint()
{cout?c?endl;}
private:
intc;
};
voidmain()
(
C*p;
p=newC[4];
intn=l;
for(inti=0;i<4;i++)
p[i]=C(n++);
for(i=0;i<4;i++)
p[i].Print();
delete[]p;
)
答:Defaultconstructorcalled.0
Defaultconstructorcalled.0
Defaultconstructorcalled.0
Defaultconstructorcalled.0
Destructorcalled.2
Destructorcalled.3
Destructorcalled.4
Destructorcalled.5
2
3
4
5
Destructorcalled.5
Destructorcalled.4
Destructorcalled.3
Destructorcalled.2
4.
#include<iostream.h>
classD
public:
DO
(
dl=d2=0;
cout?MDefaultconstructorcallrd.\n";
)
D(inti,intj)
(
dl=i;d2=j;
cout?uConstructorcalled."?"d1="?d1<<\,?"d2="?d2?cndl;
)
?D()
{cout?"Destructorcalled.H?"d1="?d1?,,'?"d2=,'?d2?endl;}
voidSet(inti,intj)
{dl=i;d2=j;}
private:
intdl,d2;
);
voidmain()
(
intn(10),m(20);
Dd[4]={D(5,7),D(3,6),D(7,9),D(1,4)};
for(inti=0;i<4;i++)
d[i].Set(n++,m++);
)
答:Constructorcalled,dl=5,d2=7
Constructorcalled,dl=3,d2=6
Constructorcalled,d1=7,d2=9
Constructorcalled,d1=1,d2=4
Destructorcalled.dl=13,d2=23
Destructorcalled.dl=12,d2=22
Destructorcalled.dl=ll,d2=21
Destructorcalled.dl=10,d2=20
5.
#include<iostream.h>
classE
(
public:
E(inti,intj)
{
el=i;e2=j;
couK^'Constructorcalled.'r?"eI="?e1?\'?He2="?e2?endl;
)
voidFunE(E*e)
el=e->el;
e2=e->e2;
cout?"Constructorcalled."?"e1="?e1?V?"e2="?e2?endl;
)
voidFunE(E&e)
(
el=e.el;
e2=e.e2;
coutvv"InFunE(E&e)."?"e1=n?e1?','?"e2="?e2?endl;
)
private:
intel,e2;
);
voidmain()
(
Ea(5,6),b(3,4);
a.FunE(&b);
b.FunE(a);
)
答:Constructorcalled,e1=5,d2=6
Constructorcalled.el=3,e2=4
InFunE(E&e).el=3,e2=4
InFunE(E&e).el=3,e2=4
6.
#include〈沁stream.h>
classF
(
public:
classG
{
public:
G()
()
G(inti)
{g=i;}
intGetValue()
{returng;}
voidPrint(F*p);
private:
intg;
}myg;
friendclassG;
F(inti,intj):myg(i)
{f=j;}
private:
intf;
);
voidF::G::Print(F*p)
cout?p->f?endl;
)
voidmain()
(
F::Gg;
Ff(5,10);
f.myg.Print(&f);
g=f.myg;
cout?g.GetValue()?endl;
)
答:10
5
7.5編程題
1.按下列要求實現(xiàn)一個棧類的操作。
該類名為Stack,包括如下操作:
(1)壓棧操作:Push();
(2)彈棧操作:Pop();
(3)獲取棧頂元素:Peer();
(4)判??詹僮鳎篒sEmpty();
(5)判棧滿操作:IsPuUO。
設(shè)棧最多可存放50個整數(shù)。
棧中成員用數(shù)組表示。
編寫一個程序,定義一個棧類的對象數(shù)組來驗證該類操作。
答:棧的正常操作程序如下:
#include<iostream.h>
#include<stdlib.h>
classStack
(
public:
Stack(inti);
?Stack。
{delete0ia;}
voidPush(inti);
intPop();
voidIsUpll()
(
if(tos==length)
(
cout?HStackisfill.\nn;
return;
}
}
intIsEmptyO
{
if(tos==0)
(
cout?HStackunderflow.Xn";
return0;
)
)
private:
int*sta;;
inttos,length;
Stack::Stack(inti)
(
sta=newint[i];
if(!sta)
(
coutvv”Can'lallocatestack.\n";
abort();
)
tos=0;
length=i;
}
voidStack::Push(inti)
(
sta[tos]=i;
tos++;
}
intStack::Pop()
(
tos-;
returnsta[tos];
)
voidmain()
(
Stacka(50);
a.Push(l);
a.Push(2);
a.Push(3);
a.Push(4);
a.Push(5);
a.Push(6);
a.Push(7);
a.Push(8);
a.Push(9);
a.Push(lO);
cout<<a.Pop()<<?;
coulvva.Pop()vv7;
cout?a.Pop()?\';
cout<va.Pop()v<';
cout?a.Pop()<<';
cout<<a.Pop()vv?;
cout?a.Pop()?',';
cout?a.Pop()?',,;
cout?a.Pop()?',^;
cout?a.Pop()?,,,?endl;
)
判斷棧的空、滿操作,請讀者修改上述程序。
2.按下列要求實現(xiàn)一個有關(guān)學(xué)生成績的操作。
該類名為Student。
(1)每個學(xué)生的信息包含有姓名(字符數(shù)組)和成績(int型。
(2)共有5個學(xué)生,用對象數(shù)組表示。
(3)計算出5個學(xué)生中的最高分,并輸出姓名及分?jǐn)?shù)。
答:編程如下:
#include<iostream.h>
#include<string.h>
classStudent
(
public:
Student(chars[],intgr)
{strcpy(name,s);grade=gr;}
friendvoidfun();
private:
charname[10];
intgrade;
);
Studentss[5]={Student(,'^>7",85),Student(',I^,,,96),Student(',^^,,,82),
Student(“趙亮”,78),Student。張京*80)};
voidfun()
(
intk=0;
for(inti=0;i<5;i++)
if(ss[i].grade>ss[0].grade)
k=i;
coutvv”最高分的學(xué)生姓名和成績?nèi)缦?\n"?ss|k|.name?,,,?ss[k].grade?endl;
)
voidmain()
(
fun();
3.按如下要求編程驗證子對象的有關(guān)操作。
(1)定義兩個類A和類B。
(2)在類B中有兩個類A的對象one,two。
驗證如下事實:
(1)在類B的構(gòu)造函數(shù)中應(yīng)該包含對兩個類A的子對象的初始化項,被放在成員初始化
列表中。
(2)在類B的默認構(gòu)造函數(shù)中隱含著子對象的初始化項。
(3)在類B的析構(gòu)函數(shù)中也隱含著子對象的析構(gòu)函數(shù)。
(4)調(diào)用子對象構(gòu)造函數(shù)的順序。
答:運行下列程序,從輸出結(jié)果中分析要驗證的4個事實。
程序內(nèi)容如下:
#include<iostream.h>
classA
(
public:
A()
{cout?MInA0.\nM;}
A(inti)
{a=i;cout?HInAl."?a?endl;}
?A()
{cout?MInA2."?a?endl;}
inta;
);
classB
(
public:
B()
{cout?HInH).\nM;}
B(inti,intj,intk):two(j),one(k)
{b=i;cout?HInBlAn";}
voidPrint()
(
cout?b?,/?one.a?,,'?two.a?endl;
)
?B()
{cout?MInB2.\nM;}
private:
intb;
Aone,two;
);
voidmain()
(
coutvv”構(gòu)造函數(shù)的調(diào)用情況:\n”;
staticBbbO;
Bbb(1,2,3);
coutcv”輸出對象bb的數(shù)據(jù)成員值:\n";
bb.Print();
coutvv”析構(gòu)函數(shù)的調(diào)用情況:\n";
7.6簡單回答下列問題
1.對象指針可以指向一個有名對象,它可以指向一個無名對象嗎?如何實現(xiàn)?
答:對象指針可以指向一個有名對象,也可以指向一個無名對象。例如,對象指針指向堆
對象就是一個例子。假定己知類A,定義該類對象指針pa:
A*pa;
pa=newA(8);
pa就是一個指向類A的無名對象的指針.
2.對象數(shù)組和對象指針數(shù)組的區(qū)別在哪里?
答:對象數(shù)組的元素是同一個類的若干個對象,對象指針數(shù)組的元素是指向同一個類的若
千個對象指針。
3.在一個類中定義了多個子對象,其構(gòu)造函數(shù)調(diào)用子對象的構(gòu)造函數(shù)的順序取決于什么?
答:構(gòu)造函數(shù)調(diào)用子對象的順序取決于定義子對象的順序,而與構(gòu)造函數(shù)的成員初始化列表
中給出的子對象速設(shè)無關(guān)。
4.使用new運算符創(chuàng)建的對象,如果不使用delete運算符釋放,它們會在生存期到了時
被系統(tǒng)釋放嗎?
答:不會。
5.對象指針與對象引用作函數(shù)參數(shù)時具有相同的特點,為什么人們更喜歡使用對象引用
作函數(shù)參數(shù)呢?
答:因為使用對象引用比使用對象指針更簡單。
第8章繼承性和派生類
練習(xí)題8
8.1判斷題
X1.派生類只繼承基類中的公有成員和保護成員,而不繼承私有成員。
X2.多重繼承是指一個基類派生出多個派生類的情況。
,3.單重繼承是指派生類只有一個基類的情況。
,4.派生類還可以作基類派生出新的派生類。
M5.派生類中成員的訪問權(quán)限與基類的繼承方式有關(guān).
,6.派生類中只包含直接基類的成員,不包含間接基類的成員。
M7.繼承反映了類之間“是”的關(guān)系,組合反映了類之間“有”的關(guān)系。
x8.基類中成員在派生類中都是可以訪問的。
x9.私有繼承中基類的私有成員在派生類中還是私有的。
M10.保護繼承方式下基類的保護成員在派生類仍是保護成員。
x11.派生類的對象和派生類的派生類對派生類成員的訪問權(quán)限是一樣的.
,12.派生類的構(gòu)造函數(shù)包含著直接基類的構(gòu)造函數(shù)。
x13.派生類的默認構(gòu)造函數(shù)不包含有直接基類的構(gòu)造函數(shù).
x14.派生類的析構(gòu)函數(shù)中不包含直接基類的析構(gòu)函數(shù)。
x15.派生類是基類的子類型。
,16.如果一個類是另一個類的子類型,則這個類的對象可以給另一個類的對象賦值,反
之亦然。
017.多重繼承派生類的構(gòu)造函數(shù)中應(yīng)包含所有直接基類的構(gòu)造函數(shù)。
*18.多重繼承的派生類構(gòu)造函數(shù)中執(zhí)行基類構(gòu)造函數(shù)的順序取決于該派生類構(gòu)造函數(shù)的
成員初始化列表中出現(xiàn)基類初始化項的順序。
8.2單選題
1.下列關(guān)于繼承的描述中,錯誤的是(B)。
A.繼承是重用性的重要機制
B.C++語言支持單重繼承和雙重繼承
C.繼承關(guān)系不是可逆的
D.繼承是面向?qū)ο蟪绦蛟O(shè)計語言的重要特性
2.下列關(guān)于基類和派生類的描述中,錯誤的是(C)。
A.一個基類可以生成多個派生類
B.基類中所有成員都是它的派生類的成員
C.基類中成員訪問權(quán)限繼承到派生類中不變
D.派生類中除了繼承的基類成員還有自己的成員
3.下列關(guān)于派生類的描述中,錯誤的是(D).
A.派生類至少有一個基類
B.一個派生類可以作另一個派生類的基類
C.派生類的構(gòu)造函數(shù)中應(yīng)包含直接基類的構(gòu)造函數(shù)
D.派生類默認的繼承方式是public
4.派生類的對象可以直接訪問的基類成員是(A)。
A.公有繼承的公有成員B.保護繼承的公有成員
C.私有繼承的公有成員D.公有繼承的保護成員
5.下列描述中,錯誤的是(D).
A.基類的protected成員在public派生類中仍然是protected成員
B.基類的private成員在public派生類中是不可訪問的
C.基類public成員在private派生類中是private成員
D.基類public成員在protected派生類中而是public成員
6.派生類構(gòu)造函數(shù)的成員初始化列表中,不能包含的初始化項是(B).
A.基類的構(gòu)造函數(shù)B.基類的子對象
C.派生類的子對象D.派生類自身的數(shù)據(jù)成員
7.下列關(guān)于子類型的描述中,錯誤的是(B)。
A.在公有繼承下,派生類是基類的子類型
B.如果類A是類B的子類型,則類B也是類A的子類型
C.如果類A是類B的子類型,則類A的對象就是類B的對象
D.在公有繼承下,派生類對象可以初始化基類的對象引用
8.下列關(guān)于多繼承二義性的描述中,錯誤的是(D)。
A.一個派生類的多個基類中出現(xiàn)了同名成員時,派生類對同名成員的訪問可能出現(xiàn)二
義性
B.一個派生類有多個基類,而這些基類又有一個共同的基類,派生類訪問公共基類成
員時,可能出現(xiàn)二義性
C.解決二義性的方法是采用類名限定
D.基類和派生類中同時出現(xiàn)同名成員時,會產(chǎn)生二義性
8.3填空題
1.繼承的3種方式是公有、私有和保護.
2.如果類A繼承了類B,則類A被稱為派生類,類B被稱為基類。
3.在保護繼承方式下,基類的public成員成為派生類的保護成員,基類的protected
成員成為派生類的保護成員。
4.當(dāng)一個派生類中含有子對象時,該派生類的析構(gòu)函數(shù)中應(yīng)包含
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度個人與個人間家政服務(wù)合同范本3篇
- 太原瀝青路面施工方案
- 2025版消防電梯安全設(shè)施安裝與維護承包合同范本3篇
- 二零二五年度高品質(zhì)貼鋁箔巖棉板采購與節(jié)能檢測服務(wù)合同3篇
- 酒泉消防電氣檢測施工方案
- 二零二五年度個人與個人間藝術(shù)品購買借款合同
- 二零二五年度金融糾紛訴訟保全擔(dān)保合同大全3篇
- 2025版選礦廠承包合同及礦山安全生產(chǎn)技術(shù)服務(wù)協(xié)議3篇
- 預(yù)制塑料梯形槽施工方案
- 通風(fēng)窗更換施工方案
- 廣西華銀鋁業(yè)財務(wù)分析報告
- 無違法犯罪記錄證明申請表(個人)
- 電捕焦油器火災(zāi)爆炸事故分析
- 大學(xué)生勞動教育PPT完整全套教學(xué)課件
- 繼電保護原理應(yīng)用及配置課件
- 《殺死一只知更鳥》讀書分享PPT
- 蓋洛普Q12解讀和實施完整版
- 2023年Web前端技術(shù)試題
- 品牌策劃與推廣-項目5-品牌推廣課件
- DB31T 685-2019 養(yǎng)老機構(gòu)設(shè)施與服務(wù)要求
- 燕子山風(fēng)電場項目安全預(yù)評價報告
評論
0/150
提交評論