c++总复习试题.docx
《c++总复习试题.docx》由会员分享,可在线阅读,更多相关《c++总复习试题.docx(82页珍藏版)》请在冰豆网上搜索。
c++总复习试题
典型例题
解释程序功能并写出运行结果
1.#include
classs
intx,y;
public:
s(inta,intb){x=a;y=b;}
intgetx(){returnx;}
intgety(){returnx+y;}
};
voidmain()
int(s:
:
*fp)();
fp=s:
:
getx;
ss1(1,2);
intv=(s1.*fp)();
fp=s:
:
gety;
intt=(s1.*fp)();
cout<<"v="<}
(答案:
v=2,t=7)
2.#include
voidmain()
{
inta[]={10,20,30,40},*pa=a;
int*&pb=pa;pb++;
cout<<*pa<}
(答案:
20)
编程序例题
3.写一个程序,输入N个学生数据,包括学号、姓名、成绩,要求只输出成绩在60以下分数段的学生数据。
(答案:
#include
#include
#defineN3
classstud
{
intno;
charname[10];
intdeg;
public:
voidsetdata(intn,charna[],intd)
{
no=n;deg=d;
strcpy(name,na);
}
voiddisp()
{
if(deg<60)
printf("%-5d%-8s%3d\n",no,name,deg);
}};
voidmain()
{
studst[N];
inti,n,d;
charna[10];
for(i=0;iprintf("输入学号姓名成绩:
");
scanf("%d%s%d",&n,&na,&d);
st[i].setdata(n,na,d);
}
printf("输出数据\n");
printf("学号姓名成绩\n");
for(i=0;ist[i].disp();
}
4.有一个向量类Vector,包括一个点的坐标位置x和y,设计两个友元函数,实现两个向量的加法和减法运算。
在主函数中实现向量(10,20)和(30,40)的加减运算。
(答案:
#include
classVector
{
intx,y;
public:
Vector(){}
Vector(inti,intj){x=i;y=j;}
voiddisp()
{
cout<<"("<}
friendVectoradd(Vectorv1,Vectorv2)
{
Vectorv;
v.x=v1.x+v2.x;
v.y=v1.y+v2.y;
returnv;
}
friendVectorsub(Vectorv1,Vectorv2)
{
Vectorv;
v.x=v1.x-v2.x;
v.y=v1.y-v2.y;
returnv;
}};
voidmain()
{
Vectorv1(10,20),v2(30,40),v3;
v3=add(v1,v2);
cout<<"输出结果:
"<cout<<"=";v3.disp();cout<v3=sub(v1,v2);
cout<<"";v1.disp();cout<<"-";v2.disp();
cout<<"=";v3.disp();cout<}
5.对+、-、×、/、++、--、>>、<<的重载。
6.对文件的操作。
复习题
1.下列语句中错误的是(D)
A.int*p=newint(10); B.int*p=newint[10]; C. int*p=newint; D.int*p=newint[40](0)
2.假设已经有定义char*constname=”chen”;下面的语句中正确的是(A)
A.name[3]=’q’; B.name=”lin”; C.name=newchar[5] D.name=newchar(‘q’);
3.下面的类型声明中正确的是(D)
A.int&a[4] B.int&*p; C.int&&q; D.intI,*p=&I;
4.在声明类时,下面的说法正确的是(C)
A.可以在类的声明中给数据成员赋值 B.数据成员的数据类型可以是register
C.private、public、protected可以按任意顺序出现 D.没有用private、public、protected定义的数据成员是公有成员
5.构造函数是在(B)时被执行的。
A.程序编译 B.创建对象 C.创建类 D.程序装入内存
6.在下面有关友元函数的描述中,正确的说法是(A)
A.友元函数是独立于当前类的外部函数 B.一个友元函数不能同时定义为两个类的有友元函数
C.友元函数必须在类的外部定义 D.在外部定义友元函数时,必须加关键字friend
7.使用派生类的主要作用是(A)
A.提高代码的可重用性 B.提高程序的运行效率 C.加强类的封装性 D.实现数据的隐藏
8.关于虚函数,正确的描述是(A)
A.构造函数不能是虚函数B.析构函数不能是虚函数C.虚函数可以是友元函数D.虚函数可以是静态成员函数
9.如果在基类中将成员函数show声明为不带返回值得纯虚函数,正确的写法是(C)
A.virtualshow()=0; B.virtualvoidshow() C.virtualvoidshow()=0; D.voidshow()=0virtual;
10.使用myFile.open(“sales.dat”,ios:
:
app)语句打开文件sales.dat后,则(A)
A.该文件只能用于输出 B.该文件只能用于输入 C.该文件既能用于输出,又能用于输入 D.若该文件存在,则清除该文件的内容
二、分析下列程序中的错误,并说明原因(前2题每题6分,第三题8分,共20分)
1.#include"iostream.h"
classstudent
{
charname[10];
intage;
floataver;
voidprintStu(){}
};
voidmain()
{
studentp1,p2,p3;
p1.age=16;
//…
}
2.#include"iostream.h"
classstack
{
public:
stack(intsz);
private:
char*p;
intsize;
};
stack:
:
stack(intsz)
{
p=newchar[size=sz];
}
voidmain()
{
stackstt;
//...
}
3.#include"iostream.h"
classCTest
{
public:
constinty2;
CTest(inti1,inti2):
y1(i1),y2(i2)
{
y1=10;
x=y1;
}
intreadme()const;
//...
private:
intx;
constinty1;
};
intCTest:
:
readme()const
{
inti;
i=x;
x++;
returnx;
}
voidmain()
{
CTestc(2,8);
inti=c.y2;
i=c.y1;
}
三、写出下列程序的运行结果(前2题每题6分,第三题8分,共20分)
1.#include"iostream.h"
classtoy
{
public:
toy(intq,intp)
{quan=q;price=p;}
intget_quan()
{returnquan;}
intget_price()
{returnprice;}
private:
intquan,price;
};
intmain()
{
toyop[2][2]={toy(10,20),toy(30,48),toy(50,68),toy(70,80)};
inti;
for(i=0;i<2;i++)
{
cout< cout< cout< cout< }
cout<<"\n";
return0;
}
2.#include"iostream.h"
classStock
{
public:
voidprint()
{cout<<"Stockclass.\n";}
};
classDer1_Stock:
publicStock
{
public:
voidprint()
{cout<<"Deri1_Stockclass.\n";}
};
classDer2_Stock:
publicStock
{
public:
voidprint()
{cout<<"Deri2_Stockclass.\n";}
};
voidmain()
{
Stocks1;
Stock*ptr;
Der1_Stockd1;
Der2_Stockd2;
ptr=&s1;
ptr->print();
ptr=&d1;
ptr->print();
ptr=&d2;
ptr->print();
}
3.#include"iostream.h"
classA
{
public:
A(inti):
xi(i){}
A(){xi=0;}
friendAoperator++(Aa);
friendAoperator--(A&a);
voidprint();
private:
intxi;
};
Aoperator++(Aa)
{
++a.xi;
returna;
}
Aoperator--(A&a)
{
--a.xi;
returna;
}
voidA:
:
print()
{cout<voidmain()
{
Ai(7);
++i;
i.print();
--i;
i.print();
}
二 1.答案:
p1.age=16;有错(3分),因为age是私有数据成员,不能直接访问(3分)
2.答案:
stackstt;有错,(3分)类中没有定义无参构造函数(3分)
3.答案:
错误1:
y1=10;有错(2分),y1是常成员,不能修改(1分)
错误2:
x++;有错(2分),readme函数是常成员函数,不能修改对象的数据成员(1分)
错误3:
i=c.y1;有错(1分),y1是私有变量,不能直接存取(1分)
三 1.答案:
10,20;30,48;50,6870,80
2.答案:
Stockclass.
Stockclass.
Stockclass.
3.答案:
7
6
B卷
一、选择题(每题2分,共20分,答案填写在题后的表格内)
1.假设已经有定义constchar*constname=”chen”;下面的语句中正确的是(D)
A.name[3]=’a’; B.name=”lin”; C.name=newchar[5] D.cout<2.假设已经有定义const char*name=”chen”;下面的语句中错误的是(A)
A.name[3]=’q’; B.name=”lin”; C.name=newchar[5] D.name=newchar(‘q’);
3.在下面有关对构造函数的描述中,正确的是(B)
A.构造函数可以带有返回值 B.构造函数的名字与类名完全相同 C.构造函数必须带有参数 D.构造函数必须定义,不能缺省
4.在下面有关析构函数特征的描述中,正确的是(C)
A.一个类可以定义多个析构函数B.析构函数名与类名完全相同C.析构函数不能指定返回类型 D.析构函数可以有一个或多个参数
5.在下面有关静态成员函数的描述中,正确的是(B)
A.在静态成员函数中可以使用this指针 B.在建立对象前,就可以为静态数据成员赋值
C.静态成员函数在类外定义时,要用static前缀 D.静态成员函数只能在类外定义
6.友元的作用之一是(A)
A.提高程序的运行效率 B.加强类的封装性 C.实现数据的隐藏性 D.增加成员函数的种类
7.假设已经定义好了一个类student,现在要定义类derived,它是从student私有派生的,定义类derived的正确写法是(C)
A.classderived:
:
studentprivate B.classderived:
studentpublic
C.classderived:
privatestudent{//… } D.classderived:
:
publicstudent{//… }
8.要实现动态联编,派生类中的虚函数(D)
A.返回的类型可以与虚函数的原型不同B.参数个数可以与虚函数的原型不同C.参数类型可以与虚函数的原型不同D.以上都不对
9.有关运算符重载正确的描述是(D)
A.C++语言允许在重载运算符时改变运算符的操作个数 B.C++语言允许在重载运算符时改变运算符的优先级
C.C++语言允许在重载运算符时改变运算符的结合性 D.C++语言允许在重载运算符时改变运算符的原来的功能
10.假设定义了函数模板:
template
Tmax(Tx,Ty)
{return(x>y)?
x:
y;}
并定义了inti=6;charc=’a’;错误的调用语句是(D)
A.max(i,i) B.max(c,c) C.max((int)c,i) D.max(i,c)
二、分析下列程序中的错误,并说明原因(前2题每题6分,第三题8分,共20分)
1.#include"iostream.h"
classpoint
{public:
intx,y;
private:
point(){x=1;y=2;}};
voidmain()
{pointcpoint;
cpoint.x=2;}
2.#include"iostream.h"
template
classStack
{public:
Stack(intsz)
{v=p=newT[size=sz];}
~Stack()
{delete[]v;}
voidpush(Tx)
{*p++=x;}
Tpop()
{return*--p;}
intlenth()const
{return(p-v);}
private:
T*v,*p;
intsize;};
voidmain()
{Stack obj(5);
obj.push(10);}
3.#include"iostream.h"
classstudent
{intsno;
intage;
voidprintStu();
voidsetSno(intd);};
voidprintStu()
{cout<<”\nStudentNo.is“<voidsetSno(intd)
{sno=d;}
voidsetAge(inta)
{age=a;}
voidmain()
{studentlin;
lin.setSno(20021);
lin.setAge(20);
lin.printStu();}
三、写出下列程序的运行结果(前2题每题6分,第三题8分,共20分)
1.#include"iostream.h"
classb1
{public:
b1(intii)
{i=ii;}
voiddisplay()
{cout<
protected:
inti;};
classb2
{public:
b2(intjj)
{j=jj;}
voiddisplay()
{cout<protected:
intj;};
classb3:
publicb1,publicb2
{public:
b3(intii,intjj,intkk):
b1(ii),b2(jj)
{k=kk;}
voidsetall(intii,intjj,intkk)
{i=ii;j=jj;k=kk;}
voiddisplay()
{cout<
cout< cout<private:
intk;};
voidmain()
{b1o1(40);
o1.display();
b2o2(50);
o2.display();
b3o3(10,20,30);
o3.display();
o3.setall(50,60,70);
o3.display();}
2.#include"iostream.h"
classStock
{public:
virtualvoidprint()
{cout<<"Stockclass.\n";}};
classDer1_Stock:
publicStock
{public:
voidprint()
{cout<<"Deri1_Stockclass.\n";}};
classDer2_Stock:
publicStock
{public:
voidprint()
{cout<<"Deri2_Stockclass.\n";}};
voidmain()
{Stocks1;
Stock*ptr;
Der1_Stockd1;
Der2_Stockd2;
ptr=&s1;
ptr->print();
ptr=&d1;
ptr->print();
ptr=&d2;
ptr->print();}
3.#include
constintsize=10;
template //声明一个类模板
classstack
{public:
voidinit(){tos=0;}
voidpush(Typech); //参数取Type类型
Typepop(); //返回类型取Type类型
private:
Typestck[size]; //数组的类型为类型参数Type,即可取任意类型
inttos;};
template
voidstack:
:
push(Typeob)
{if(tos==size){cout<<"stackisfull";return;}
stck[tos]=ob;tos++;}
template
Typestack:
:
pop()
{if(tos==0)
{cout<<"stackisempty";
return0;}
tos--;
returnstck[tos];}
intmain()
{ //定义字符堆栈
stacks1,s2; //创建两个模板参数为char型的对象
inti;
s1.init(); s2.init();
s1.push('a');s2.push('x');
s1.push('b');s2.push('y');
s1.push('c');s2.push('z');
for(i=0;i<3;i++)cout<<"pops1:
"< for(i=0;i<3;i++)cout<<"pops2:
"< return0;}
二、分析下列程序中的错误,并说明原因(前2题每题6分,第三题8分,共20分)
1.答案:
pointcpoint;是错误的(3分),因为构造函数是私有成员(3分)
2.答案:
Stack obj(5);有错(3分),因为Stack是类模板,应将模板实例化,才可定义对象(3分)
3.答案:
错误1:
printStu、setSno两个成员函数不是公有成员,不允许在类外访问(4分)
错误2:
成员函数在类外定义,应加上类名“student:
:
”(2分)
错