c++考试复习重点.docx
《c++考试复习重点.docx》由会员分享,可在线阅读,更多相关《c++考试复习重点.docx(32页珍藏版)》请在冰豆网上搜索。
c++考试复习重点
计科一班c++复习资料
说明:
这上面的题目全部来自二级C++试卷,且基本涵盖上边所有与我们考试有关的题目。
第一大项:
选择题
(1)基本书本概念题
1.下列关于C++函数的叙述中,正确的是(C)
A)每个函数至少要具有一个参数
B)每个函数都必须返回一个值
C)函数在被调用之前必须先声明
D)函数不能自己调用自己
2.下列关于类和对象的叙述中,错误的是(A)
A)一个类只能有一个对象
B)对象是类的具体实例
C)类是对某一类对象的抽象
D)类和对象的关系是一种数据类型与变量的关系
3)在C++中,用于实现运行时多态性的是D
A)内联函数B)重载函数C)模板函数D)虚函数
4).1在C++中,编译系统自动为一个类生成缺省构造函数的条件是(A)。
A)该类没有定义任何有参构造函数
B)该类没有定义任何无参构造函数
C)该类没有定义任何构造函数
D)该类没有定义任何成员函数
4).2下列关于派生类构造函数和析构函数的说法中,错误的是(D)
A)派生类的构造函数会隐含调用基类的构造函数
B)如果基类中没有缺省构造函数,那么派生类必须定义构造函数
C)在建立派生类对象时,先调用基类的构造函数,再调用派生类的构造函数
D)在销毁派生类对象时,先调用基类的析构函数,再调用派生类的析构函数
运算符的重载(书本p307)
函数重载是对已有的运算符赋予多重含义,使用同一运算符作用于不同类型数据时导致不同的行为。
三个规则
5).1下列关于运算符重载的叙述中,错误的是(B)。
A)有的运算符可以作为非成员函数重载
B)所有的运算符都可以通过重载而被赋予新的含义(规则1中c++中除少数运算符外,全部可以重载)
C)不得为重载的运算符函数的参数设置默认值
D)有的运算符只能作为成员函数重载
5).2下列有关函数重载的叙述中,错误的是(C)
A)函数重载就是用相同的函数名定义多个函数
B)重载函数的参数列表必须不同
C)重载函数的返回值类型必须不同
D)重载函数的参数可以带有默认值
5).3关于函数重载,下列叙述中错误的是(C)
A)重载函数的函数名必须相同
B)重载函数必须在参数个数或类型上有所不同
C)重载函数的返回值类型必须相同
D)重载函数的函数体可以有所不同
5).4下列关于运算符重载的描述中,正确的是(A)(一元就是单目,二元就是双目)
A)运算符重载为成员函数时,若参数表中无参数,重载的是一元运算符
B)一元运算符只能作为成员函数重载(也可以是非成员函数)
C)二元运算符重载为非成员函数时,参数表中有一个参数(必须是两个)
D)C++中可以重载所有的运算符
5).5通过运算符重载,可以改变运算符原有的(A)
A)操作数类型
B)操作数个数
C)优先级
D)结合性
5).6关于运算符重载,下列表述中正确的是(C)
A)C++已有的任何运算符都可以重载
B)运算符函数的返回类型不能声明为基本数据类型
C)在类型转换符函数的定义中不需要声明返回类型
D)可以通过运算符重载来创建C++中原来没有的运算符
5).7下列关于运算符重载的叙述中,正确的是(B)
A)通过运算符重载,可以定义新的运算符
B)有的运算符只能作为成员函数重载
C)若重载运算符+,则相应的运算符函数名是+(+(形参表))
D)重载一个二元运算符时,必须声明两个形参(只有一个形参,左操作数是对象本身的数据,右操作数是形参)
继承与派生
1.派生类应当向基类的构造函数传递参数.
6).1对于通过公有继承定义的派生类,若其成员函数可以直接访问基类的某个成员,说明该基类成员的访问权限是(D)。
A)公有或私有B)私有C)保护或私有D)公有或保护
6).2下列有关类继承的叙述中,错误的是(D)
A)继承可以实现软件复用
B)虚基类可以解决由多继承产生的二义性问题
C)派生类构造函数要负责调用基类的构造函数
D)派生类没有继承基类的私有成员
6).3如果派生类以protected方式继承基类,则原基类的protected成员和public成员在派生类中的访问属性分别是(D)
B)public和protected
C)protected和public
D)protected和protected
6).4派生类的成员函数不能访问基类的(C)
A)公有成员和保护成员
B)公有成员
C)私有成员
D)保护成员
6).5有如下类声明:
classFoo{intbar;}则Foo类的成员bar是(C)(不定义就默认为私有成员)
A}公有数据成员C}私有数据成员
B)公有成员函数D)私有成员函数
7)定义派生类时,若不使用关键字显式地规定采用何种继承方式,则默认方式为(A)。
A)私有继承B)非私有继承C)保护继承D)公有继承
8)建立一个有成员对象的派生类对象时,各构造函数体的执行次序为(C)。
A)派生类、成员对象类、基类
B)成员对象类、基类、派生类
C)基类、成员对象类、派生类
D)基类、派生类、成员对象类
9).1在一个抽象类中,一定包含有(C)。
A)虚函数B)纯虚函数C)模板函数D)重载函数
10)下列有关C++流的叙述中,错误的是(A)
A)C++操作符setw设置的输出宽度永久有效
B)C++操作符endl可以实现输出的回车换行
C)处理文件I/O时,要包含头文件fstream
D)进行输入操作时,eof()函数用于检测是否到达文件尾
10).2如果利用C++流进行输入输出,下面的叙述中正确的是(A)
A)只能借助于流对象进行输入输出
B)只能进行格式化输入输出
C)只能借助于cin和cout进行输入输出
D)只能使用运算符>>和<<进行输入输出
10).3使用输入输出操作符setw,可以控制(B)
A)输出精度
B)输出宽度
C)对齐方式
D)填充字符
10).4下列关于C++流的说明中,正确的是(A)
A)与键盘、屏幕、打印机和通信端口的交互都可以通过流类来实现
B)从流中获取数据的操作称为插入操作,向流中添加数据的操作称为提取操作(读操作叫做提取,写操作叫做插入,选项正好反了。
)
C)cin是一个预定义的输入流类(cin是一个预定义的输入流类istream的对象)
D)输出流有一个名为open的成员函数,其作用是生成一个新的流对象(打开一个文件输入流关联的文件)
10).5对于语句cout<A)"cout"是一个输出流对象
B)"endl"的作用是输出回车换行
C)"x"是一个变量
D)"<<"称作提取运算符(提取运算符是“>>”,插入运算符是“<<”)
虚函数必须是非静态成员函数。
将基类中的同名函数定义位虚函数,这样通过基类型指针就可以使属于不同派生类的不同对象产生不同的行为。
从而实现函数的多态(page316)。
纯虚函数是在基类中声明一个虚函数,基类中没有具体定义,要求各派生类根据实际情况给出具体定义,纯虚函数的声明以“=0;”结束
抽象类:
带有纯虚函数的类。
11)下列有关抽象类和纯虚函数的叙述中,错误的是(D)
A)拥有纯虚函数的类是抽象类,不能用来定义对象
B)抽象类的派生类若不实现纯虚函数,它也是抽象类
C)纯虚函数的声明以“=0;”结束
D)纯虚函数都不能有函数体(纯虚函数的函数体由派生类给出。
)
11).2下列关于虚函数的说明中,正确的是(B)
A)从虚基类继承的函数都是虚函数
B)虚函数不能是静态成员函数
C)只能通过指针或引用调用虚函数
D)抽象类中的成员函数都是虚函数
(12)对于一个类定义,下列叙述中错误的是(B)
A)如果没有定义拷贝构造函数,编译器将生成一个拷贝构造函数
B)如果没有定义缺省的构造函数,编译器将一定生成一个缺省的构造函数(只有没有构造函数的情况下)
D)进行输入操作时,eof()函数用于检测是否到达文件尾
C)如果没有定义构造函数,编译器将生成一个缺省的构造函数和一个拷贝构造函数
D)如果已经定义了构造函数和拷贝构造函数,编译器不会生成任何构造.函数
内联函数不是在调用时发生转移,而是编译时将函数体嵌入每一处调用处。
注意现代的编译器,没有inline也可以是内联函数。
13).1下列有关内联函数的叙述中,正确的是(C)
A)内联函数在调用时发生控制转移
B)内联函数必须通过关键字inline来定义
C)内联函数是通过编译器来实现的
D)内联函数函数体的最后一条语句必须是return语句
13).2下列关于C++函数的说明中,正确的是(C)
A)内联函数就是定义在另一个函数体内部的函数
B)函数体的最后一条语句必须是return语句
C)标准C++要求在调用一个函数之前,必须先声明其原型
D)编译器会根据函数的返回值类型和参数表来区分函数的不同重载形式
标示符:
程序员定义的单词。
C++中的标识符的构成规则如下:
1.以大写字母和小写字母以及下划线开始
2.由大小写母,数字,下划线组成。
3.大小字母表示不同的意义。
4.不能是C++的关键字。
(14)下列符号中可以用作C++标识符的是(A)
A)_radius
B)foo~bar(出现不明符号)
C)else(关键字)
D)3room(不能由数字开始)
14).1下列字符串中,正确的C++标识符是(D)
A)foo-1B)2bC)newD)_256
函数模板
template<模板参数表>
类型名函数名<参数表>
{
函数体的定义
}
所有模板的定义都是用template开始的,模板参数表用逗号相隔的模板参数构成
类模板:
定义一个类的家族,使得一些数据成员,成员函数的参数,返回值,局部变量能取任意类型。
(15)下列关于模板的叙述中,错误的是(C)
A)模板声明中的第一个符号总是关键字template
B)在模板声明中用<和>括起来的部分是模板的形参表
C)类模板不能有数据成员
D)在一定条件下函数模板的实参可以省略
This指针是类自动生成自动影藏的私有成员,它存在于非静态成员函数中,指向被调用的函数所在对象地址。
全局只有一个this指针,当一个对象被创建时,this就指向对象数据的首地址。
(16)下列关于this指针的叙述中,正确的是(D)
A)任何与类相关的函数都有this指针
B)类的成员函数都有this指针
C)类的友元函数都有this指针
D)类的非静态成员函数才有this指针
(2)程序运行结果题
枚举元素常常具有默认值,比如下面这个题目中NAME=0,NUMBER=1,PLUS=5,MINUS=6,PRINT=10.
1已知枚举类型定义语句为:
enumToken{NAME,NUMBER,PLUS=5,MINUS,PRINT=10};
则下列叙述中错误的是(A)
A)枚举常量NAME的值为1
B)枚举常量NUMBER的值为1
C)枚举常量MINUS的值为6
D)枚举常量PRINT的值为10
2执行语句序列
inti=0;while(i<25)i+=3;cout<
A)24
B)25C)27D)28
4有如下程序:
#include
voidfun(int&x,inty){intt=x;x=y;y=t;}
intmain()
{
inta[2]={23,42};
fun(a[1],a[0]);
std:
:
cout<:
endl;
return0;
}
执行后的输出结果是(B)
A)42,42
B)23,23
C)23,42
D)42,23
分析:
a[0]=23,a[1]=42,fun(a[1],a[0]);int&x=42,y=23,交换次序后x=23,y=42,int&x表示按地址出送,只要x的值变化了原来的a[1]也变化。
Intx则指变量本身,局部变量变化不会改变变量的值。
5有如下类声明:
classMyBASE
{
intk;
public:
voidset(intn){k=n;}
intget()const{returnk;}
};
classMyDERIVED:
protectedMyBASE
{
protected:
intj;
public:
voidset(intm,intn){MyBASE:
:
set(m);j=n;}
intget()const{returnMyBASE:
:
get()+j;}};
};
则类MyDERIVED中保护的数据成员和成员函数的个数是(B)
A)4B)3C)2D)1
分析:
MyDERIVED是MyBASE的保护继承,所以两个成员函数都是受保护的。
6.有如下程序:
#include
usingnamespacestd;
intmain()
{
cout.fill('*');
cout.width(6);
cout.fill('#');
cout<<123<return0;
}
执行后的输出结果是(A)
A)###l23
B)123###
C)***123
D)123***
分析:
这是一个关于c++流中使用插入运算符和操纵符的问题。
(page484)。
cout.fill('*’)表示用*填充空白部分,cout.width(6)表示设定六位宽度,对齐方式右对齐。
上面的代码首先是设定*填充空白,然后设定6位长度,再重新设定#填充空白部分,接着输入123,右对齐。
7有如下程序:
#include
usingnamespacestd;
classTest
{
public:
Test(){n+=2;}
~Test(){n-=3;}
staticintgetNum(){returnn;}
private:
staticintn;
};
intTest:
:
n=1;
intmain()
{
Test*p=newTest;
Deletep;
cout<<"n="<:
getNum()<return0;
}
执行后的输出结果是(A)
A)n=0
B)n=l
C)n=2
D)n=3
分析:
Test*p=newTest;
调用构造函数n=3,deletep;调用解析函数n=0;最后输出。
8有如下程序:
#include
usingnamespacestd;
classA{
public:
A(){cout<<"A";}};
classB
{public:
B(){cout<<"B";}}
classC:
publicA
{
Bb;
public:
C(){cout<<"C";}};
Intmain()
{Cobj;return0;}
执行后的输出结果是(D)
A)CBA
B)BAC
C)ACB
D)ABC
9.#include
usingnamespacestd;
intmain()
{
voidfunction(doubleval);
doubleval;
function(val);
cout<return0;}
voidfunction(doubleval){
val=3;}
编译运行这个程序将出现的情况是(D)
A)编译出错,无法运行
B)输出:
3
C)输出:
3.0
D)输出一个不确定的数
10.有如下程序:
#include
usingnamespacestd;
classObj{
staticinti;
public:
Obj(){i++;}
~Obj(){i--;}
staticintgetVal(){returni;}};
intObj:
:
i=0;
voidf()
{Objob2;
cout<}
intmain(){
Objob1;
f();
Obj*ob3=newObj;
cout<getVal();
deleteob3;
cout<:
getVal();
return0;
}
程序的输出结果是(D)
A)232B)231C)222D)221
分析:
voidf(){Objob2;cout<二,填充题
基本概念填空
1.有一种只在循环语句或switch语句中使用的流程控制语句,表示该语句的关键字是__break___。
2.程序中有如下语句
for(inti=0;i<5;i++)cout<<*(p+i)<<",";
能够依次输出int型一维数组DATA的前5个元素。
由此可知,变量p的定义及初始化语句是___int*p=DATA__。
3.若将一个二元运算符重载为类的成员函数,其形参个数应该是____1_____个。
4.C++语言中的多态性分为编译时的多态性和____运行时__的多态性。
5在面向对象的程序设计中,将数据和处理数据的操作封装成一个整体就定义了一种事物的类型,称作“类”。
类
是一种抽象的概念,属于该类的一个实例叫做“_对象
____”。
6指针数组是由____指针或指针变量构成的数组。
7如果使用数组名称为函数参数,形实结合时,传递的是_地址___。
8在类的对象被创建的时候,静态函数会被自动调用。
2,读代码填空或给出运行结果。
1.#include
usingnamespacestd;
classPARENT
{
public:
PARENT(){cout<<"PARENT";}
};
classSON:
publicPARENT
{
public:
SON(){cout<<"SON";}};
intmain(){
SONson;
PARENT*p;p=&son;
return0;
}
运行结果:
PARENTSON,
这里涉及到主函数中定义一个派生类的对象一定是先调用基类的构造函数,然后再调用派生类的构造函数。
下面把代码把上面的代码稍微改一下。
#include
usingnamespacestd;
classPARENT
{
public:
PARENT(){cout<<"PARENT";}
};
classSON:
publicPARENT{
public:
SON(){cout<<"SON";}};
intmain(){
SONson;
PARENTp;
p=son;
return0;
}
运行结果变为PARENTSONPARENT
对比上面的代码说明定义类的指针对象不会调用构造函数。
real+a.real,imag+a.imag
3)已知下列程序的输出结果是42,请将画线处缺失的部分补充完整。
#include
usingnamespacestd;classFoo{
intvalue;public:
Foo():
value(0){}
voidsetValue(intvalue)
{__this->value__=value;
voidprint(){cout<};
intmain(){
Foof;f.setValue(42);f.print();return0;
}
4)以下代码运行结果是9SS9S
#includeusingnamespacestd;classA{
inta;public:
A():
a(9){}
virtualvoidprint()const{cout<classB:
publicA{charb;
public:
B(){b='S';}
voidprint()const{cout<
voidshow(A&x){x.print();}
intmain()
{Ad1,*p;Bd2;
p=&d2;
d1.print();
d2.print();
p->print();
show(d1);
show(d2);
return0;}
6)下面程序的运行结果是AAB
#include
usingnamespacestd;
classCA{
public:
CA(){cout<<'A';}
};
classCB:
privateCA{
public:
CB(){cout<<'B';}
};
intmain(){
CAa;
CBb;(先调用基类在调用派生类)
return0;
}
7)下面的程序的运行结果是11333
#include
usingnamespacestd;
classDA{
intk;
public:
DA(intx=1):
k(x){}
~DA(){cout<};
intmain(){
DAd[]={DA(3),DA(3),DA(3)};
DA*p=newDA[2];
delete[]p;
return0;
}
分析:
自己也有点不清楚,但是调试后我是这样解释这个答案的,析构时输出k,DA*p=newDA[2];拥有两个成员,没有具体说明,所以就是题目默认k=1,所以显示两个1,DAd[]={DA(3),DA(3),DA(3)};然后是一个拥有三个成员的数组,其中k=3,所以显示三个3.
8)如下类定义中包含了构造函数和拷贝构造函数的原型声明,请在横线处填写正确的内容,使拷贝构造函数的声明完整。
classmyClass{private:
intdata;public:
myClass(intvalue);
myClass(const_myClass&anotherObject);
}
复制构造函数的定义形式为类名(类名&对象名)
9)请在如下程序中的空格处填写正确的语句:
#includeusingnamespacestd;classBase{
public:
voidfun(){cout<<"Basefun"<classDerivde:
publicBase{public:
voidfun(){
______Base:
:
fun()_____//调用基类的函数fun()cout<<"Derivedfun"<}
};
10)请将下列栈类Stack补充完整
classStack
{
private:
intpList[100];
inttop;
public:
Stack():
top(0){}
voidPush