资源描述
《面向对象程序设计》课程期末复习资料
一、客观部分:(单项选择、多项选择、不定项选择、判断)
(一)、选择部分1、面向对象方法的基本观点是一切系统都是由(C )构成的。
A、结构B、模块C、对象D、类2、下列关于主函数的叙述中正确的是(B )。
A、一个程序可以有多个主函数B、程序从主函数开始执行C、一个程序可以没有主函数D、主函数是一个特殊的函数,因此其结构与其他函数不同3、有关带默认参数的函数的描述正确的是(D )。
A、只能在函数定义时设置默认参数值B、只能在函数声明时设置默认参数值C、函数调用时,必须使用默认的参数值,不能给出新的实参值D、设置默认参数时,应该设置最右边的若干个参数的默认值4、有关重载函数的描述正确的是(C )。
A、函数名相同的函数就是重裁函数B、函数名相同但返回值类型不同的函数就是重载函数C、函数名相同但参数个数或类型不同的函数就是重载函数D、函数功能相同的函数就是重载函数5、假设堆内存分配均成功,则下面程序段完全正确的是(A )oA、int *p=new int(3) ;cout«*p;delete p;B、int *p=new int[5] = (l, 2, 3, 4, 5} ;for(int i=0; i<5; i++)cout«p[i] jdelcte□ p;C、int *p=new int [5] ;for(int i=0; i<5; i++, p++) {*p=i; cout«*p;}delete[]p;D、以上程序段均正确6、变量的引用,其含义是指该变量的(C )oA、值B、类型C、别名D、地址
Derived I obj2;
Derived? obj3;
p=&obj 1;
p->Who();
p=&obj2;
p->Who();
p=&obj3;
p->Who();
obj2.Who();
obj3.Who(); return 0;}参考答案:
class Baseclass Baseclass Baseclass Derivedlclass Derived26、写出下面程序的运行结果。 #inckide<iostrcam> using namespace std;class Shape(public:
void Draw()
{cout«"Shape"«endl;
I
virtual void Prinl()=0;};class Circle:public Shape{private:
double r;public:
void Draw()
{cout«"Circle"«endl;
}
void SetData(double radius)r=radius;
void Print()cou(«"area:"«3.14*r*r«endl;
}};class Rectangle:public Shape{private:
double a,b;public:
void Draw()
{cout«"Rectangle"«endl;
1
void SetData(doublc x,double y)
{a=x,b=y;
}
void Print()
(cout«',area:"«a*b«endl;
1};int main(){
Circle c;
Rectangle r;
Shape *spl=&c;
Shape &sp2=r;
c.SetData(IO);
r.SetData(3,5);
spl->Draw();
c.Piint();
sp2.Draw();
r.Print();
return 0;}参考答案:
Shapearea:314Shapearea:157、写出下面程序的运行结果。
#include <iostream>using namespace std;class Sample;Sample opcrator-(Samplc &,Samplc &);Sample operator+(Sample &,Sample &); class Sample(public:
Samplc(){)
Sample(int i){n=i;}
friend Sample operator-(Sample &,Sample &); friend Sample opcrator+(Sample &,Sample &); void disp(){cout«"n="«n«endl;} private:
int n;};Sample opcrator-(Saniple &sl,Sample &s2)(
int m=sl .n-s2.n;
return Sample(iTi);}Sample operator+(Sample &sl,Sample &s2)(
int m=sl .n+s2.n;
return Sample(m);)int main(){
Sample s 1 (10),s2(20),s3;
s3=s2-sl;
s3.disp();
s3=s2+sl;
s3.disp();
return 0;}参考答案:
n=10n=308、写出下面程序的运行结果。
#include <iostream>using namespace std;class Sample public:
Sample(int i){n=i;}
void opcrator+=(int i)(n+=i;} void operator-=(int i)(n-=i;}
void disp(){ cout«"n="«n«cndl:
}private:
int n;};int inain()(
Sample A(2),B(2);
A+=l;
B-=l;
A. dispO;
B. dispO;
return 0;}参考答案:
n=3n=l9、写出下面程序的运行结果。
#include <iostream>#includc <fstrcam>using namespace std;int main。
(
ofstream fllel; filcl.opcn("fl.datu); filel«l23«endl; filel«63.78;
filel.close();
ifstream file2("f 1 .dat");
int i, j;
file2»i»j;
cout«,,i+j="«i+j«endl; file2.close();
return 0;}参考答案:
i+j=18610、写出下面程序的运行结果。
#include <iostrcam>using namespace std;template <class T>class add{
Tx, y;public:
add(T a, T b)
{x=a;y=b;
I
T add 1() { return x+y; }};int main()(
add <int> A(65, 120);
add <doublc> B(13.6, 22.9);
cout«"sl ="«A.addl ()«endl;
cout«,'s2=,,«B .add 1 ()«endl;
return 0;}参考答案:
sl=185s2=36. 511、swap(涵数利用引用作为参数实现两个变量的交换,将程序填写完整。
#includc <iostream>using namespace std;void swaD(int &x, int &、)(
int temp;
temp=x;
y=temp;}int main()(
int a,b;
cin»a»b;
swaD(a, b):
cout«a«,, "«b«endl; return 0;★考核知识点:C++与C的主要差异-函数的引用调用参见讲稿章节:1-1612、下面的程序定义了两个类,一个是TennisClub,其成员数据有俱乐部和会员 名,另一个是Person,其成员数据有姓名和年龄,类TennisClub的成员函数visit 可以显示姓名、年龄、俱乐部名、会员名。将程序填写完整。
#include <iostream>#include <string.h>using namespace std;class Person;class TennisClub(public:
TennisClub(char 华char *q)
{strcpy(club,p);strcpy(name,q);
}
void visit(Person);private:
char club[24];
char name[24];};class Person(public:
Person(char *p.int y)
{strcpy(namc,p);age=y;
}
friend void TennisClub::visit(Person x);private:
char namc[24];
ini age;};void TennisClub::visit(Person x)(
cout«"姓名:"«x.name«endl;
cout«,r 年龄:"«x.age«endl;
cout«H可以使用的俱乐部:"«club«endl;
cout«"介绍人:"«name«endl;int main()(
TennisClub a(”明星俱乐部”,”李晓明,
Person b(”张静”,28);
a.visit(b);
return 0;}★考核知识点:类的定义、类的友元参见讲稿章节:2-03. 2-1613、请将下面程序补充完整。
#include <iostream>using namespace std;class Student;class Teacher(public:
void setScore(Student& s,double sc);
void setHour(Studcnt& s,int h);private:
long number;
charname[ 101; };class Student{public:
friend class Teacher;
double getScorc() { return score; }
int getHour() ( return semeHour; }private:
long number;
char name[ I0J;
double score;
int semeHour;};void Teacher::setScore(Student& s,double sc) {
s.score=sc; } 〃可以直接访问Student的私有数据成员void Teacher::se(Hour(Student& s,int h) {
s.semeHour=h; } //可以直接访问Student的私有数据成员int niain() {
Teacher I;
Student s;
t.setScore(s,98.5);
t.selHour(s,5);
cout«s.gctScorc()«" "«s.gctHour()«cndl;
return 0;}★考核知识点:类的友元参见讲稿章节:2-1614、请补充完整下面类说明中的拷贝构造函数。
class MyClass(public:
int *p;
int size;
MyClass(int n):size(n),p(new int[n]){}
~MyClass(){ delete []p;}
MyClass(MyClass& me): sizc(mc.size)
{D = new intlsize];fbr(int i=0;i<size;i++)= mc.D[i];
}};★考核知识点:拷贝构造函数、类的常量成员参见讲稿章节:2-10. 2-1215、将下列程序填写完整。
#include <iostream>using namespace std;class Point(public:
Point(double aJouble b.double c){ X=a;Y=b;Z=c; }
double Getx(){return X;}
double Gety(){ return Y;}
double Getz()( return Z;}private:
double X.Y;protected:
double Z;};class Line : public Point(public:
Line(double a ,double bJouble c,double d):Point(a,b.,c){ K=d; }
void show()
{cout«Getx()«endl;cout«Gcty ()«cndl;cout«Getz()«" "«Z«endl;cou(«K«endl;
Iprivate:
double K:
};int main()(
Line obj( 1.2,3.4,5.6,7.8);
obj.show();
return 0:
J★考核知识点:派生类构造函数和析构函数、函数重定义和派生类的继承方式 参见讲稿章节:3-03. 3-0516、将下列程序填写完整。
#includc <iostrcam>using namespace std;class Furniture(public:
void SetWeight(int i){ m_weight=i; )
int GetWeight()( return m_weight; }
void Move(int i)( coul«"Move "<<i«,,m."«endl; }protected:
int m_weight;};class Bed : virtual public Furniture{public:
void Sleep(){ cout «"Sleeping...\n"; }};class Sofa : virtual public Furniture(public:
void WatchTV(){ cout «"Watching TV.\ii"; }};class SofaBcd : public Bed, public Sofa(public:
void FoldOut(){ cout «"Fold out the sofa.\n"; }};int inain()(
SofaBed ss:
ss.SetWeight(2O);
cout «ss.GetWeight() «endl;
ss.Movc(l);
ss.Sleep();
ss.WatchTVf);
return 0;}★考核知识点:虚拟继承和虚基类参见讲稿章节:3-0817、下面的程序将一个普通函数作为类的友元函数,求坐标点之和,并且程序输 出结果为2,2,4,请将程序补充完整。
#include <iostream>using namespace std;class Point(
int X,Y;public:
Point(int x=0, int v=0)
{ X=x; Y=y; Countp++; }
Point(Point &p)
{ X=p.X; Y=p.Y; Countp++; }
~Point()
{ Countp-; }
friend Point myfun(Point pl, Point p2. Point b3);
static int Countp;
void display(){cout«X«,,;,«Y«,V,;}};Point myfun(Point pl. Point p2. Point p3){
Point tmp(pl.X+p2.X+p3.X, pl.Y+p2.Y+p3.Y);
return tmi);}int Point::Countu = 0;int main()(
Point ppO,ppI(I,2),pp2(l);
Point p二myfun(pp(),ppl,pp2);
p.display ();
coutvvD.CountD 或 Point::CountDVVendl:〃输出 Counlp 的值7、己知“int a=10, b=8; int &r=a; r=b;cout«a<<z,,,,<<b<<//, z,<<r; 则输出 为(D )。
A、10, 8, 10 B、10, 8,8 C、8,8, 10 D、8,8,88、己知 wint a=10, *p; int *&r=p; r=&a;*p=20;cout«a; w,则输出为(B )。
A、10B、20C、不确定值 D、程序有错误9、下列关于类和对象的叙述中,错误的是(A )。
A、一个类只能有一个对象B、对象是类的具体实例C、类是某一类对象的抽象D、类和对象的关系是一种数据类型与变量的关系10、有如下类声明:
class Sample { int x; };
则Sample类成员x是Sample类的(C )。
A、公有数据成员B、保护数据成员C、私有数据成员D、以上选项都不正确11、C++中,关于构造函数和析构函数,正确的描述是(C )oA、在定义类时,必须自定义构造函数和析构函数,在创建对象时自动调用构造 函数,在释放对象时自动调用析构函数B、构造函数和析构函数均可以重载C、已知类Student以及Student *p;在使用p=new Student;时自动调用无参构造函数创建动态对象,在delelte p;时自动调用析构函数释放动态对象D、构造函数和析构函数都可以成为虚函数12、在类的定义中,用于对类的数据成员进行初始化并执行其他内部管理操作的 函数是(C )。
A、友元函数B、虚函数 C、构造函数 D、析构函数13、对于拷贝构造函数,正确的描述是(A )。
A、在C++语言中,如果不自定义类的拷贝构造函数,则每个类都有默认的拷贝 构造函数B、必须为每个类定义拷贝构造函数C、如果要使用拷贝构造函数,则必须在类中先定义D、当定义了类的构造函数时,如果要使用拷贝构造函数,则必须定义拷贝构造 函数
return 0;★考核知识点:类的静态数据成员、类的友元参见讲稿章节:2-13、2-1618、ARRAY类的定义如下,构造函数把参数n的值赋给s,给v动态分配长度 为n的数组空间,然后利用数组参数a初始化v所指向的数组。请将类定义补充 完整。
class ARRAY(
ini *v;
int s;public:
ARR/\Y( int a[], int n );
〜ARRAY()
{ delete [lv: }
int size()
{ return s; }
int& operator!](int i);};ARRAY::ARRAY(int a[], int n)(
if( n<=0)
{ v=NULL; s=0; return; }
s=n;
v=new intfsl;
fbr(int i=0; i<n; i++)v[i]=a[i];}int& ARRAY::operator[l(int i)(
return v[i];}★考核知识点:赋值运算符和下标运算符重载程序实例参见讲稿章节:2-2219、下面程序的功能是将文本文件readme.txt中的内容读出并显示在屏幕上,请 将程序补充完整。
#include <iostream>#include <fstream>#include <stdlib.h>using namespace std;int main()
char str(801;
ifstream meC'readrne.txt");
if(!nie)
{COUIVV"文件打开失败! ”《endl; abort();
}
while (Ime.eofQ)
{me.getline(str, 80);cout«str«endl;
I
me.closeO:
return 0;)★考核知识点:输入输出流的getline函数 参见讲稿章节:4-07#include <fstream>#include <string.h> using namespace std;int main()(
20、卜而程序的功能是:
在文件f7txt的尾部写入一个字符串,请将程序补充完
char ch(l="The end";
ofstream outstr("f7.txt'\ ios::app); for(int i=0; i<strlen(ch); i++) outstr.put(ch[i]);
outstr.closc();
return 0;}★考核知识点:输入输出流对象 参见讲稿章节:4-02using namespace std; int main()
21、下面程序的功能是:
#includc <iostrcam>
#include <fstream>
#include <stdlib.h>
统计文件f7.txt中的字符个数,请将程序补充完整。
(stream file;
filc.opcn("f7.txt", ios::in);
{cout«"Can not open f7.txt"«endl;abort();
I
char ch;
int i=();
while (!file.eof())
{filc.gct(ch);i++;
}
cout«,,Characters: "«i«endl;
file.closeO;
return 0;}★考核知识点:输入输出流的get函数参见讲稿章节:4-0622、下面的程序将一个己有文件的内容复制到另一个文件中。请将程序补充完整。
#include<iostream>#include<fstream>#include<stdlib.h>using namespace std;int main()(
fstream infile, cutfile;
infile.open("c:\\filel.txt",ios::in);
if (Jinfile)
{cout«ufllel .txt can't openAn";abort();
1
outfile.open(,,c:\\file2.txt'\ios::out);
if(!outfile)
{cout«"filc2.txt can't opcnAn";abort();
(
char str[80]=,,\0";
while(!infile.eof())infile.read(str.sizeof(str));outnie.write(str, sizeof(str));cout«str;
I
cout«cndl;
infile.close();
outrilc.close。:
return 0;}★考核知识点:输入输出流的write函数参见讲稿章节:4-0823、下面的程序是一个类模板,可实现求三个变量的和,请将程序补充完整。
#include <iostream>using namespace std;template vclass Tvi)e>class ff(
Type al, a2, a3;public:
ff(T、De bl. Type b2. Type b3)
( a1=b1;a2=b2;a3=b3; }
Type sum()
{ return ai+a2+a3; }};ini main(){
ff<int> x(12,13,14), y(16,17,18);
cout«x.sum()«,' ,,«y.sum()«endl;
return 0;}★考核知识点:类模板的定义参见讲稿章节:5-03参考答案:
24、编写一个计算长方形面积的程序。设长和宽为整数,其值由键盘输入,计算 结果显示在屏幕上。
★考核知识点:C++源程序的组成参见讲稿章节:1-07参考答案:
#include <iostream>using namespace std;int CoinputeRectangleArea(int nL, int nW)
int nA = nL * nW; return nA;}int main()(
int nWidth, nLength, nArea;
coutvv”请输入长方形的长度和宽度(长宽都为整数): cin»nLength»nWidth;
nArea = ComputcRcctangleArea(nLcngth, nWidth); cout«"长方形的面积为:"vvnAreavvendl;
return 0;I例如:
例如:
25、编写简单计算器程序,使它能够进行四则运算。
输入:3+9输出:3+9=12★考核知识点:C++源程序的组成参见讲稿章节:1-07参考答案:
#include <iostream>using namespace std;int main()(
double dA, dB, dR;
char cC;
coutvv”请输入四则运算式:”; cin»dA»cC»dB; // 3.5+9.3 switch (cC)
{
case '+':
dR = dA + dB;break;
casedR = dA - dB;break;
casedR = dA * dB;break;
case 7':
dR = dA / dB:
break;
default:
cou(«"输入四则运算式的格式不正确! u«endl; return 0;
I
coutvv”运算结果为:,,<<dA«cC«dB«"=,,«dR«endl;
return 0;}26、编写程序,将一个十进制正整数按倒序形式输出。例如:输入123,则输出3210★考核知识点:C++源程序的组成参见讲稿章节:1-07参考答案:
#include <iostream>using namespace std;int main()(
int nlnput, nS, nY, nR = 0;
coutvv”请输入一个十进制的正整数:”;
cin»nlnput;
nS = nlnput;
while (nS != 0)
{nY = nS % 10;nR = nR*10+nY;nS = nS / 10;
1
coutvv”其倒序形式为:"«nR«endl;
return 0;}27、编写程序,求20以内的勾股数。例如:32+42=52, 3、4、5是勾股数。
★考核知识点:C++源程序的组成参见讲稿章节:1-07参考答案:
#includc <iostrcam>using namespace sld;int main()(
int nA, nB, nC;// nAA2+nBA2=nCA2
for (nC = 1; nC <= 20; nC++)for (nB = 1; nB < nC; nB++) for (nA = 1; nA <= nB; nA++)(if (nA*nA+nB*nB == nC*nC){cout«nA«" ,'«nB«" H«nC«endl;}I}
I
return 0;}28、编写display函数,其功能为:当传入一个字符串参数时,则将该字符串输 出到屏幕上;当不传入任何参数时,则输出“noname”。例如:
执行“display(”Li Xiaoming”);”后,在屏幕上输出"Li Xiaoming”。
执行"display。"后,在屏幕上输出“nonamc”。
★考核知识点:C++与C的主要差异-带默认形参值的函数、C++与C的主要差异-函数重载参见讲稿章节:1-11. 1-12参考答案:
以默认形参方式实现:
#include <iostream>using namespace std;void Display(char *s = "noname"){
cout«s«endl;}int main()(
DisplayC'Li Xiaoming");
DisplayO;
return 0;}以函数重载方式实现:
#include <iostream>using namespace std;void Display(char *s);void DisplayO;int main()
DisplayC'Li Xiaorning");
DisplayO;
return 0;void Display(char *s)(
cout«s«cndl;Ivoid DisplayO{
cout«"noname"«endl;I29、编写程序,定义两个重载函数,分别求平面中两个整数(int)坐标点间的距 离和两个实数(float)坐标点间的距离,其计算结果都为实数。
★考核知识点:C++与C的主要差异-函数重载参见讲稿章节:1-12参考答案:
#include <iostream>#include <cmath>using namespace std;double ComputeDistance(int nXl, int nYl. int nX2, int nY2)(double dR:
dR = sqrt((double)(nX 1 -nX2)*(nX I-nX2)+(nY l-nY2)*(nY 1 -nY2)); cout«ndouble CompuleDistance(int nXl, int nYl, int nX2, int nY2)函数被调用! "«endl; return dR;Idouble ComputeDistance(float fXl, float fYl, float fX2, float fY2)(
double dR:
dR = sqrt((fX 1 -fX2)*(fX 1 -fX2)+(fY 1 -fY2)*(fY 1 -fY2));
cout«ndouble ComputeDislance(float fXl, float fYl, float 1X2, float fY2)函数被调用! "«endl;
return dR;}int main()cout«ComputcDistancc( 1, 2, 3, 4)«cndi;cout«CompuleDislance( 1.5f, 2.5f, 3.5f, 4.6f)«endl; return 0;3()、编写程序,定义两个重载函数GetMax,分别求两个整数的最大值和一个整 型数组中各元素的最大值。例如:
cout«getMax(3, 4); //输出 4int a[] = {5, 15, 10, -6, 7);〃输出数组a中的最大值15cout«getMax(a, sizeof(a)/sizeof(int));★考核知识点:C++与C的主要差异-函数重载参见讲稿章节:1-12参考答案:
#include <iostream>using namespace std;int GetMax(int nA, int nB);int GetMax(int nArray[], int nSize);int niain()(
int nA[] = {5, 10, -6, 7, 25, 15};
cout«GetMax(3,4)«endl;
cout«GetMax(nA, sizeof(nA)/sizeof(nA[0]))«endl;
return 0;}int GctMax(int nA, int nB)(
cout«"int GetMax(int nA, int nB)函数被调用! "«endl;
return nA > nB ? nA : nB;}int GetMax(int nArray[], int nSize){
int nMax = nArray[0], nl;
for (nl = 1; nl < nSize; nl++)
{if (nMax < nArrayfnll)nMax = n Array [nl];
}
cout«"int GetMax(int nArray[], int nSize)函数被调用! "«endl;
return nMax;}31、编写程序,从键盘输入学生的数量,根据学生数量为其动态分配内存空间, 并从键盘输入每一名学生的学号、姓名和3科成绩。计算并输出每一名学生的学 号、姓名和总成绩。(提示:定义一个学生结构体)★考核知识点:C廿与C的主要差异-动态内存分配和释放参见讲稿章节:1-13参考答案:
#include <iostream>using namespace std;struct STU(
charsNo[9J; //用于存储学生学号(假设学生学号为位)
char sNameflOl; //用于存储学生姓名
int nScorcl3J; //用于存储学生三门课程的成绩};int main()(
STU *pStu = NULL; //表示指向一-片无效内存
int nStuNum, nl, nJ, nTotal;
coutvv”请输入学生数量:”;
cin»nStuNum;
if (nStuNum <= 0)
{couivv"学生数量必须大于! "vvendl;return 0;
1
pStu = new STU[nStuNum];
if(pStu == NULL)
{cout«M内存分配失败! "vvendl;return 0;
I
for (nl = 0; nl < nStuNum; nl++)
{cout«"iW输入第”《nl+l<v”名学生的学号、姓名和三科成绩:”;cin»pStu[nI|.sNo»pStu[nI].sName;for (nJ = 0; nJ < 3; nJ++){cin»pStulnl].nScorc[nJJ;}
}
for (nl = 0; nl < nStuNum; nl++)
{nTotal = 0;for (nJ = 0; nJ < 3; nJ++){nTotal += pStu[nI].nScore[nJ];cout«"第”<vnl+lvv”名学生的学号、姓名和总成绩为:”;14、有关静态成员的描述错误的是(D )。
A、某个类的静态数据成员由该类的所有对象所共享B、类的公有静态数据成员既可以用类的对象访问,也可以直接用作用域运算符“::”通过类名来访问C、静态数据成员既可以是私有成员,也可以是公有成员D、类中一旦定义了静态数据成员,就必须定义静态成员函数,以便对静态数据 成员进行操作15、如果类A被说明成类B的友元,则(B )。
A、类A的成员函数不得访问类B的所有成员B、类A的成员函数可以访问类B的所有成员C、类A的成员即类B的成员D、类B的成员即类A的成员16、下列关于this指针的说法,正确的是(D )oA、this指针一定指向常量型数据B、this指向的数据不可更改C、静态成员函数中也可以访问this指针D、this指针本身可直接作为成员函数的返回值17、派生类中的成员不能访问基类中的(A )oA、私有成员 B、公有成员 C、保护成员D、以上都可以18、基类的(B )在私有继承时在派生类中为私有成员函数,在公有和保护 继承时在派生类中为保护成员函数。
A、私有成员函数B、保护成员函数C、公有成员D、保护数据成员19、类型兼容是指在基类对象可以出现的地方,都可以使用公有派生类的对象, 己知:
class BaseClass
( //•・・};
class Derive
展开阅读全文