最新复习习题课ppt课件.ppt
复习习题课复习习题课阅读以下程序后填空阅读以下程序后填空#include #include class CSampleclass CSample int i;int i;public:public:CSample()CSample() cout Constructor ,;cout Constructor ,;i=0;i=0; CSample() cout Destructor endl; CSample() cout Destructor endl; void Display() cout i= i ,; void Display() cout i= i ,; ;void main()void main() CSample a;CSample a;a.Display();a.Display(); 其运行结果:其运行结果: , , 。Constructor,i=0,Destructor选择题下列对重载函数的描述中, 是错误的。重载函数中不允许使用默认参数重载函数中编译是根据参数表进行选择的不要使用重载函数来描述毫不相干的函数A. 构造函数重载将会给初始化带来多种方式 下列函数中, 不能重载。A. 成员函数B. 非成员函数C. 析构函数D. 构造函数选择题 下列关于多继承二义性的描述中, 是错误。一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性解决二义性的最常用的方法是对成员名的限定法基类和派生类中同时出现同名函数,也存在二义性问题A. 一个派生类是从两个基类派生来的,而这两个基类又有一个共同的基类,对该基类成员进行访问时,也可能出现二义性选择题下列关于动态联编的描述中, 是错误的。 动态联编是以虚函数为基础的 动态联编是在运行时确定所调用的函数代码的 动态联编调用函数操作是指向对象的指针或对象引用A. 动态联编是在编译时确定操作函数的选择题函数模板max的定义如下:template T max(T x,T y)return (xy) ? x:y;对于已知变量:int i,j; char a,b; float f,e;下面对该函数模板的调用中: 和 是错误的。A. max(i,j);B. max(a,j);C. max(a,b);D. max(f,e);E. max(e,i); 选择题面向对象系统的 是一种信息隐藏技术,目的在于将对象的使用者与设计者分开,使用者不必知道对象的行为实现的细节,而只需用设计者提供的 命令对象去做什么即可。A. 多态性B. 封装性C. 继承性D. 复用性E. 接口F. 属性G. 状态选择题下列引用的定义中, 是错误的。选择题 int i;int &j=i; B. int i;int &j; j=i; C. float i; float &j=i;D. char d;char &k=d;下列关于new运算符的描述中,是错误的。 它可以用来动态创建对象和对象数组 使用它创建的对象或对象数组,可以使用运算符delete删除 使用它创建对象时要调用构造函数A. 使用它创建对象数组时必须指定初始值选择题在C+程序中,对象之间的相互通信通过_? A.继承实现 B.调用成员函数实现 C.封装实现 D.函数重载实现选择题语句ofstream f(SALARY.DAT,ios:appios:binary);的功能是建立流对象f,试图打开文件SALARY.DAT并与之连接,并且_A.若文件存在,将文件写指针定位于文件尾;若文件不存在,建立一个新文件 B.若文件存在,将其置为空文件;若文件不存在,打开失败 C.若文件存在,将文件写指针定位于文件首;若文件不存在,建立一个新文件 D.若文件存在,打开失败;若文件不存在,建立一个新文件选择题在公有派生情况下,有关派生类对象和基类对象的关系,不正确的叙述是_A.基类的对象可以赋给派生类的对象 B.派生类的对象可以初始化基类的引用 C.派生类的对象可以直接访问基类中的成员 D.派生类的对象的地址可以赋给指向基类的指针 选择题可以用p.a的形式访问派生类对象p的基类成员a,其中a是_A.私有继承的公有成员 B.公有继承的私有成员 C.公有继承的保护成员 D.公有继承的公有成员选择题下面说法正确的是_A.内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方 B.内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方 C.类的内联函数必须在类体内定义 D.类的内联函数必须在类体外通过加关键字inline定义选择题友元关系不能_? A.继承 B.是类与类的关系 C.是一个类的成员函数与另一个类的关系 D.提高程序的运行效率 选择题 下列关于成员函数特征的描述中,是错误的。 成员函数一定是内联函数 成员函数可以重载 成员函数可以设置参数的默认值 成员函数可以是静态的 选择题下列对运算符重载的描述中, 是正确的。 运算符重载可以改变运算数的个数 运算符重载可以改变运算符的优先级 运算符重载可以改变运算符的结合性A. 运算符重载不可以改变语法结构选择题 下列对派生类的描述中, 是错误的。 一个派生类可以作为另一个派生类的基类 派生类至少有一个基类 派生类的成员除了它自己的成员外,还包含了它的基类的成员A. 派生类中继承的基类成员的访问权限在派生类中保持不变选择题 设置虚基类的目的是 。简化程序消除二义性C. 提高运行效率D. 减少目标代码选择题下列关于虚函数的描述中, 是正确的。 虚函数是一个static类型的成员函数 虚函数是一个非成员函数 基类中说明了虚函数后,派生类中与其对应的函数可不必说明为虚函数 派生类的虚函数与基类的虚函数具有不同的参数个数和类型 选择题 是一个在基类中说明的虚函数,它在该基类中没有定义,但要求任何最终派生类都必须定义自己的版本。A. 虚析构函数B. 虚构造函数C. 纯虚函数D. 静态成员函数选择题一个允许用户为类定义一种模式,使得类中的某些数据成员和某些成员函数的返回值能取任意类型。A. 函数模板B. 模板函数C. 类模板D. 模板类选择题在C+中,打开一个文件,就是将这个文件与一个 建立关联;关闭一个文件就是取消这种关联。A. 类B. 流C. 对象D. 结构 选择题指出下面的程序代码中指出下面的程序代码中classz的构造函数是否正确,如果不正确,写出正确的代码。的构造函数是否正确,如果不正确,写出正确的代码。classxinti;public:x(intI)i=I;/;classyfloatf;public:y(floatF)f=F;/;classzinti;xobjx;yobjy;public:z(inti,floatf,intI):x(i),y(f),int(I)z(inti,floatf,intI):objx(i),objy(f)i=l;z(inti,floatf,intI):objx(i),objy(f),i(I)读程序写运行结果#include class Apublic:A()coutA:A() called.n;A()coutA:A() called.n;class B:public Apublic:B(int i)coutB:B() called.n;buf=new chari;B()delete buf;coutB:B() called.n;private:char *buf;void fun(A *a)delete a;void main()A *a=new B(15);fun(a);A:A() called.B:B() called.A:A() called.读程序写运行结果#include class Apublic:A()coutA:A() called.n;virtual A()coutA:A() called.n;class B:public Apublic:B(int i)coutB:B() called.n;buf=new chari; virtual B()delete buf;coutB:B() called.n;private:char *buf;void fun(A *a)delete a;void main()A *a=new B(15);fun(a);A:A() called.B:B() called.B:B() called.A:A() called.指出下面程序段中的错误,并说明出错原因class A int a,b; public: A(int aa,int bb) a=aa;b=bb; ; A x(2,3),y(4); 指出下面程序段中的错误,并说明出错原因template class Tany T x,y; public: Tany(T a,T b)x=a,y=b;T sum( )return x+y; ; Tany (int) obj(10,100.0); 读程序写运行结果#includeiostream.hclass testprivate: int num; float fl;public: test(); int getint()return num; float getfloat()return fl; test();test:test()cout Initalizing default endl;num=0;fl=0.0;test:test() cout Desdtructor is active endl; void main()test array2;cout array1.getint() array1.getfloat() endl;Initalizing defaultInitalizing default0 0Desdtructor is activeDesdtructor is active阅读下面矩形类阅读下面矩形类CRactangle的定义,在使用该类的的定义,在使用该类的main()中的空白处填写正确的代码实现要求中的空白处填写正确的代码实现要求的输出结果。的输出结果。#include class CRectangledouble ledge,sedge;public: CRectangle() CRectangle(double a,double b) ledge=a; sedge=b; double Area() return ledge*sedge; void ShowPerimeter() coutPerimeter=(ledge+sedge)*2endl; CRectangle Perimeter2(CRectangle r2) CRectangle temp; temp.ledge=ledge+r2.ledge; temp.sedge=sedge+r2.sedge; return temp; ;void main()CRectangle A(3.5,2.5),B(4.2,3.8);要求执行结果: A.Perimeter=12B.Perimeter=16(A+B).Perimeter=28 coutA.;A.ShowPerimeter();coutB.;B.ShowPerimeter();cout(A+B).;A.Perimeter2(B).ShowPerimeter();面向对象程序设计中,类类型与其它数据类型之间的转换可以通过构造函数和类类型转换函数实现。下面的程序的main()中有标号的各语句都使用了哪些类型转换?它们都是合法的吗?注意:如果不合法,只要说明不合法即可;如果合法,用表达式说明使用了哪些转换注意:如果不合法,只要说明不合法即可;如果合法,用表达式说明使用了哪些转换和转换过程,例如:和转换过程,例如: Xx=1;x=X(1)class Xint i;public:X(int);/;class Yint j;public:Y(X);operator int()return j; / ; void main() X x = 1;/ Y y = x;/ int i = 2;int ret = i + 10;ret = y + 10;/ ret = y + 10 * y;/ ret = x + y + i;/ ret = x * x + i;/ x=X(1); Yy=Y(x); ret=int(y)+10 ret=int(y)+10*int(y) 不合法不合法 不合法不合法阅读以下程序#include class Aint i1;protected:int j1public:A() i1=10; j1=11 void f1();class B:private Aint i2;protected:int j2public:B() i1=20; j1=21 void f2();class C:private Bint i3;protected:int j3public:C() i1=30; j1=31 void f3(); 回答下列问题: 派生类派生类B中成员函数中成员函数f2()能否访问基类能否访问基类A中的成员:中的成员:f1(),i1和和j1吗?吗? 派生类派生类B的对象的对象b能否访问基类能否访问基类A中的成员:中的成员:f1(),i1和和j1吗?吗? 派生类派生类C中成员函数中成员函数f3()能否访问直接基类能否访问直接基类B中的成员:中的成员:f2(),j2和和i2吗?能否吗?能否访问间接基类访问间接基类A中的成员:中的成员:f1(),j1和和i1吗?吗? 派生类派生类C的对象的对象c能否访问直接基类能否访问直接基类B中的成员:中的成员:f2(),j2和和i2吗?能否访问间吗?能否访问间接基类接基类A中的成员:中的成员:f1(),j1和和i1吗?吗?可以访问可以访问f1()和和j1,而不可访问,而不可访问i1。不可以访问不可以访问f1(),也不可以访问,也不可以访问i1和和j1。可以访问直接基类中的可以访问直接基类中的f2()和和j2,而不可访问间接基类,而不可访问间接基类中的中的f1()和和j1,也不可访问,也不可访问i2和和i1。不可以访问直接基类和间接基类的所有成员。不可以访问直接基类和间接基类的所有成员。 判断下面程序的main(),是否正确?若有错误,在不修改类定义的前提下,如何给予纠正?class Base/、public:virtual void show();class Derived: public Base/public:void show();main()Base obj1, *ptr1;Derived obj2, *ptr2;ptr1 = &obj1;ptr1-show();ptr1 = &obj2;ptr1-show();ptr2 = &obj2;ptr2-show();ptr2 = &obj1;ptr2-show();return 0;的的main()中中下面下面两行:两行:ptr2=&obj1;ptr2-show();错误,纠正方法是将这两行删除。错误,纠正方法是将这两行删除。 判断下面程序的main(),是否正确?若有错误,在不修改类定义的前提下,如何给予纠正?class fruit/public:virtual void show() = 0;/;class apple: public fruit/public:void show();/;main()fruit fru, *ptr;apple app;ptr = &app;ptr-show();ptr = &fru;ptr-show();return 0;main()中第一行:中第一行:fruitfru,*ptr;错误,纠正方法是将该语句改为:错误,纠正方法是将该语句改为:fruit*ptr;另外第另外第5、6两行:两行:ptr=&fru;ptr-show();错误,纠正方法是将这两行删除。错误,纠正方法是将这两行删除。在类Point和类Rect中定义了带有缺省参数的构造函数,其原型说明如下,请指出其中哪些构造函数的原型说明是错误的。Point(int x = 0, int y = 0);Point(int x = 0, int y);Point(int x, int y = 0);Rect(int left, int top = 0,int right, int bottom = 0);Rect(int left = 0, int top = 0, int right, int bottom);Rect(int left, int top, int right = 0, int bottom = 0); 指出语句的错误,写出正确的语句; 在标号处填写应添加的语句; 写出程序的运行结果。#include #include class String static int total_length; int length; char *contents;public: String(char *s) length = strlen(s);contents = new charlength + 1;strcpy(contents, s);total_length += length; static void show(String& str) cout The length of string: length endl; cout The total length of strings: total_length endl; String() total_length -= length;delete contents; ; main() String str1(The First String Object); String:show(str1); String str2(The Second String Object);String:show(str2); String:show(str1); return 0; coutThelengthofstring:str.lengthendl; intString:total_length=0; 程序运行结果:Thelengthofstring:23Thetotallengthofstrings:23Thelengthofstring:24Thetotallengthofstrings:47Thelengthofstring:23The totallengthof strings:47定义一个定义一个point类,其中包括两个整型的私有数据成员类,其中包括两个整型的私有数据成员x,y;再定义一个再定义一个line类,其中包含两个类,其中包含两个point类的保护对象成员类的保护对象成员p1,p2,表示直线的两个端点,表示直线的两个端点,line类具类具有定义直线有定义直线(line)、画线、画线(draw)、清除线、清除线(erase)和移动线和移动线(move)的能力,其中的能力,其中move功能应能直接功能应能直接修改直线的两个端点。下面写出了这两个类的定义和它们的构造函数的定义。修改直线的两个端点。下面写出了这两个类的定义和它们的构造函数的定义。请在定义的空白处,填写正确的代码。请在定义的空白处,填写正确的代码。_class lineprotected:point p1,p2;public:line(int x1, int y1, int x2, int y2);line(point P1, point P2);void draw();void erase();void move(int dx, int dy);void move(point dp);classpoint;friendvoidline:move(intdx,intdy);friendvoidline:move(pointdp); p1(x1,y1),p2(x2,y2) p1(P1),p2(P2)class pointint x,y;public:point(int X, int Y) x = X; y = Y;_;line:line(int x1, int y1, int x2, int y2): _ line:line(point P1, point P2): _ 在下面的程序中带标号的空白处填写正确的标识符或表达式,以便满足在下面的程序中带标号的空白处填写正确的标识符或表达式,以便满足main()中的调用需要。中的调用需要。#includeclassComplexprivate:doublereal,imag;public:Complex(doubler=0,doublei=0);Complexoperator+(constComplex&c);Complexoperator-(constComplex&c1,);Complexoperator-()const;voidprint()const;Complex:Complex(doubler,doublei)real=r;imag=i;ComplexComplex:operator+(constComplex&c)doubler=real+c.real;doublei=imag+c.imag;returnComplex(r,i);Complexoperator-(constComplex&c1,constComplex&c2)doubler=;doublei=;returnComplex(r,i);ComplexComplex:operator-()returnComplex(-real,-imag);voidComplex:print()constcout0)cout+;if(imag!=0)coutimagin;voidmain()constComplexc1(1,2.5);constComplexc2(5,6.25);Complexc;c=c1-c2;c.print();c=c1+c2;c.print();c=-c1;c.print();c=25-c2;c.print();constfriendconstComplex&c2const c1.real-c2.realc1.imagc2.imagconst判断下列对类Shape的引用是否有错误,如果有错误,说明出错原因。class Shape/.public:virtual void Show() = 0;virtual float Area() = 0;/.; Shape figure;/ Shape *ptr;/ Shape fun();/ void graph(Shape fig);/ Shape& fun(Shape &fig);/ Shape* fun(Shape *fig);/ 抽象类不能创建对象;抽象类不能创建对象;正确正确抽象类不能作为函数的返回类型;抽象类不能作为函数的返回类型;抽象类不能作为函数的参数类型。抽象类不能作为函数的参数类型。正确正确正确正确 47 结束语结束语