一、概念题
1.类和对象有什么区别和联系?
类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的操作封装在一起的集合体。类是对某一类对象的抽象,而对象是某一种类的实例。 2.什么是类的实现?
将类所有未编写函数体的成员函数在类体外全部编写出来。 3.this指针的概念是什么?
类中所有的成员函数(静态成员函数除外)都隐含了第一个参数,这个隐含的第一个参数就是this指针,在成员函数的实现代码中,所有涉及对类的数据成员的操作都隐含为对this指针所指对象的操作。
4.为什么要引入构造函数和析构函数?
构造函数的作用是为类对象的数据成员赋初值,构造函数在定义类对象时由系统自动调用;在一个对象死亡或者说退出生存期时,系统会自动调用析构函数,因此可以在析构函数定义中,设置语句释放该对象所占用的一些资源。
5.什么时候需要自定义拷贝构造函数?若程序员没有定义拷贝构造函数,则编译器自动生成一个缺省的拷贝构造函数,它可能会产生什么问题?
当有用一个已经存在对象创建一个同类型的新对象的需求时。当对象含有指针数据成员,并用它初始化同类型的另一个对象时,默认的拷贝构造函数只能将该对象的数据成员复制给另一个对象,而不能将该对象中指针所指向的内存单元也复制过去。这样,就可能出现同一内存单元释放两次,导致程序运行出错。
6.什么是堆对象?创建和回收堆对象的方法是什么?
堆区用来存放在程序运行期间,根据需要随时建立的变量(对象),建立在堆区的对象称为堆对象,当堆对象不再使用时,应予以删除,回收所占用的动态内存。创建和回收堆对象的方法是使用new和delete运算符。
7.为什么需要静态数据成员?静态数据成员的定义和初始化方法是什么?
定义静态数据成员是为了同一个类的不同对象之间共享公共数据成员;用关键字static可以把数据成员定义成静态数据成员;在定义的类被使用前,要对其中的静态数据成员进行初始化,初始化时不必添加关键字static。
8.什么是静态成员函数?静态成员函数和非静态成员函数有什么区别? 用关键字static可以把这成员函数定义成静态成员函数。
⑴ 静态成员函数只能访问类的静态数据成员,不能访问类的非静态数据成员。因为静态成员函数是类的成员,不涉及具体的对象,访问静态成员函数常用类名引导。
⑵ 非静态成员函数可以访问类的静态数据成员,也可以访问非静态数据成员。因为类的静态成员总是存在的。
⑶ 静态成员函数和非静态成员函数,最主要的差别是非静态成员函数隐含了第一个参数this指针,静态成员函数不含this指针。
9.结构struct和类class有什么异同? struct和class都可以定义类,但是缺省访问权限说明时,struct的成员是公有的,而class的成员是私有的。在C++中,struct可被class代替。
10.比较类的三种继承方式public、protected、private之间的区别。
⑴采用public公有派生,基类成员的访问权限在派生类中保持不变,即基类所有
的公有或保护成员在派生类中仍为公有或保护成员。public派生最常用,可以在派生类的成员函数中访问基类的非私有成员,可通过派生类的对象直接访问基类的公有成员。
⑵采用private私有派生,基类所有的公有和保护成员在派生类中都成为私有成员,只允许在派生类的成员函数中访问基类的非私有成员。private派生很少使用。
⑶采用protected保护派生,基类所有的公有和保护成员在派生类中都成为保护成员,只允许在派生类的成员函数和该派生类的派生类的成员函数中访问基类的非私有成员。 11.派生类构造函数和析构函数执行的次序是怎样的?
派生类构造函数的执行次序:首先,调用基类构造函数,调用顺序按照它们被继承时声明的基类名顺序执行;其次,调用内嵌对象构造函数,调用次序为各个对象在派生类内声明的顺序;最后,执行派生类构造函数体中的内容。
派生类析构函数执行过程与构造函数执行过程相反。即当派生类对象的生存期结束时,首先调用派生类的析构函数,然后调用内嵌对象的析构函数,再调用基类的析构函数。
12.什么叫虚基类?有什么作用?
在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。引进虚基类的目的是为了解决二义性问题,使得公共基类在它的派生类对象中只产生一个基类子对象。
13.什么是多态性,在C++中是如何实现多态的?
多态是指同样的消息被不同类型的对象接收时导致完全不同的行为,是对类的特定成员函数的再抽象。C++支持的多态有多种类型,重载(包括函数重载和运算符重载)和虚函数是其中主要的方式。
14.什么是抽象类,其有何作用?抽象类的派生类是否一定要给出纯虚函数的实现?
含有纯虚函数的类称为抽象类。抽象类的主要作用是通过它为一个类族建立一个公共的接口,使它们能够更有效地发挥多态特性。抽象类声明了一组派生类共同操作接口的通用语义,而接口的完整实现,即纯虚函数的函数体,要由派生类自己给出,抽象类只能作为基类被继承使用。抽象类的派生类不一定要给出纯虚函数的实现,没有给出纯虚函数的实现的派生类仍然还是抽象类。
15.在C++中能否声明虚构造函数,为什么?能否声明虚析构函数,有什么作用?
在C++中不能声明虚构造函数。多态是不同的对象对同一消息有不同的行为特性,虚函数作为运行过程中多态的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此虚构造函数是没有童义的。
在C++中可以声明虚析构函数。析构函数的功能是在该类对象消亡之前进行一些必要的清理工作,如果一个类的析构函数是虚函数,那么,由它派生而来的所有子类的析构函数也是虚函数。析构函数设置为虚函数之后,在使用指针引用时可以动态联编,实现运行时的多态,保证使用基类的指针就能够调用适当的析构函数对不同的对象进行清理工作。
二、填空题
1.拷贝构造函数使用______作为参数初始化创建中的对象。
2.在C++中,对于构造函数和析构函数来说,______是可以重载的,而______是不可以重载的。
3.B类中包含一个A类的成员a,则生成B类的对象时构造函数的调用顺序为______。
4.类的每一个成员函数(静态成员函数除外)都有一个隐含的参数,叫做______。假设类名为A,则该参数的类型为______。 5.类的静态成员分为______和______。 6.声明友元的关键字是______。
7.如果类A继承了B,则类A称为______,类B称为______。 8.派生类对基类的继承有三种方式:______、______和______。
9.如果只想保留公共基类的一个拷贝,就必须使用关键字________把这个公共基类定义为虚基类。
10.派生类的成员有两种来源,即______和______。
11.要想访问基类的private成员变量,只能通过基类提供的______进行间接访问。 12.重载运算符应仍保持其原有的操作数个数、结合性和______。
13.对于双目运算符,若重载为类的成员函数,有______个参数;若重载为友元函数,则有______个参数。
14.后缀\重载为类的成员函数(设类名为A)的形式为______,重载为类的友元函数(设类名为A)的形式为______。
15.设有一时间类Time,现欲用成员函数方法重载运算符+,实现一个时间与一个整数的相加运算,所得结果为一个新时间,则成员函数的声明语句为______。 16.C++语言支持的两种多态性分别是编译时的多态性和______的多态性。 17.联编有两种方式,即______和______。 18.抽象类必须至少包含一个______。
21.Windows系统中消息的主要类型有______、______和______。
22.当用户在窗口中按下鼠标左键时,Windows系统就会自动发送______消息给该窗口,如果程序要对此消息作出反应,则程序中应包含类似______函数。
23.OnDraw()函数有一个指向______类的指针参数,通过该参数可以直接向视图输出。 24.应用程序将任何东西画到设备中之前,必须明确索取一个______。 25.对话框分为______和______两种。
26.对话框的初始化工作一般在______和______中完成。
27.MFC中公用对话框有______、______、______、______和______。 28.视图派生类可以选择______类作其基类,可以实现文本编辑功能。 29.对于文档类,数据成员的初始化工作是在______函数中完成的。
30.如果修改了文档类中的数据,并要求重新显示,要用______或______发出重画消息,引
起对OnDraw()的调用。
31.当执行cout语句输出endl数据项时,将使C++显示输出屏幕上的光标从当前位置移动到______的开始位置。
32.假定x和y为整型,其值分别为16和5,则a/y和double(x)/y的值分别为______ 和 ______。
33.strlen(“apple”)的值为______。
34.C++程序运行时的内在空间可以分为全局数据区,堆区,栈区和______区。 35.假定a是一个一维指针数组,则a+i所指对象的地址比a大______字节。 36.如果一个派生类只有一个唯一的基类,则这样的继承称为______。 37.假定AA是一个类,“AA * abc()const;”是该类中的一个成员函数的原型,在该函数体中______向*this或其成员赋值。
38.假定用户没有给一个名为AB的类定义构造函数,则系统为其定义的构造函数为______。 39.假定用户为类AB定义了一个构造函数“AB(int aa){a=aa;}”,该构造函数实现对数据
______的初始化。
40.作为类的成员函数重载地个运算符时,参数表中只有一个参数,说明该运算符有______个操作数。
41.C++有两种联编方式,其中在程序编译时的联编叫做______联编 42.虚函数可以是另一类的______函数 43.定义虚函数需要用______关键字
44.将函数“void vf()”定义为纯虚数的格式是virtual void vf()______ 45.拥有纯虚函数的类就是______,该类不能产生类的实例 46.派生类没有重载基类的纯虚函数,则此派生类也是______ 47.有如下程序
#include
public:
virtual void fun(){cout<<\};
class CSAI_B:public CSAI_A {
public:
virtual void fun(){CSAI_A::fun();cout<<\};
void main()
{ CSAI_A *p=new CSAI_B; p->fun(); delete p; }
执行这个程序的输出结果是()答案:______ 48. 有如下程序 #include
int i,s=0;
for(i=1;i<=T;i++){ s+=i*i;
cout<
cout< 运行结果:______ 49. 有如下程序 int ff(int x,int y){ int z; cout< cin>>z; if(x+y==z) return 1; else return 0; } 函数功能:______ 50. 有如下程序 char *f(char *s){ int n=strlen(s); char * r=new char[n+1]; for(int i=0;i if(s[i]>='a' && s[i]<='z')r[i]=s[i]-'a'+'A'; else r[i]=s[i]; r[n]='\\0'; return r; } 函数功能:______ 51.C++虚函数有两种调用方式,分别是______和多态调用方式 52.当运算符重载为成员函数时,对象本身就是______,不在参数表中显示地出现。 53.若以成员函数形式,为类CSAI重载“double”运算符,则该运算符重载函数的原则是______ 54.在表达式“x+=y”中,“+=”是作为非成员函数重载的运算符,若是使用显式的函数调用代替直接使用运算符“+=”,这个表达式还可以表示为______ 55.将运算符“>>”重载为类CSAI的友元函数的格式是:friend instream& operator >>______ 56.this指针______破坏类的封装性。 57.通过指向基类的指针调用派生类对象的函数时,采用______调用。 58.下面是对按从小到大排列的有序数组a[n]中进行二分查找x的算法,若查找成功返回该元素的下标,否则返回-1。 int BinnarySearch(int a[],int n,int x) { int low=0,high=n-1; //定义并初始化区间下界和上界变量 int mid; //定义保存中点元素下标的变量 while(low<=high){ mid=(low+high)/2; if(x==a[mid]) ______ else if(x return -1; } 59.请补充完整如下的类定义: #include