c练习题带答案.docx
《c练习题带答案.docx》由会员分享,可在线阅读,更多相关《c练习题带答案.docx(32页珍藏版)》请在冰豆网上搜索。
c练习题带答案
一、选择题
1.下面选项中不属于面向对象程序设计特征的是(C)。
A)继承性B)多态性C)相似性D)封装性
2.下列情况中,哪一种情况不会调用拷贝构造函数(B)
A)用派生类的对象去初始化基类对象时
B)将类的一个对象赋值给该类的另一个对象时
C)函数的形参是类的对象,调用函数进行形参和实参结合时
D)函数的返回值是类的对象,函数执行返回调用者时
3.下列有关继承和派生的叙述中,正确的是(C)
A)派生类不能访问通过私有继承的基类的保护成员
B)多继承的虚基类不能够实例化
C)如果基类没有默认构造函数,派生类就应当声明带形参的构造函数
D)基类的析构函数和虚函数都不能够被继承,需要在派生类中重新实现
4.实现运行时多态的机制是(A)
A)虚函数B)重载函数C)静态函数D)模版函数
5.下列关于this指针的说法正确的是(B)
A)this指针存在于每个函数之中
B)在类的非静态函数中this指针指向调用该函数的对象
C)this指针是指向虚函数表的指针
D)this指针是指向类的函数成员的指针
6.在下列关于C++函数的叙述中,正确的是(C)
A)每个函数至少要有一个参数B)每个函数都必须返回一个值
C)函数在被调用之前必须先声明D)函数不能自己调用自己
7.下列运算符中,不能重载的是(C)
A)&&B)!
=C).D)->
8.以下各选项组中,均是C++语言关键字的组是(A)
A.publicoperatorthis
B.shodstringstatic
C.itwhile>=
D.privatecoutprintf
9.下面程序的输出结果是(B)
#include
usingnamespacestd;
inti=0;
intfun(intn)
{
staticinta=2;
a++;
returna+n;
}
voidmain()
{
intk=5;
{
inti=2;
k+=fun(i);
}
k+=fun(i);
cout<}
A)13B)14C)15D)16
10.下面的程序段的运行结果为(D)
charstr[]="job",*p=str;
cout<<*(p+2)<A)98B)无输出结果C)字符’b’的地址D)字符’b’
11.下面程序的输出结果是(C)
#include
usingnamespacestd;
classA
{
public:
A(inti){x=i;}
voiddispa(){cout<private:
intx;
};
classB:
publicA
{
public:
B(inti):
A(i+10){x=i;}
voiddispb(){dispa();cout<private:
intx;
};
voidmain()
{
Bb
(2);
b.dispb();
}
A)10,2B)12,10C)12,2D)2,2
12.下面程序的输出结果是(C)
#include
usingnamespacestd;
classBase
{
public:
Base(inti){cout<
~Base(){}
};
classBase1:
virtualpublicBase
{
public:
Base1(inti,intj=0):
Base(j){cout<
~Base1(){}
};
classBase2:
virtualpublicBase
{
public:
Base2(inti,intj=0):
Base(j){cout<
~Base2(){}
};
classDerived:
publicBase2,publicBase1
{
public:
Derived(inta,intb,intc,intd):
mem1(a),mem2(b),Base1(c),
Base2(d),Base(a)
{cout<
private:
Base2mem2;
Base1mem1;
};
voidmain(){DerivedobjD(1,2,3,4);}
A)134122B)123412C)14302012D)143212
13.下面程序的输出结果是(C)
#include
usingnamespacestd;
classBase
{
public:
virtualvoidf(){cout<<“f0+”;}
voidg(){cout<<“g0+”;}
};
classDerived:
publicBase
{
public:
voidf(){cout<<“f+”;}
voidg(){cout<<“g+”;}
};
voidmain(){Derivedd;Base*p=&d;p->f();p->g();}
A)f+g+B)f0+g+C)f+g0+D)f0+g0+
14.下面程序的输出结果是(C)
#include
usingnamespacestd;
classSample
{
friendlongfun(Samples)
{
if(s.x<2)return1;
returns.x*fun(Sample(s.x-1));
}
public:
Sample(longa){x=a;}
private:
longx;
};
voidmain()
{
intsum=0;
for(inti=0;i<4;i++)
{
sum+=fun(Sample(i));
}
cout<}A)12B)16C)10D)34
15.以下程序的输出结果是:
(D)
#include
usingnamespacestd;
intfun(char*s)
{char*p=s;
while(*p!
='\0')p++;
return(p-s);
}
voidmain(){
cout<}
A.0B.1C.2D.3
16.有如下程序段:
inti=1;
while
(1)
{
i++;
if(i==10)break;
if(i%2==0)cout<<’*’;
}
执行这个程序段输出字符*的个数是(C)
A.10B.3C.4D.5
17.下列关于虚基类的描述中,错误的是(C)
A.使用虚基类可以消除由多继承产生的二义性
B.构造派生类对象时,虚基类的构造函数只被调用一次
C.声明classB:
virtualpublicA说明类B为虚基类
D.建立派生类对象时,首先调用虚基类的构造函数
18.有下类定义
ClassA{
Char*a;
Public:
A():
a(0){}
A(char*aa){//把aa所指字符串拷贝到a所指向的存储空间
A=___________________;
Strcpy(a,aa);
~A(){delete[]a;}
};
正确的选择是(A)
A.newchar[strlen(aa)+1]B.char[strlen(aa)+1]
C.char[strlen(aa)]D.newchar[sizeof(aa)-1]
19.假定AA为一个类,a为该类私有的数据成员,GetValue()为该类公有函数成员,它返回a的值,x为该类的一个对象,则访问x对象中数据成员a的格式为(X)。
A)x.aB)x.a()C)x->GetValue()D)x.GetValue()
20.假定AA为一个类,inta()为该类的一个成员函数,若该成员函数在类定义体外定义,则函数头为(A)。
A)intAA:
:
a()B)intAA:
a()
C)AA:
:
a()D)AA:
:
inta()
21.有如下程序:
#include
usingnamespacestd;
classTest{
public:
Test(){}
~Test(){cout<<'#';}
};
intmain(){
Testtemp[2],*pTemp[2];
return0;
}
执行这个程序输出星号(#)的个数为(B)。
A)1B)2C)3D)4
22.有如下程序:
#include
usingnamespacestd;
classMyClass{
public:
MyClass(inti=0){cout<<1;}
MyClass(constMyClass&x){cout<<2;}
MyClass&operator=(constMyClass&x){cout<<3;return*this;}
~MyClass(){cout<<4;}
};
intmain(){
MyClassobj1
(1),obj2
(2),obj3(obj1);
obj1=obj2;
return0;
}运行时的输出结果是(A)。
A)1123444B)11114444C)121444D)11314444
23.有如下程序:
#include
usingnamespacestd;
classpoint
{
public:
staticintnumber;
public:
point(){number++;}
~point(){number--;}
};
intpoint:
:
number=0;
voidmain()
{point*ptr;
pointA,B;
{
point*ptr_point=newpoint[3];
ptr=ptr_point;
}
pointC;
delete[]ptr;
cout<:
number;
}
程序结果为(A)
A)3B)4C)6D)7
24.友元运算符obj++被C++编译器解释为(D)。
A.operator++(obj)B.operator++(obj,0)
B.obj.operator++()D.obj.operator++(0)
25.下面有关重载函数的说法中正确的是(C)
A.重载函数必须具有不同的返回值类型;
B.重载函数形参个数必须不同;
C.重载函数必须有不同的形参列表
D.重载函数名可以不同;
26.如果友元函数重载一个运算符时,其参数表中没有任何参数则说明该运算符是(D)
A.一元运算符B.二元运算符
C.选项A.和选项B.都可能D.重载错误
27.在重载一个运算符时,如果其参数表中有一个参数,则说明该运算符是(D)。
A)一元成员运算符B)二元成员运算符
C)一元友元运算符D)选项B)和选项C)都可能
28.下列说法正确的是(B)
A.内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方
B.内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方
C.类的内联函数必须在类体内定义
D.类的内联函数必须在类体外通过加关键字inline定义
29.下列关于构造函数的描述中,错误的是(D)
A.构造函数可以设置默认参数; B.构造函数在定义类对象时自动执行
C.构造函数可以是内联函数; D.构造函数不可以重载30.下面对静态数据成员的描述中,正确的是(A)
A.静态数据成员是类的所有对象共享的数据
B.类的每个对象都有自己的静态数据成员
C.类的不同对象有不同的静态数据成员值
D.静态数据成员不能通过类的对象调用
31.对类成员访问权限的控制,是通过设置成员的访问控制属性实现的,下列不是访问控制属性的是(D)
A.公有类型B.私有类型C.保护类型 D.友元类型
32.下面关于虚函数的描述,错误的是(D)
A.在成员函数声明的前面加上virtual修饰,就可把该函数声明为虚函数
B.基类中说明了虚函数后,派生类中对应的函数也必须说明为虚函数
C.虚函数可以是另一个类的友元函数,但不能是静态成员函数
D.基类中说明的纯虚函数在其任何派生类中都必须实现
33.下列描述中正确的说法是(C)。
A.私有派生的子类无法访问父类的成员
B.类A的私有派生子类的派生类C无法初始化其祖先类A对象的属性,因为类A的成员对类C是不可访问的
C.私有派生类不能作为基类派生子类
D.私有派生类的所有子孙类将无法继续继承该类的成员
34.在公有派生情况下,有关派生类对象和基类对象的关系,下列叙述不正确的是(C)
A.派生类的对象可以赋给基类的对象
B.派生类的对象可以初始化基类的引用
C.派生类的对象可以直接访问基类中的成员
D.派生类的对象的地址可以赋给指向基类的指针
35.在类的定义中,用于为对象分配内存空间,对类的数据成员进行初始化并执行其他内部管理操作的函数是(C)
A.友元函数 B.虚函数 C.构造函数 D.析构函数
36.关于new运算符的下列描述中,(D)是错误的.。
A)它可以用来动态创建对象和对象数组
B)使用它创建对象或对象数组,可以使用运算符DELETE删除
C)使用它创建对象时要调用构造函数
D)使用它调用对象数组时不许指定初始值
37.如果类A被说明成类B的友元,则(D)。
A)类A的成员即是类B的成员B)类B的成员即是类A的成员
C)类A的成员函数不得访问类B的成员D)类B不一定是类A的友元
二、程序填空
1.用递归法求从1到n的立方和:
f
(1)=1(n=1)
f(n)=f(n-1)+n3(n>1)
#include
usingnamespacestd;
intf(int);
intmain(){
intn,s;
cout<<"inputthenumbern:
";
cin>>n;
s=f(n);
cout<<"Theresultis"<
return0;
}
intf(intn){//递归法求立方和函数
if(n==1)return1;
elsereturn(f(n-1)+n*n*n);
}
3.请将下列程序补充完整,使得输出结果为“DestructorDerivedDestructorBase”。
#include
usingnamespacestd;
classBase
{
public:
virtual~Base(){cout<<“DestructorBase”<};
classDerived:
publicBase
{
public:
~Derived(){cout<<“DestructorDerived”<};
voidmain()
{
Base*pBase=newDerived;
deletepBase;
}
三、阅读程序,写出运行结果
1.
#include
#include
usingnamespacestd;
classCD
{
charname[20];
intnumber;
public:
voidInit(char*aa,intbb)
{
strcpy(name,aa);
number=bb;
}
char*Getname(){returnname;}
intGetnumber(){returnnumber;}
voidOutput(){cout<};
CDdx;
voidmain()
{
CDdy;
dx.Init("最炫民族风",30);
dy.Init("问",3*dx.Getnumber()+5);
dx.Output();
dy.Output();
}
2.#include
usingnamespacestd;
intf(inta){
return++a;
}
intg(int&a){
return++a;
}
voidmain(){
intm=0,n=0;
m+=f(g(m));
n+=f(f(n));
cout<<"m="<cout<<"n="<}
3.#include
usingnamespacestd;
classDemo
{
public:
Demo(){cout<<"defaultconstructor\n";}
Demo(constDemo&x){cout<<"copyconstructor\n";}
};
DemouserCode(Demob){Democ(b);returnc;}
voidmain()
{
Demoa,d;
cout<<"callinguserCode()\n";
d=userCode(a);
}
执行上面的程序的过程中,构造函数Demo()和Demo(constDemo&x)被调用的次数分别是多少次?
写出输出结果
。
异常处理习题
一、选择题
l下列关于异常的叙述错误的是(A)。
A.编译错属于异常,可以抛出
B.运行错属于异常
C.硬件故障也可当异常抛出
D.只要是编程者认为是异常的都可当异常抛出
2下列叙述错误的是(B)。
A.当catch语句捕获一个异常后,可能不能完全处理异常
B.在try块中抛出异常后,程序最后回到try块中继续执行后面的语句
C.一个程序中可以有try语句而没有throw语句
D.throw语句抛出的异常可以不被捕获
3关于函数声明floatfun(inta,intb)throw()下列叙述正确的是(C)。
//题目有错,改成throw()
A.表明函数抛出float类型异常
B.表明函数抛出任何类型异常
C.表明函数不抛出任何类型异常
D.表明函数实际抛出的异常
4下列叙述错误的是(C)。
A.catch(…)语句可捕获所有类型的异常
B.一个try语句可以有多个catch语句
C.catch(…)语句可以放在catch语句组的中间
D.程序中try语句与catch语句是一个整体,缺一不可
5、下列程序运行结果为(A)。
#include
usingnamespacestd;
classS{
public:
~S(){cout<<”S”<<”\t”;}
};
charfun0(){
Ss1;
throw(‘T’);//直接抛出异常后寻找catch,后面的return语句不会执行
return‘O’;
}
voidmain(){
try{
cout<catch(charc){
cout<}
A.STB.OSTC.OTD.T
二、写出程序运行结果
1、#include
usingnamespacestd;
voidf()
{
cout<<"f()begin"<try
{throw"a";}
catch(char*)
{cout<<"exception”<throw"exception";
cout<<"f()end”<}
voidmain()
{cout<<"mainbegin”<try{f();}
catch(char*str)
{cout<cout<<"mainend”<}
程序运行结果:
mainbegin
f()begin
exception
exception
mainend
一、选择题
1、假定A为一个类,则执行“Aa[50];”语句时,自动调用该类构造函数的次数为 (C)。
A.1 B.2 C.50 D.0
2、下列运算符中,(C )运算符不能重载
A.&& B.[] C. ?
:
D.=
3、关于动态绑定的下列描述中,(D )是错误的
A.动态绑定是以虚函数为基础的
B.动态绑定是在运行时确定所调用的函数代码的
C.动态绑定调用函数的操作是指向对象的指针或对象引用
D.动态绑定是在编译时确定操作函数的
4、下列各类函数中,(C)不是类的成员函数
A.类型传换函数B.析构函数
C.友元函数 D.拷贝构造函数
5、分析程序
classA{
public;
A(){};
};
classB:
publicA{
public:
B(){};
};
intmain()
{
Bb;
return0;
}
构造函数的执行顺序为:
(B)
A.B(),A()B.A(),B()C.B()D.A()
6、可以在类外访问的成员属性是(A)。
A.publicB.public和protectedC.protectedD.private
7、主函数内,对x访问错误的是(A