第九章 关于类和对象的进一步讨论 复习题
- 格式:doc
- 大小:70.00 KB
- 文档页数:13
oop基础数学习题集第一部分:一.选择填空题1.类成员缺省的访问特征是___,结构体缺省的访问权限是___.A. protectedB. publicC. privateD. friend 2.下列关于类的成员的访问特征的描述中,正确的___A.必须首先说明具有私有特征的成员B.数据成员必须说明成私有的,成员函数必须说明成私有的C.每个成员前都必须有标明访问特性的关键字D.在同一类中,说明访问特性的关键字可以多次使用3.关于类和对象,下列说法不正确的是___A. 类与对象的关系类似于数据类型与变量的关系B.对象是类的一个实例C.任何一个对象必定属于一个特定的类D.一个类只能有一个对象4.关于类的一个成员函数,下列说法中正确的是()A.必须在类内定义B. 一定是内联函数C.不可以重载D.可以设置参数的缺省植5.已知一个类,类名为A,可以定义A类的对象或定义A类的指针,下列一定不正确的形式为____A. A a1B. A a2 ( 16 )C. A A3( )D. A *P= new A6. 已知一个类COMPLEX, 有下述两行:Complex c ; //AComplex c() //B以下描述中错误的是___A. A行定义了一个对象,并调用缺省的构造函数B. B行定义了一个对象,并调用缺省的构造函数C. B行是一个函数的原型说明,函数名为C,函数没有参数,返回值类型是ComplexD. A行和B行两行的意义不一样7.设有下列对象定义;class A{public :int a ,b ;} a1= {1,2}, a2 ,a3 ;class{public :int a,b;}a4 ;则以下正确的定义或赋值形式是___A. a3=a2=a1;B. a4=a1;C. A *p=&a4D. A &re=a48. 下列描述中, ___不是构造函数的特征A. 构造函数可以重载B. 必须显示为类定义一个构造函数C. 无须为构造函数指定返回值类型D. 构造函数在产生对象时由系统自己调用9.下列有关析构函数的描述中,正确的是___A. 析构函数的定义只能在类体内B. 析构函数可以有一个或多个参数C. 析构函数是在撤消对象时,系统自动调用的D. 析构函数可以重载10.以下关于构造函数和析构函数的描述中错误的是___A. 用户不定义缺省的构造函数,则系统自动生成一个缺省的构造函数B. 若用户不定义拷贝的构造函数,则系统自动生成一个拷贝的构造函数C. 若用户不定义析构函数,则系统自动生成一个析构函数D. 以上A错误,而B,C正确11.定义复数类如下;class Complex{ double real ,image ;public:Complex (double r=0 ,double i=0 ) {real =r ; image =i ;}Complex (Complex &c) {real=c.real ; image=c .image ;}};若有Complex c1; //AComplex c2(3,5); //BComplex c3(c2); //Cc2=c1; //D则下列描述中正确的是___A. C行和D行均调用了拷贝构造函数B. C行调用了拷贝构造函数C. B行调用了拷贝构造函数D. A行调用了拷贝构造函数12. class A{int x, int y ;public ;A (int a, int b ) {x=a;y=b;}void show(){cout<<x<<?,?<<y<<endl;}< p="">void set(int a,int b){x=a;y=b;}};void main(){A obj;obj.set(3,5);obj.show();}对上述过程段,以下说法中,正确的是___A.编译时报错,程序无法运行B.编译时无错,运行正常,输出3,5C.编译无错,运行时报错D.编译时报警告错,但运行正常,输出3,513.在下列程序中,C类的数据成员中有一个A 类对象和一个B 类对象。
选择题(类与对象)一1:下列有关类的说法不正确的是()。
A.对象是类的一个实例B.任何一个对象只能属于一个具体的类C.一个类只能有一个对象D.类与对象的关系和数据类型与变量的关系相似答案:C分析:对象是类的一个实例,类与对象的关系和数据与变量的关系相似,所以一个类可以有多个对象。
2:下面()项是对构造函数和析构函数的正确定义。
A.void X::X(), void X::~X()B.X::X(参数), X::~X()C.X::X(参数), X::~X(参数)D.void X::X(参数), void X::~X(参数)答案:B分析构造函数无返回类型、可带参数、可重载;析构函数无返回类型、不可带参数、不可重载。
3:()的功能是对象进行初始化。
A.析构函数 B. 数据成员 C.构造函数 D.静态成员函数答案:C分析:当一个对象定义时,C++编译系统自动调用构造函数建立该对象并进行初始化;当一个对象的生命周期结束时,C++编译系统自动调用析构函数注销该对象并进行善后工作;4:下列表达方式正确的是()。
A.class P{ B. class P{public: public:int x=15; int x;void show(){cout<<x;} voidshow(){cout<<x;}}; }C. class P{ D. class P{int f; public:}; int a;f=25; void Seta (int x) {a=x;}答案:D分析:在类体内不可对数据成员进行初始化;类定义结束时需用分号;只有类中的成员函数才能存取类中的私有数据。
5:拷贝构造函数具有的下列特点中,()是错误的。
A.如果一个类中没有定义拷贝构造函数时,系统将自动生成一个默认的B.拷贝构造函数只有一个参数,并且是该类对象的引用C.拷贝构造函数是一种成员函数D.拷贝构造函数的名字不能用类名答案:D分析:如果一个类中没有定义拷贝构造函数时,系统将自动生成一个默认的;拷贝构造函数只有一个参数,并且是该类对象的引用;拷贝构造函数的名字与类同名,并且不被指定返回类型;拷贝构造函数是一种成员函数。
类与对象习题 1类与对象习题一. 基本概念与基础知识自测题4.1 填空题5.1.1 引入类定义的关键字是。
类的成员函数通常指定为,类的数据成员通常指定为(3)。
指定为(4)的类成员可以在类对象所在域中的任何位置访问它们。
通常用类的(5)成员表示类的属性,用类的(6)成员表示类的操作。
答案:(1) class(2)公有的public(3)私有的private(4)公有的public(5)数据(6)函数4.1.2 类的访问限定符包括(1)、(2)和(3)。
私有数据通常由(4)函数来访问(读和写)。
这些函数统称为(5)。
答案:(1) public(公有的)(2) private(私有的)(3) protected(保护的)(4)公有的成员函数(5)类的接口4.1.3 通常在逻辑上,同一类的每个对象都有在物理上通常只有(2)代码区。
只有在(3)定义,并(4)的函数和加了关键字(5)的函数例外。
答案:(1)独立的(2)共用的(3)在类说明中(4)不包括循环等复杂结构(5) inline4.1.4 C++中支持三种域:、(4)中,全局域被包括在(5)中。
using指示符以关键字using开头,后面是关键字(6),最后是(7)。
这样表示以后在该名字空间中所有成员都(8)。
如不使用using指示符则在使用时要加::,称为(9)运算符。
答案:(1)局部域(local scope)(2)名字空间域(namespace scope)(3)类域(class scope)(4)局部域(5)名字空间域(6) namespace(7)名字空间名。
1.概念填空题1.1类定义的关键字是。
类的数据成员通常指定为_ _成员。
类的函数成员通常指定为_ —成员,指定为_______ 的类成员可以在类对象所在域中的任何位置访问它们,类的_ _只能被该类的成员函数或友元函数访问。
1.2类的访问限定符包括_ 、—_和_ _。
类成员默认的访问方式是 _ _。
访问限定符在类中—(有/无)先后次序,各限定符 _________ 允许/不允许)多次出现。
1.3构造函数的任务是一_。
类中可以有_ 一个构造函数,它们由一—区分。
如果类说明中没有给出构造函数,则C++编译器会提供构造函数,该函数_ (完成/不完成)对象初始化工作。
1.4复制构造函数的参数是 _ ,当程序没有给出复制构造函数时,编译系统会提供_ ,完成类对象的_ _。
复制构造函数被调用情况有________ 种(哪几种)。
1.5析构函数在对象_ _时被自动调用。
类中没有定义析构函数时,编译系统会提供一个默认的析构函数。
该函数_ 完成/不完成)具体对象的清理工作。
2.简答题2.1为什么说类与对象的概念是客观世界的反映?2.2简单解释什么是面向对象程序设计的封装性。
2.3引用作为函数参数时为什么能实现两个实参之间的数据交换?为什么对应实参不能为引用?为什么返回值为引用的函数可以作为左值?2.4什么是默认的构造函数?默认的构造函数可以有多少个?2.5复制构造函数用于哪3个方面?2.6为什么在友元函数的函数体内访问对象成员时,必须用对象名加运算符”.”再加对象成员名?2.7类的静态数据成员与函数中的静态成员有何异同?2.8类的成员函数在什么情况下应该定义为私有的?这样做的目的是什么?2.9友元关系有何性质?友元关系的优点和缺点各有哪些?3.选择题3.1数据封装就是将一组数据和与这组数据有关操作组装在一起,形成一个实体,这实体也就是()。
A •类B .对象C.函数体 D •数据块3.2类的实例化是指()°A •定义类B .创建类的对象C.指明具体类 D •调用类的成员3.3卜列说法中止确的是()°A •类定义中只能说明函数成员的函数头,不能定义函数体B.类中的函数成员可以在类体中定义,也可以在类体之外定义C.类中的函数成员在类体之外定义时必须要与类声明在同一文件中 D •在类体之外定义的函数成员不能操作该类的私有数据成员3.4有如下类定义:class sample {int n;public:sample (int i=0): n(i){ }void setValue(i nt nO);}; 下列关于setValue 成员函数的实现中,正确的是( A . )。
一、选择填空1.有关类和对象说法错误的是(C)A.对象是类的一个实例B.任何一个对象只能属于一个具体的类C.一个类只能有一个对象D.类与对象的关系同数据类型和变量的关系相似2.下面关于友元的描述中,错误的是(D)A.友元函数可以访问该类的私有数据成员B.一个类的友元类中的成员函数的友元函数C.友元可以提高程序的运行效率D.类与类之间的友元关系可以继承3.在C++中,关于设置参数默认值的描述中,正确的是(C)A.不允许设置参数的默认值B.设置参数默认值只能在定义函数时设置C.设置参数默认值时,应该先设置左边的再设置右边的D.设置参数默认值时,应该全部参数都设置4.(D)是实现动态多态性的必要条件A.重载函数B.构造函数C.析构函数D.虚函数5.关于成员函数特征的描述中,(B)是错误的A.成员函数可以是内联函数B.所有成员函数都可以重载C.成员函数可以设置参数的默认值D.成员函数可以是静态的6.若类Base和类Sub定义如下:class Base class Sub{{A int k;C int i,j;public:public:B void get();D void make(){k=i*j;} };};则上述定义中,(D)是非法表达式7.基类的(B)不能为派生类的成员访问,基类的(A)在派生类中的性质和继承的性质一样,而基类的(D)在私有继承时在派生类中成为私有成员,在公有和保护继承时在派生类中为保护成员。
A.公有成员 B.私有成员 C.私有成员函数 D.保护成员8.(C)是一个在基类中说明的虚函数,它在该基类中没有定义,但作为模板要求任何派生类都必须定义自己的版本。
A.虚析构函数B.虚构造函数C.纯虚函数D.静态成员函数二、分析下面程序运行结果1)class B{public:B(){}B(int i,int j){a=i;b=j}void printb(){cout<<”a=”<<a<<”,b=”<<b<<endl;} private:int a,b;};class A{B c;public:A(){}A(int i,int j):c(i,j){}void printa(){c.printb();}};void main(){A a(7,8);a.printa();}a=7,b=82)#include<iostream.h>Class CSample{int i;public:CSample();void disp();~CSample();};CSample::CSample(){cout<<“Constructor”<<“,”;i=0;}void CSample::disp(){cout<<“i=”<<i<<“,”;} CSample::~CSample(){cout<<“Destructor”<<endl; }void main(){CSample a;a.disp();}Constructor,i=0,Destructor3)#include<iostream.h>class A{public:A(int i,int j){a=i;b=j;}void move(int x,int y){a+=x;b+=y;}void show(){cout<<”(“<<a<<”,”<<b<<”)”<<endl;} private:int a,b;};class B:public A{public:B(int i,int j,int k,int l):A(i,j),x(k),y(l){}void show(){cout<<x<<”,”<<y<<endl;}void fun(){move(3,5);}void f1(){A::show();}private:int x,y;};void main(){A e(1,2); e.show();B d(3,4,5,6); d.fun(); d.f1();d.B::show();}(1,2)(6,9)5,64)#include<iostream.h>{public:A(){}virtual void fun1(){cout<<”A fun1”<<endl;}virtual void fun2(){cout<<”A fun2”<<endl;}void fun3(){cout<<”A fun3”<<endl;}void fun4(){cout<<”A fun4”<<endl;}};class B:public A{public:B(){}void fun1(){cout<<”B fun1”<<endl;}void fun2(){cout<<”B fun2”<<endl;}virtual void fun3(){cout<<”B fun3”<<endl;}void fun4(){cout<<”B fun4”<<endl;}};void main(){A*p;B b;P=&b;P->fun1();P->fun2();P->fun3();P->fun4();}B fun1A fun3A fun45)#include<iostream>class Sample{public:int n;static int m;Sample(int i){n=i;m+=i;}};int Sample::m=1;void main(){Sample s1(2),s2(4),s3(6);cout<<“s1.n=”<<s1.n<<“,”<<“s1.m=”<<s1.m<<endl;cout<<“s2.n=”<<s2.n<<“,”<<“s2.m=”<<s2.m<<endl;cout<<“s3.n=”<<s3.n<<“,”<<“s3.m=”<<s3.m<<endl;cout<<“Sample::m=”<<Sample::m<<endl;}s1.n=2,s1.m=13s2.n=4,s2.m=13s3.n=6,s3.m=13。
第一部分c++初步知识1、C++ 源程序文件的缺省扩展名为( ) 。
A. cppB. exeC. objD. Lik2、程序运行中需要从键盘上输入多于一个数据时,各数据之间应使用( )符号作为分隔符。
A. 空格或逗号B.逗号或回车C. 逗号或分号D.空格或回车3、函数重载是指()。
A. 两个或两个以上的函数取相同的函数名,但形参的个数或类型不同B. 两个以上的函数取相同的名字和具有相同的参数个数,但形参的类型可以不同C. 两个以上的函数名字不同,但形参的个数或类型相同D. 两个以上的函数取相同的函数名,并且函数的返回类型相同4、以下关于函数模板叙述正确的是()。
A. 函数模板也是一个具体类型的函数B. 函数模板的类型参数与函数的参数是同一个概念C. 通过使用不同的类型参数,函数模板可以生成不同类型的函数D. 用函数模板定义的函数没有类型5、下面关于函数重载的说法中,正确的是:A 函数的参数个数一定不同B 函数的返回值不同C 函数名可以不同D 参数个数或类型不同6、为了提高程序的运行速度,可将不太复杂的功能用函数实现,此函数应选择()。
A. 内联函数B.重载函数C.递归函数D.函数模板7、以下正确的描述是()。
A. 不允许设置参数的默认值B.设置参数的默认值只能在定义函数时设置C. 设置参数的默认值时,应该设置右边的参数D.设置参数的默认值时,应该全部参数都设置8、定义p并使p指向动态空间中的包含30个整数的数组所使用的定义语句为()。
A.int *p=new int[30];B.int *p=new int(30);C.int *p=new [30];D.int *p=&new int[30];9、下列对引用的陈述中不正确的是()。
A. 每一个引用都是其所引用对象的别名,因此必须初始化B. 形式上针对引用的操作实际上作用于它所引用的对象C. 一旦定义了引用,一切针对其所引用对象的操作只能通过该引用间接进行D. 不需要单独为引用分配存储空间10、假定指针变量p定义为“int *p=new int(100);”,要释放p所指向的动态内存,应使用语句()。
第九章关于类和对象的进一步讨论复习题1.关于new运算符的描述,错误的是()A.它可以用来动态创建对象和对象数组B.使用它创建的对象和对象数组可以使用运算符delete删除C.使用它创建对象时要调用构造函数D.使用它创建对象数组时必须指定初始值2. 对类的构造函数和析构函数,描述正确的是( )A.构造函数可以重载,析构函数不能重载B.构造函数不能重载,析构函数可以重载C.构造函数可以重载,析构函数也可以重载D.构造函数不能重载,析构函数也不能重载3.关于析构函数的描述,错误的是( )A.析构函数声明和定义中都不能有形参B.析构函数可以定义为内联函数C.析构函数可以重载D.析构函数可以定义为虚函数4.不是构造函数特征的是( )A. 构造函数的函数名与类名相同B. 构造函数可以重载C. 构造函数可以设置缺省参数D. 构造函数必须指定类型说明5.有关析构函数的错误的说法是()A.一个类的析构函数有且只有一个B.析构函数无函数类型C.析构函数和构造函数一样,可以有形参D.析构函数的作用是在对象生命期结束时,收回分配给对象的内存空间6.关于友元,说法错误的是( )A.友元的关系不能传递B.友元却可以访问其他类中的私有成员C.友元的关系是单向的D.友元的关系是双向的7. 类的析构函数的作用是( )A.一般成员函数B.类的初始化C.对象的初始化D.删除对象8.关于析构函数的说法,错误的是( )A.析构函数是与构造函数作用相反的函数B.析构函数不返回任何值C.析构函数没有函数类型,也没有函数参数D.析构函数可以被重载9.关于构造函数的说法,错误的是( )A.在类对象进入其作用域时调用构造函数B.构造函数没有返回值C.不需要在定义构造函数时声明类型D.构造函数可以被用户调用10.引入内联函数的主要目的是()A. 缩短程序代码,少占用内存空间B. 既可以保证程序的可读性,又能提高程序的运行效率C. 占用内存空间少,执行速度快D. 使程序的结构比较清晰11.一个类的静态数据成员所表示的属性确切地说()A. 是类的或对象的属性B. 只是对象的属性C. 只是类的属性D. 是类和友元的属性12. 有如下对象数组定义语句:MyClass *p[10];当对象指针数组p离开它的作用域时,系统自动调用该类析构函数次。
013. 已知:类A中一个成员函数说明如下:void Set(A&a);其中,A&的含义是( )A. 指向类A的指针为aB. 将a的地址值赋给变量SetC. a是类A对象的引用,用来作函数Set()的参数D. 变量A与a按位与作为函数Set( )的参数14. 重载函数是( )A. 以函数参数来区分,而不用函数的返回值来区分不同的函数B. 以函数的返回值来区分,而不用函数参数来区分不同的函数C. 参数表完全相同而返回值类型不同的两个或多个同名函数D. 参数表和返回值类型都必须是不同的两个或多个同名函数15.关于构造函数的说法,错误的是( )A.构造函数的函数体中可以对数据成员赋初值B.构造函数的函数体中可以包含赋值语句之外的其他语句C.如果用户没有定义构造函数,则C++系统会自动生成一个构造函数D.只能在类内对构造函数进行声明,不能在类外定义构造函数16. 关于模板的描述,错误的是( )A.函数模板是模板的定义,在编译时生成函数模板的代码B.模板类是实实在在的类的定义,可以定义模板类的对象C.模板类是是类模板的实例化D.模板函数可以进行重载17. 在C++中,数据封装要解决的问题是( )A. 数据的规范化B. 便于数据转换C. 避免数据丢失D. 防止不同模块之间数据的非法访问18. 有如下定义语句:MyClass *p;,则执行 p=new MyClass; 语句时,将自动调用该类的构造函数。
执行delete p;语句时,将自动调用该类的。
若要把类FriendClass定义为类MyClass的友元类,则应在类MyClass的定义中加入语句_ 。
析构函数friend class FriendClass19.有如下对象数组定义语句:MyClass p[10];当对象数组p离开它的作用域时,系统自动调用该类析构函数次。
1020. 有如下定义语句: MyClass p[10],*q;则系统自动调用该类构造函数10次。
21. 假定用户没有给一个名为MyClass的类定义析构函数,则系统为其定义的默认析构函数形式为。
~MyClass()22. 类中的构造函数是一个特殊的成员函数,它由类的对象自动调用,它的作用是。
进行初始化23. 假定用户没有给一个名为MyClass的类定义析构函数,则系统为其定义的默认析构函数形式为。
24.~MyClass()24. 在定义类的对象时,C++程序将自动调用该对象的函数初始化对象自身。
25.构造26. 在C++语言中,每个类都有一个隐含的指针叫做指针。
该指针指向正在调用成员函数的对象。
26. this27. 非成员函数应声明为类的才能访问这个类的private成员。
友元函数28. 类中的构造函数是一个特殊的成员函数,它由类的对象调用,它的作用是进行初始化。
自动29 假定用户没有给一个名为MyClass的类定义析构函数,则系统为其定义的默认析构函数形式为。
~Myclass()30. 非成员函数应声明为类的才能访问这个类的protected成员。
友元函数31. 在面向对象的程序设计中,通过实现数据隐藏;通过继承实现代码的复用。
函数名重载是指同一作用域内的多个函数使用相同的函数名,这些同名函数通过它们的进行区分。
.封装不同的参数表32. 在定义类的对象时,C++程序将自动调用该对象的函数。
类中构造函数可以有一个或多个,析构函数最多有个。
构造一个33.下列程序在构造函数和析构函数中申请和释放类的私有成员指向的堆空间,请完成该类的实现。
Class MyClass{public:~MyClass();private:int *X;};MyClass::MyClass(int a){;}MyClass::~Myclass(){;}34.MyClass(int a);X=new int (a)delete X34.下面的类定义了拷贝初始化构造函数,请完成该类的定义和实现。
Class MyClass{public:MyClass(int xx=0,int yy=0){X=xx;Y=yy;}_______________ ;//拷贝初始化构造函数身明private:int X,Y;};MyClass::MyClass(MyClass &p) {//拷贝初始化构造函数的实现X=_______________;_______________;}MyClass(MyClass &p)p.XY=p.Y35. 在下面程序的横线处填上适当的语句,使运行该程序执行结果为10。
class MyClass{pub1ic://为x置值//取x值private:int x;};void main(){Myclass my(10);cout<<my.GetNum()<<endl;}33.#include<iostream.h>MyClass(int a){ x=a;}int GetNum(){return x ;}36.仔细阅读程序,在题后写出其运行结果。
#include <iostream.h>class B{public:B(){cout<<"B::B() called.\n";}B(int i){b=i;cout<<"B::B(i) called.\n";}virtual void virfun(){cout<<"B::virfun() called.\n";} private:int b;};class D:public B{public:D(){cout<<"D::D() called.\n";}D(int i,int j):B(i){d=j;cout<<"D::D(i,j) called.\n";} private:int d;void virfun(){cout<<"D::virfun() called.\n";} };void fun(B *obj){obj->virfun();}void main(){D *pd=new D;fun(pd);delete pd;}运行结果:B::B() called. (1分)D::D() called. (2分)D::virfun() called. (2分)37.仔细阅读程序,在题后写出其运行结果。
#include <iostream>#include <string>using namespace std;class Student{public:Student(int n){num=n;}~Student(){cout<<"D C"<<endl;}void display(){cout<<"num:"<<num<<endl;}private:int num;};int main(){Student stud1(100);stud1.display();Student stud2(101);stud2.display();return 0;}运行结果:38.num:100 (2分)num:101 (1分)D C (1分)D C (1分)38.定义一个由y=ax+b确定的直线类Line。
该类的构造函数初始化直线,成员函数Print显示该直线方程。
友元函数SetPoint()求解两条直线的交点。
#include <iostream.h>struct Point{float x;float y;} (2分)class Line{public:Line(float m,f1oat n){a=m;b=n;} (2分)void Print(){cout<<"y="<<a<<"*X+”<<b<<endl;(2分)}friend Point SetPoint(Line& p,Line& q); (2分)private:f1oat a,b;}Point SetPoint(Line& p,Line& q){Point Dian;Dian.x =(q.b-p.b)/(p.a-q.a);Dian.y =(p.a*q.b-q.a*p.b)/(p.a-q.a);return Dian; (2分)}39.分析下列程序,写出其运行结果。