完整版C++试题及答案.docx
《完整版C++试题及答案.docx》由会员分享,可在线阅读,更多相关《完整版C++试题及答案.docx(17页珍藏版)》请在冰豆网上搜索。
完整版C++试题及答案
C++考试试卷
得分
一、单项选择(每空1分,共20分)
(注意选项填写到下面表格中!
)
1
2
3
4
5
6
7
8
9
10
c
b
d
c
b
11
12
13
14
15
16
17
18
19
20
1.已知:
char*s="123456";则cout<
A)123456 B)3 C)3456 D)2
2.已知:
char*s="abcde";则sizeof(s)、sizeof(*s)、strlen(s)的值依次为( )。
A)615 B)415 C)654 D)445
3.下列语句中正确的是( )。
A)char*s;*s="abcdefg";
B)char*s;cin>>s;
C)char*s1="abcd",*s2="efghijk";strcpy(s1,s2);
D)char*s="abcdefg";cout<<*s;
4. C++中,关于构造函数和析构函数,正确的描述是( )。
A)在定义类时,必须自定义构造函数和析构函数,在创建对象时自动调用构造函数,在释放对象时自动调用析构函数
B)构造函数和析构函数均可以重载
C)已知类Student以及Student*p;在使用p=newStudent;时自动调用无参构造函数创建动态对象,在deleltep;时自动调用析构函数释放动态对象
D)构造函数和析构函数都可以成为虚函数
5.关于拷贝构造函数的描述正确的是( )。
A)通常的拷贝构造函数的参数是对象的指针类型
B)如果不自定义拷贝构造函数,系统提供默认的拷贝构造函数
C)如果有自定义的构造函数,系统就不再提供拷贝构造函数
D)如果需要用已有对象为新创建的对象初始化时,就必须自定义拷贝构造函数
6.有关静态成员的描述错误的是( )。
A)某个类的静态数据成员由该类的所有对象所共享
B)类的公有静态数据成员既可以用类的对象访问,也可以直接用作用域运算符“:
:
”通过类名来访问
C)静态数据成员既可以是私有成员,也可以是公有成员
D)类中一旦定义了静态数据成员,就必须定义静态成员函数,以便对静态数据成员进行操作
7.一个类的友元函数或友元类能够通过成员访问运算符访问该类的( )。
A)所有成员 B)私有成员 C)保护成员 D)公有成员
8.下面关于继承方式的描述中错误的是( )。
A)公有继承时,基类的公有成员和保护成员在派生类中都成为公有成员
B)私有继承时,基类的公有成员和保护成员在派生类中都成为私有成员
C)保护继承时,基类的公有成员和保护成员在派生类中都成为保护成员
D)无论哪种继承方式,基类中的私有成员在派生类中都无法直接访问
9.类型兼容是指在基类对象可以出现的地方,都可以使用公有派生类的对象,已知:
classBaseClass
{ //…};
classDerivedClass:
publicBaseClass
{ //…};
BaseClassb,*pb;
DerivedClassd,*pd;
下面不属于类型兼容的是( )。
A)b=d;
B)BaseClass&bb=d;
C)pd=&b;
D)pb=&d;
10.在派生类中重新定义虚函数时,除了( ),其他方面都必须与基类中相应的虚函数保持一致。
A)参数个数 B)参数类型 C)函数名称 D)函数体
11.下列运算符中,必须使用成员函数进行重载的是( )。
A)== B)= C)>> D)++
12.下列关于运算符重载的描述中,错误的是( )。
A)运算符重载不可以改变优先级
B)运算符重载不可以改变结合性
C)运算符重载不可以改变运算符的操作数个数
D)加法运算符“+”和赋值运算符“=”都重载之后,意味着“+=”也被重载了
13.有关运算符重载的说法错误的是( )。
A)在一个类中,可以对一个操作符进行多次重载
B)重载赋值运算符“=”时,为了保持原有特性,重载运算符函数中应该使用返回语句“return*this;”
C)C++中所有的运算符都可以被重载
D)如果在某个类中使用成员函数对运算符重载,其左操作数必须是该类的对象
14.已知某个类的友元函数重载了+=和-,a,b,c是该类的对象,则“a+=b-c”被C++编译器解释为( )。
A)operator+=(a,operator-(b,c))
B)a.operator+=(b.operator-(c))
C)operator+=(a,b.operator-(c))
D)a.operator+=(operator-(b,c))
15.下面4个选项中,专门用于读取单个字符的是( )。
A)cin.read() B)cin.get() C)cin.put() D)cin.getline()
16.下列关于getline()函数的叙述中,错误的是( )。
A)getline()函数仅用于从键盘而不能从文件读取字符串
B)getline()函数读取字符串长度是受限制的
C)getline()函数读取字符串时,遇到终止符就停止
D)getline()函数中所使用的终止符默认是换行符,也可指定其他终止符
17.打开文件的方式中,( )以追加方式打开文件。
A)ios:
:
in B)ios:
:
out C)ios:
:
app D)ios:
:
trunc
18.当使用ofstream流类定义一个流对象并打开一个磁盘文件时,文件的隐含打开方式为( )。
A)ios:
:
out|ios:
:
binary
B)ios:
:
in|ios:
:
binary
C)ios:
:
out
D)ios:
:
in
19.有关函数模板和模板函数说法错误的是( )。
A)函数模板只是对函数的描述,编译器不为其产生任何执行代码,所以它不是一个实实在在的函数
B)模板函数是实实在在的函数,它由编译系统在遇到具体函数调用时所生成,并调用执行
C)函数模板需要实例化为模板函数后才能执行
D)当函数模板和一般函数同名时,系统先去匹配函数模板,将其实例化后进行调用
20.一个( )允许用户为类定义一种模式,使得类中的某些数据成员及某些成员函数的返回值能取任意类型。
A)类模板 B)模板类 C)函数模板 D)模板函数
得分
二、判断题(每空1分,共20分)
注意:
请将判断题结果(正确为T,错误为F)
填写到下面表格中!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1.类定义中的成员默认的访问权限是private。
2.一个类中的保护成员和公有成员类似,在程序的任何地方都可以被访问。
3.系统提供的缺省构造函数没有参数,所以自定义构造函数必须带有参数。
4.一旦自定义了构造函数,系统便不再提供缺省的构造函数。
5.一个类只能有一个构造函数和一个析构函数。
6.静态数据成员必须在类中进行定义和初始化。
7.静态成员函数中不能访问非静态成员。
8.重载插入运算符“<<”必须采用成员重载。
9.如果类A是类B的友类,那么类A中的所有成员函数都可以访问类B中的所有成员。
10.释放派生类的对象时,首先调用基类的析构函数,然后调用派生类的析构函数。
11.拥有纯虚函数的类称为虚拟基类,它不能用来定义对象。
12.虚函数只有在有继承的情况时才会存在。
13.已知:
classBase1{//…};
classBase2{//…};
classDerived:
publicBase1,publicBase2
{ Derived():
Base2(),Base1(){}
//…
};
创建Derived类的对象时,先调用Base2的构造函数,然后调用Base1的构造函数,最后调用Derived的构造函数。
14.基类的指针或引用调用虚函数时采用后期绑定。
15.由抽象基类继承得到的派生类肯定是具体类。
16.友元函数内能够访问任何对象的任何成员。
17.对二元运算符采用成员函数重载时,只需要一个参数,而且该参数可以是内部类型。
18.对一元运算符采用某个类的友元函数重载时需要一个参数,参数为该类的对象,不能是其他类型。
19.C++的输入/输出流库中,ios类是一个虚基类,istream类、ostream类以及streambuf类都是ios类的派生类。
20.设inf是一个ifstream类的流对象,则inf.seekg(10,ios:
:
beg);表示将文件指针从文件当前位置向后移动10个字节。
得分
三、读程序写结果(每空2分,共32分)
(注意将结果写在下面相应横线上!
)
⑴ ⑵ ⑶ ⑷
⑸ ⑹ ⑺ ⑻
⑼ ⑽ ⑾_ ⑿
⒀ ⒁ ⒂ ⒃
1.写出下面程序的运行结果。
#include
classA
{public:
A()
{ cout<<"A:
:
A()called.\n"; }
virtual~A()
{ cout<<"A:
:
~A()called.\n"; }
};
classB:
publicA
{ public:
B(inti)
{ cout<<"B:
:
B()called.\n";
buffer=newchar[i]; }
virtual~B()
{ delete[]buffer;
cout<<"B:
:
~B()called.\n"; }
private:
char*buffer;
};
voidfun(A*a)
{ deletea; }
voidmain()
{ A*b=newB(10);
fun(b);
}
运行结果:
⑴
⑵
⑶
⑷
2.写出下面程序的运行结果。
#include
classShape
{
public:
voidDraw()
{
cout<<"Shape"< }
virtualvoidPrint()=0;
};
classCircle:
publicShape
{
private:
doubler;
public:
voidDraw()
{
cout<<"Circle"< }
voidSetData(doubleradius)
{
r=radius;
}
voidPrint()
{
cout<<"area:
"<<3.14*r*r< }
};
classRectangle:
publicShape
{
private:
doublea,b;
public:
voidDraw()
{
cout<<"Rectangle"< }
voidSetData(doublex,doubley)
{
a=x,b=y;
}
voidPrint()
{
cout<<"area:
"< }
};
voidmain()
{
Circlec;
Rectangler;
Shape*sp1=&c;
Shape&sp2=r;
c.SetData(10);
r.SetData(3,5);
sp1->Draw();
c.Print();
sp2.Draw();
r.Print();
}
运行结果:
⑸
⑹
⑺
⑻
3.写出下面程序的运行结果(注:
运行结果中首行的空白行不考虑)。
#include
classCArray
{public:
CArray(inti)
{ Length=i;
Buffer=newchar[Length+1]; }
~CArray()
{ delete[]Buffer; }
intGetLength()
{ returnLength; }
char&operator[](inti);
private:
intLength;
char*Buffer;
};
char&CArray:
:
operator[](inti)
{ staticcharch;
if(i=0)
returnBuffer[i];
else
{ cout<<"\nIndexoutofrange.";
returnch; }
}
voidmain()
{ intcnt;
CArraystring1(6);
char*string2="Nankai";
for(cnt=0;cnt<8;cnt++)
string1[cnt]=string2[cnt];
cout< for(cnt=0;cnt<8;cnt++)
cout< cout<<"\n";
cout<}
运行结果:
⑼
⑽
⑾
⑿
⒀
⒁
4.写出下面程序的运行结果。
#include
voidfun(char*s)
{
intn=0;
while(s[n]!
='\0')
n++;
chart,*p=s+n-1;
while(s
{
t=*s;
*s=*p;
*p=t;
s++;
p--;
}
}
voidmain()
{
charstr[]="abcdefg";
fun(str);
cout< fun(str+1);
cout<}
运行结果:
⒂
⒃
得分
四、程序填空(每空2分,共28分)
(注意将结果写在下面相应横线上!
)
⑴ ⑵ ⑶
⑷ ⑸
⑹ ⑺ ⑻
⑼ ⑽ ⑾
⑿ ⒀ ⒁
1.下面的程序是一个类模板,可实现求三个变量的和,请将程序补充完整。
#include
⑴
classff
{ Typea1,a2,a3;
public:
⑵
{ a1=b1;a2=b2;a3=b3; }
⑶
{ returna1+a2+a3; }
};
voidmain()
{ ffx(12,13,14),y(16,17,18);
cout<}
2.下面的程序将一个普通函数作为类的友元函数,求坐标点之和,并且程序输出结果为2,2,4,请将程序补充完整。
#include
classPoint
{
intX,Y;
public:
⑷
{ X=x;Y=y;Countp++; }
Point(Point&p)
{ X=p.X;Y=p.Y;Countp++;}
~Point()
{Countp--; }
⑸
staticintCountp;
voiddisplay(){cout<};
Pointmyfun(Pointp1,Pointp2,Pointp3)
{ Pointtmp(p1.X+p2.X+p3.X,p1.Y+p2.Y+p3.Y);
⑹
}
⑺
voidmain()
{ Pointpp0,pp1(1,2),pp2
(1);
Pointp=myfun(pp0,pp1,pp2);
p.display();
cout<< ⑻ <}
3.下面的程序将一个已有文件的内容复制到另一个文件中。
请将程序补充完整。
#include
#include
#include
voidmain()
{ ⑼
infile.open("d:
\\file1.txt",ios:
:
in);
if(!
infile)
{ cout<<"file1.txtcan'topen.\n";
abort(); }
outfile.open("d:
\\file2.txt",ios:
:
out);
if(!
outfile)
{ cout<<"file2.txtcan'topen.\n";
abort(); }
charstr[80]="\0";
while(!
infile.eof())
{ infile.read(str,sizeof(str));
⑽
cout< }
cout< infile.close();
⑾
}
4.ARRAY类的定义如下,构造函数把参数n的值赋给s,给v动态分配长度为n的数组空间,然后利用数组参数a初始化v所指向的数组。
请将类定义补充完整。
classARRAY
{ int*v;
ints;
public:
ARRAY(inta[],intn);
~ARRAY()
{ delete[]v; }