CPP复习题答案知识分享.docx
《CPP复习题答案知识分享.docx》由会员分享,可在线阅读,更多相关《CPP复习题答案知识分享.docx(30页珍藏版)》请在冰豆网上搜索。
CPP复习题答案知识分享
CPP复习题答案
选择题
1.C++语言本身没有定义I/O操作,C++标准库iostream提供了基本的I/O类。
I/O操作分别由两个类istream和(C)提供,由它们派生出一个类iostream,提供双向I/O操作。
A.fstreamB.iostreamC.ostreamD.cout
2.引入内联函数的主要目的是(B)。
A. 缩短程序代码,少占用内存空间
B. 既可以保证程序的可读性,又能提高程序的运行效率
C. 占用内存空间少,执行速度快
D. 使程序的结构比较清晰
3.重载函数是(A)
A.以函数参数来区分,而不用函数的返回值来区分不同的函数
B.以函数的返回值来区分,而不用函数参数来区分不同的函数
C.参数表完全相同而返回值类型不同的两个或多个同名函数
D. 参数表和返回值类型都必须是不同的两个或多个同名函数
4.在C++中,数据封装要解决的问题是(D)。
A.数据的规范化B.便于数据转换
C.避免数据丢失D.防止不同模块之间数据的非法访问
5.下列特性中,(B)不是面向对象的程序设计的特征。
A.继承B.内联函数C.多态性D.封装
6.类B的对象必定是类A的对象,但是类A的对象却不属于类B,则类B和类A之间的关系是(C)。
A.组合关系B.间接关系C.继承关系D.直接关系
7.下面对于友元函数描述正确的是(C)。
A.友元函数的实现必须在类的内部定义B.友元函数是类的成员函数
C.友元函数破坏了类的封装性D.友元函数不能访问类的私有成员
8.以下关于析构函数的描述中(C)是错误的。
A.析构函数声明和定义中没有形参B.析构函数可以定义为内联函数。
C.析构函数可以重载D.析构函数可以定义为虚函数。
9.下面叙述错误的是(A)。
A.基类的protected成员在派生类中仍然是protected的
B.基类的protected成员在public派生类中仍然是protected的。
C.基类的protected成员在private派生类中是private的。
D.基类的protected成员不能被派生类的对象访问。
10.如果一个类至少有一个纯虚函数,那么就称该类为(A)。
A.抽象类B.虚基类
C.派生类D.以上都不对
11.当公有继承时,基类的(D)在派生类中成为保护成员,不能通过派生类的对象来直接访问该成员。
A.任何成员B.公有成员和保护成员
C.保护成员和私有成员D.保护成员
12.当私有继承时,基类的(A)在派生类中成为私有成员,不能通过派生类的对象来直接访问该成员。
A.任何成员B.公有成员和保护成员
C.保护成员和私有成员D.私有成员
13.派生类的对象对它的基类成员中(A)是可以采用对象·或者对象指针->的方式访问的。
A.公有继承的公有成员B.公有继承的私有成员
C.公有继承的保护成员D.私有继承的公有成员
14.关于纯虚函数和抽象类的描述中,错误的是(C)。
A.纯虚函数是一种特殊的虚函数,它没有具体的实现。
B.抽象类是指具有纯虚函数的类。
C.一个基类中说明有纯虚函数,该基类的派生类一定不再是抽象类。
D.抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。
15.下列说法错误的是(C)。
A.若语言只支持类而不支持多态,则不能称为面向对象的。
B.在运行时根据其类型确定调用哪个函数的能力叫多态性。
C.静态多态性也是在运行时根据其类型确定调用哪个函数。
D.C++中的静态多态性是通过函数重载进行实现的。
16.(D)不是构造函数的特征
A.构造函数的函数名与类名相同。
B.构造函数可以重载。
C.构造函数可以设置缺省参数。
D.构造函数必须指定类型说明。
17.下列标识符中,A不是C++的关键字;
A.cinB.privateC.thisD.operator
18.下列标识符中,A不是C++的关键字;
A.coutB.virtualC.thisD.template
18.下列标识符中,A不是C++的关键字;
A.coutB.publicC.thisD.sizeof
19.下列标识符中,A不是C++的关键字;
A.coutB.deleteC.thisD.sizeof
20.下列标识符中,A不是C++的关键字;
A.coutB.newC.thisD.void
21.引用是一个变量的别名,下列关于的引用的描述,正确的是(A)。
A.引用的值与被引用变量的值相等,内存地址相同;
B.引用的值与被引用变量的值相等,内存地址不相同;
C.引用的值与被引用变量的值不等,内存地址相同;
D.引用的值与被引用变量的值不等,内存地址不同;
22.公有继承时,子类的访问接口由(D)组成:
A.父类的非私有成员和子类的非私有成员;
B.父类的公有成员和子类的非私有成员;
C.父类的非私有成员和子类的公有成员;
D.父类的公有成员和子类的公有成员;
23.公有继承时,子类对象只可访问父类中的(B)和子类自己的公有成员。
A.非私有成员;B.公有成员;C.私有成员;D.保护成员;
24.公有继承时,子类成员函数不可以直接访问父类中(C)。
A.非私有成员;B.公有成员;C.私有成员;D.保护成员;
25.公有继承时,子类对象和子类成员函数必须通过父类(A)的成员函数访问父类私有成员。
A.非私有;B.非公有;C.静态;D.私有;
26.下列关于虚函数的描述,正确的是(C)。
A.静态成员函数可以是虚函数;
B.构造函数可以是虚函数;
C.析构函数可以是虚函数;
D.内联函数可以是虚函数;
27.下列关于虚函数的描述,正确的是(B)。
A.静态成员函数可以是虚函数;
B.构造函数不可以是虚函数;
C.析构函数不可以是虚函数;
D.内联函数可以是虚函数;
28.下列关于虚函数的描述,错误的是(B)。
A.静态成员函数不可以是虚函数;
B.构造函数可以是虚函数;
C.析构函数可以是虚函数;
D.内联函数不可以是虚函数;
29.下列关于虚函数的描述,错误的是(C)。
A.静态成员函数不可以是虚函数;
B.构造函数不可以是虚函数;
C.析构函数不可以是虚函数;
D.内联函数不可以是虚函数;
注:
静态成员函数不能是虚函数;内联函数不能是虚函数;
构造函数不能是虚函数;析构函数可以是虚函数,且通常声明为虚函数。
填空题
1.在C++程序中,使用基本输入输出流需要包含的头文件是“iostream.h”。
2.具有相同函数名但具有不同参数表的函数称为重载函数。
3.在一个函数的定义或声明前加上关键字inline时,该函数就声明为内联函数。
4.当一个类对象的成员函数被调用时,该成员函数的this指针指向调用它的对象。
5.在撤销类的对象时,C++程序将自动调用该对象的析构函数。
6.对类中的成员函数和属性的访问是通过public、private和
protected这3个关键字来控制的。
7.当用public继承从基类派生一个类时,基类的public成员成为派生类的_public___成员,protected成员成为派生类的__protected_成员。
8.有如下定义语句:
MyClass p[10],*q;则系统自动调用该类构造函数10
次。
当类对象数组p离开它的作用域时,系统自动调用该类析构函数10次。
9.在类定义中,将=0置于虚函数的函数原型的末尾可以将该函数声明为纯虚函数。
10.带有纯虚函数的类称为抽象类,它只能作为其他派生类的基类来使用。
11.假定用户没有给一个名为MyClass的类定义析构函数,则系统为其定义的默认析构函数形式为MyClass:
:
~MyClass(){}。
12.有如下定义语句:
MyClass *p;,则执行 p=new MyClass; 语句时,将自动调用该类的构造函数。
执行delete p;语句时,将自动调用该类的析构函数。
13.有如下对象数组定义语句:
MyClass*p[10];当对象指针数组p离开它的作用域时,系统自动调用该类析构函数0次。
//指针不调用,申请内存时才调用。
14.在结构定义中,数据和成员函数默认权限是公有的。
在类定义中,数据和成员函数默认权限是私有的。
15.C++是混合性程序设计语言,既支持面向过程,又支持面向对象。
16.面向对象程序设计的三大特点:
封装、继承、多态。
17.重载函数调用时,编译器按返回类型、参数类型、参数个数、参数顺序进行匹配,重载函数至少在参数个数、参数类型、或参数顺序上有所不同。
18.函数模板比函数重载的表达更简洁,但只有参数个数相同、函数体相同,仅类型不同的函数才能定义模板。
19.void型指针是通用型指针,任何类型的指针值都可以赋给void类型指针,但使用时必须进行显式转换,否则出错。
20.在程序中使用运算符new申请内存,应该相应地使用运算符delete来释放申请的内存。
22.JAVA是纯面向对象语言,C++是混合性程序设计语言,混合语言的特点是既支持传统的程序设计方法,又支持面向对象程序设计方法。
23.类是数据和代码的复合体。
//数据(成员)和(成员)函数也OK!
24.类可以有多个构造函数,有一个析构函数。
25.若类中一个构造函数都没有,则C++自动提供一个无参数的默认构造函数,负责创建对象。
26.类中const数据成员和引用类型的数据成员必须在该类的对象建立的同时进行初始化,这种初始化只能用成员初始化列表进行。
27.在类中使用static声明的成员称为静态成员。
28.静态成员函数在类中只有语法上的作用,它不是对象的成员,没有this指针,必须将对象作为参数传入,才能在静态成员函数访问该对象的成员。
29.友元函数是对设计类时未定义完整操作集的补充,是类外的函数,它不是对象的成员函数,没有this指针,必须将对象作为参数传入。
30.C程序是由一组函数组成的,C++面向对象程序是由一组类组成的。
31.面向对象的程序设计主要是类的设计,在编译时,一个面向对象的系统由类组成,在运行时,系统由对象组成。
32.单一继承形成一个倒挂的树;多重继承形成一个有向无环图。
33.当类中包含虚拟函数时,C++编译器为类加上一个虚函数指针,该指针指向虚拟函数表。
34.当类中包含虚拟函数时,C++编译器为类加上一个虚函数指针,该指针指向虚拟函数表。
35.包含虚拟函数的类通过vptr指针和虚拟函数表可以在程序运行时依据指针实际指向的对象调用对应的虚拟函数,从而实现多态,达到动态绑定的目的。
36.派生类的对象可以赋给基类的对象;由于基类对象不具有派生类对象所具有的成员,因此基类的对象不可以赋值给派生类对象。
37.运算符重载的实质就是函数重载。
通过运算符重载可以使应用于基本数据类型的运算符作用于用户自定义数据类型。
问答题:
1.面向过程和面向对象在程序组织方式上的差别?
面向过程的核心是功能的分解,最终的程序由过程构成,将数据结构和过程作为两个实体对待,着重点在过程。
缺点就是一旦数据结构需要变更,需修改与之有关的所有模块。
面向对象中数据构成软件分解的基础,而不是功能,数据与定义在在它上面的用户需要构成整体,数据本身不能被外部程序和过程直接存取。
程序一般由类的定义和类的使用两部分组成,在主程序中定义各对象并规定它们之间传递消息的规律。
程序中的一切操作都是通过向对象发送消息来实现,对象接收到消息后,启动有关方法完成操作。
类由继承关系产生相互的联系。
2.C++中采用类的概念将数据以及处理数据的函数封装在一起的好处?
C++采用类(class)的概念将数据以及处理数据的函数封装在一起,将一部分行为作为外部访问的接口与外部发生联系,而将数据和其他行为进行有效隐藏,就可以达到对数据访问权限的合理控制。
通过这种有效隐藏和合理控制,就可以增强数据的安全性,减轻开发软件系统的难度。
3.面向对象程序设计具有哪三大特点及其目的?
封装,继承,多态
封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或对象操作,对不可信的进行信息隐藏。
继承:
可以使用类的现有类的所有功能,并在无需编写原来类的情况下对这些功能进行扩展。
多态:
允许将子类类型的指针赋值给父类类型的指针。
4.C++程序设计语言中this指针的作用?
一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。
this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。
也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。
5.C++程序设计语言中虚函数指针和虚函数表的作用?
C++编译器为每个“内含虚拟函数的类”建立一个虚拟函数表(vtable),表中每一个指针元素指向一个虚拟函数的地址,编译器为类加上一个成员变量vptr,vptr是一个指向虚拟函数表的指针。
每一个派生类的对象,都有一个vptr,对象调用虚拟函数就是通过vptr找到虚拟函数表,再找到虚拟函数的真正地址。
虚拟函数表的内容是依据类中的虚拟函数声明次序一一填入函数指针。
派生类继承基类的虚拟函数表,派生类中改写虚拟函数,虚拟函数表中元素所指的函数地址不再是基类的函数地址,而是派生类的函数地址。
包含虚拟函数的类通过vptr指针和虚拟函数表可以在程序运行时依据指针实际指向的对象调用对应的虚拟函数,从而实现多态(Polymorphism)。
为了达到动态绑定的目的,虚拟函数是了解多态(Polymorphism)以及动态绑定的关键,同时也是了解如何使用MFC的关键。
6.C++程序设计语言是如何实现多态的?
共用同一个函数名,同时有不同数量或者不同类型的参数。
系统会根据参数自动调用对应的函数,这样就实现了多态
7.为什么析构函数通常声明为虚函数,而构造函数不能是虚函数?
因为构造函数不被继承,而虚函数是要在派生类中重定义的。
定义虚析构函数后,由于多态,当使用基类指针指向派生类对象时,会调用派生类的虚构函数,然后派生类的析构函数自动调用基本析构函数。
不是虚的话,直接调用基类的析构函数了。
如果派生类中有用new分配的内存,就无法释放。
8.为什么子类对象可以给父类对象赋值,而父类对象不能给子类对象赋值?
父类定义为抽象接口类,子类继承父类然后重新实现接口。
C++中子类的对象赋值给父类的对象。
如果把子类的对象赋值给父类的对象,只是把子类中的父类子对象赋值给父类的对象,父类的对象无法拥有子类特有的成员。
9.类中的静态成员与类的数据成员有什么区别?
静态数据成员是拥有全局寿命的成员,即在文件的开始到结束期间,内存始终都为其分配存储单元,它可以是局部变量,也可以使全局变量。
非静态数据成员,其寿命局限于其块作用域,从“{”后定义开始到遇到“}”代表其结束,内存自动释放空间。
10.深拷贝和浅拷贝的区别?
当出现类的等号赋值时,会调用拷贝函数在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数——即浅拷贝,它能够完成成员的一一复制。
当数据成员中没有指针时,浅拷贝是可行的。
但当数据成员中有指针时,如果采用简单的浅拷贝,则两类中的两个指针将指向同一个地址,当对象快结束时,会调用两次析构函数,而导致指针悬挂现象。
所以,这时,必须采用深拷贝。
深拷贝与浅拷贝的区别就在于深拷贝会在堆内存中另外申请空间来储存数据,从而也就解决了指针悬挂的问题。
简而言之,当数据成员中有指针时,必须要用深拷贝。
11.指针类型的作用?
子类指针与父类指针强制转换时要注意什么?
因为子类实例在内存排列上,先是把父类的所有内容排在前面,因此父类的指针指过来时,父类的各成员的偏移地址都是不变的.
12.何为抽象类?
抽象类在程序中的作用?
抽象类指的是含有纯虚函数的类,该类不能建立对象,只能声明指针和引用,用于基础类的接口声明和运行时的多态另外,如果抽象类的某个派生类在向继承体系的根回溯过程中,并不是所有的纯虚函数都实现了,该类也是抽象类,同样不能建立对象。
抽象类的主要作用是将有关的组织在一个继承层次结构中,由它来为它们提供一个公共的根,相关的子类是从这个根派生出来的。
13.运算符重载的本质是什么?
有哪两种实现方式?
本质就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。
方式:
1.定义为它将要操作的类的成员函数2.定义为类的友元函数。
14.内联函数的优缺点?
通常在什么情况下使用?
优点是提高运行时间效率,缺点是增加了空间开销
内联函数在C++类中,应用最广的,用来定义存取函数。
我们定义的类中一般会把数据成员定义成私有的或者保护的,这样,外界就不能直接读写我们类成员的数据了。
对于私有或者保护成员的读写就必须使用成员接口函数来进行。
如果我们把这些读写成员函数定义成内联函数的话,将会获得比较好的效率。
读程题
1.在注释符//后面注明变量类型(全局变量、局部变量、静态变量)及输出结果。
#include"iostream.h"
intlength=10;//变量类型:
全局变量
intcountVolumn(intwidth,intheight);
intcountVolumn(intlength,intwidth,intheight);
voidmain()
{cout<<"length="<length=10
intlength,width,height,volumn;//变量类型:
局部变量
length=1;width=1;height=1;
volumn=:
:
length*width*height;
cout<<"体积="<体积=10
volumn=countVolumn(width,height);
cout<<"体积="<体积=10
volumn=length*width*height;
cout<<"体积="<体积=1
volumn=countVolumn(length,width,height);
cout<<"体积="<体积=2
volumn=countVolumn(length,width,height);
cout<<"体积="<体积=3
}
intcountVolumn(intwidth,intheight)
{
returnlength*width*height;
}
intcountVolumn(intlength,intwidth,intheight)
{
staticinttemp=1;//变量类型:
静态变量
temp=temp+length;
returntemp*width*height;
}
2.下列程序给出了基类CFurniture及其派生类CDesk的描述,分析成员函数ShowInfo()和main()中带下划线的代码行正确性,并依据注释行的提示给出结果。
#include"iostream.h"
classCFurniture
{
private:
doubleWeight;
protected:
intMaterial;
public:
intColor;
public:
CFurniture(intc,intm,doublew){Color=c;Material=m;Weight=w;}
~CFurniture(){}
doubleGetWeight(){returnWeight;}
intGetMaterial(){returnMaterial;}
intGetColor(){returnColor;}
};
classCDesk:
publicCFurniture
{
private:
intLength,Width;
public:
intHeight;
public:
CDesk(intH,intL,intW,intc,intm,doublew):
CFurniture(c,m,w)
{Height=H;Length=L;Width=W;}
~CDesk(){}
voidShowInfo();
};
voidCDesk:
:
ShowInfo()//注:
可访问的,不需要修改。
{//判断该成员函数中能否访问下列数据,如不可访问,改为可访问
cout<可访问修改:
cout<可访问修改:
cout<可访问修改:
cout<可访问修改:
cout<可访问修改:
cout<不可访问修改:
cout<}
voidmain()
{//判断带下划线代码行的正确性,如正确,写出结果;如不正确,写出原因
CDeskmDesk(1,2,3,4,5,100);
cout<错原因或结果子类对象不可直接访问类的私有成员
cout<错原因或结果子类对象不可直接访问类的私有成员
cout<正确原因或结果1
cout<正确原因或结果4
cout<错原因或结果子类对象不可直接访问父类的保护成员
cout<错原因或结果子类对象不可直接访问父类