




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 面向对象程序设计中的数据隐藏指的是参考答案为:D A. 输入数据必须输入保密口令B.数据经过加密处理C.对象内部数据结构上建有防火 墙 D.对象内部数据结构的不可访问性 解析 输入数据必须输入保密口令和数据经过加密处理都不是面向对象程序设计的特征;对 象内部数据结构上也不可能建有防火墙, 所以它们都不是面向对象程序设计中所指的数据隐 藏。面向对象程序设计系统中的封装单位是对象, 对象之间只能通过接口进行信息交流, 外 部不能对对象中的数据随意地进行访问, 这就造成了对象内部数据结构的不可访问性, 也使 得数据被隐藏在对象中。这就是面向对象程序设计中的数据隐藏所指。 2. 下列各项中符合函数
2、重载必须满足的条件的是参考答案为 :D A. 必须有不同的参数个数B.对应的参数类型必须不相同C. A和B必须同时满足 D. A和B只要满足一个即可 解析我们知道,在同一个作用域中,要实现函数重载必须满足的条件的是:有不同的 参数个数;或者 对应的参数有不相同的数据类型, 即和中只要有一个满足就可以了。 当然两者都满足更好,但这不是必须的。 3. 下列带缺省值参数的函数说明中,正确的说明是参考答案为 :A A. int Fun(int x,int y=2,int z=3);B. int Fun(int x=1,int y,int z=3); C. int Fun(int x,int y=2,i
3、nt z);D. int Fun(int x=1,int y,int z=3); 解析 在带缺省值参数的函数说明中, 正确的说明应该是无缺省值的参数依次排列在参数表 的左边,排完无缺省值的参数后,再依次排列带缺省值的参数。从所给出的四个选项来看, 只有“ int Fun(int x,int y=2,int z=3)”符合这条规定,其它的都不符合。 4有如下的对类“ CSampk”的说明,其中()是错误的。 class CSample 参考答案为 :A A. int a=23; B. CSample(); public: C. CSample(int val); D. CSample(); 解析
4、在上面对类CSample说明中, “CSample()”和CSample(int val) 是该类重载 的构造函数、“ CSample() ”是该类的析构函数,这三个语句都是正确的。错误的语句是 “int a=23”,因为它违反了在类的声明(不管是引用性声明,还是定义性声明)中都不能 以赋值表达式的形式给它的数据成员进行初始化。 5已知类A中的一个成员函数的说明如下: void Set(A 则该函数的参数“ A ”造成了访问的二义性,即其中的 i和j,到底是取自类 A呢?还是取自类B呢? 7下面的主程序中,语句()是错误的。 class A int i; public: virtual voi
5、d fun()=0; A(int a) i=a; ; class B int j; public: void fun() coutsalary; 其中 worker 为具有类类型的对象) D. Location int x=rA C. x=worker.salary; . GetX(); ( Location 为已定义的类,A1 为对象) 解析 因 pointer 为指向类对象的指针,所以“ pointer - salary ”是正确的访问数据 成员的形式; 因 worker 为具有类类型的对象, 所以“ worker.salary ”也是正确的访问数据 成员的形式;因 Location 为已
6、定义的类, A1 为对象,所以“ Location int x=rA .GetX(); ”表示以对象 A1初始化对象引用rA,然后由对象引用rA调用成员函数 GetX() 给变量 x 赋值, 这样的访问成员函数的形式也是正确的;“*pointer.salary;”中, 因为运 算符.的优先级高于运算符* 的优先级, 所以相当于* (pointer.salary );,那 正确的形式应该是* (pointer宀salary ); ”。故*pointer.salary ”是不正确的访问。 11. C+ 对 C 语言作了很多改进,即从面向过程变成为面向对象的主要原因是( )D A. 增加了一些新的运
7、算符 B. 允许函数重载, 并允许设置缺省参数 C. 规定函数说明 符必须用原型 D. 引进了类和对象的概念 12. 下列符号不能组成标识符的是(A ) A. 连接符 B. 下划线 C. 大小写字母 D. 数字字 符 13. 类型修饰符 unsigned 不能修饰 (D ) A. char B. int C. long int D. float 14. 在 int a=3,int *p= public: base() cout ” Initializing defaultn” ; base(int m) cout ” Initializingn” ; n=m; base() cout ” De
8、stroyingn” ; ; void main() base x(1); base y=x; 答:( 1) n=m; const 数据成员不以该形式赋值 ( 2)错误处 base y=x; ,以对象初始化对象 解析 (1)作为 const 数据成员 n 不能用赋值表达式的形式为其赋初值,必须在定义构造 函数时在函数头中以“ base(int m) :n(m) ”形式来初始化。 (2) base y=x; 语句中 =不是赋值的意思,而是初始化的意思。即在定义类base 的对 象 y 时,以对象 x 给它初始化,相当于 base y (x); 。但是以对象初始化对象时,必须调 用拷贝构造函数才行
9、。 因程序中没给出拷贝构造函数, 也不能调用系统的缺省拷贝构造函数, 因用户给出了构造函数后,再也不能调用系统提供的任何缺省构造函数。所以, base y=x ; 是错误的。 2分析下列程序中的错误,并说明出错原因。 #include class A int x; public: A(int a) x=a; fun(); virtual void fun()=0; ; class B:public A public: B(int b) :A(b) void fun() ; void main() A aa(5); B bb(8); 答: 1)A aa(5); 抽象类不能定义对象 解析 (1)在
10、构造函数“ A(int a) ”调用了纯虚函数“ fun() ”,因构造函数调用虚函数是 静态联编, 即调用的是它自己类的虚函数。 在此调用的是纯虚函数, 它只被说明, 而未定义, 所以不可能被执行,因此出错。 (2)抽象类相当于是对类的引用性声明,所以它只能定义该类的指针和引用,而不能定义 它的对象。在此,A为抽象类,而“ A aa(5) ”去卩定义了 A的对象,因此是错误的。 3分析下列程序中的错误,并说明出错原因。 #include class AA int aa; AA(int xx) aa=xx; public: int get() return aa; AA() cout ” De
11、stroying ” AA endl; ; main() AA elem(5); coutelem.get()endl; 答:( 1) AA(int xx) 的访问属性错、应具有公有属性 解析 ( 1)构造函数虽是由系统自动调用来生成对象的,但一般都是在类外调用,所以它 的访问属性必须是公有的。程序中构造函数的访问属性是私有的(缺省值) ,运行中必定出 错。 四. 完成程序题(本大题共 5小题,每小题 4分,共 20分) 根据题目要求,完成程序填空。 1仔细阅读下列求两个点之间距离的程序,根据程序的输出结果在划线处填入正确语句。 class point float x,y; public: p
12、oint(float a,float b) x=a; y=b; float distance(point float dy= ; return (float)sqrt(dx*dx+dy*dy); ; void main() point p1(2,3),p2(32,43); coutp1. _endl; 答:p.x -x p.y -y dista nce(p2) 解析 由于求两点之间距离的函数“ distance ”为成员函数,所以由该函数的 this 指 针所指对象可用作起点(参数之一) ,另一个用作终点的参数,必须在函数的参数表中显式 地给出。dx和dy分别计算两个结点间 x和y坐标间的距离
13、,因此应该为:dx=p.x - x和 dy =p.y - y。对它们求平方相加后开方即可,得到两点间的距离: (float)srrt(da*da+dy*dy) 。在主程序中求 p1 和 p2 两个结点之间的距离,由于由 p1 调用 距离函数,所以由 p2 作为它的参数,即 distance(p2) 。 2两个复数只有当它们的实部和虚部分别相等时,才被认为它们相等。在空格处填入合适 的内容,以完成下面的程序,使其重载运算符“ =”,用以比较两个复数的相等。请在主函 数中输出比较的结果。 #include class complex double real,imag; public: comple
14、x(double r,double i) real=r; imag=i; bool operator=(complex ; int complex: operator=(complex if( ) return cout ” truen”; else return cout ” falsen”; 答:(real=com.real) class AA int t; public: AA(int x) t=x; void print(BB ; class BB int s; public: BB(int y) s=y; friend void _print(BB ; void cout ” AA:
15、” T”; BB:” W.Sendl; void main() AA m(6); BB n(8); m.print(n); 答: class BB; AA: AA:pri nt(BB ”,告诉系统BB类在后面定义。因为函数 “print ”是类 AA的成员函数,在类外定义必须加上类名和作用域分辨符,即在处加上 “AA:。在 BB类外定义“ print ”时,因是友元,所以没有加上“ BB:”的必要,但 “AA :”还是必须加的,所以在处填“ AA:print(BB 机器运行结果 7 8 7 9 int add(i nt x,i nt y) return x+y; void mai n() in
16、t m=2,n=3; cout1 : add(m+,m+n)endl; m=2, n=3; cout2 : add(+m,m+n)endl; m=2, n=3; cout3 : add(m+n,m+)endl; m=2, n=3; cout4 : add(m+n,+m)endl; 答:1: 7 2: 8 3: 8 4: 9 解析在说明答案之前,要说明两个问题: 1) C+语言中,函数参数是压在栈里的,因压栈是从前往后进行的,所以出栈就是从后向前 进行的,也即先取最后的参数,然后再向前逐个取用; 2)对于单加运算,m+是先执行后加1, +m是加1后再执行。 由此,因 m=2,n=3;,所以: (
17、m+ (+m (m+r) (m+r) (m+r) (m+n) (m+) (+m) =2+ (2+3) =7 =3+ (2+3) =8 =(3+3) +2=8 =(3+3) +3=9; (m+后执行,且后加1,所以m=2直未变) (+m后执行,但先加1,执行+m时,m=3了) (先执行 m+后加1,执行 m+n时,m=3了) (先执行+m且先加1,故一开始就有 m=3) 4+ 3请分析下面的程序并给出该程序的执行结果。 #include class AA int a; public: AA() cout ” Initualizing AA!n” ; AA() cout ” Destroying
18、AA!n”; ; class BB int b; AA p; public: BB() cout ” Initualizing BB!n” ; BB() cout ” Destroying BB!n”; ; void main() BB X; cout ”Ending main!n”; 答: Initualizing AA! Initualizing BB! Ending main! Destroying BB! Destroying AA! 解析虽然在主程序中只定义了一个类BB的对象,但在类 BB中声明了类AA的对象作为它 的数据成员。 当一个类中含有对象作为数据成员时, 在生成对象时, 先
19、调用成员对象的构造 函数,再调用类自己的构造函数,所以输出了“In itualizi ngAA!”(成员对象构造函数的 输出)和“ Initualizing BB! ”(类自己构造函数的输出) 。对象生成后,执行下一句输出 语句,则输出“ Ending main! ”。此时程序结束,调用析构函数来析构掉对象,先调用类自 身的析构函数,其输出为“ Destroying BB! ”,再调用成员对象的析构函数,其输出为 “ Destroying AA! ”。 4写出下列程序的运行结果。 #include class AA public: static int n; AA() n+; ; int AA
20、:n=0; main() cout ” AA:n= ” AA: nendl; AA d1; coutd1.nendl; AA d2; coutd2.nendl; AA d3,d4; coutd1.nendl; coutd2.nendl; 答: AA:n=0 d1.n=1 d2.n=2 d1.n=4 d2.n=4 解析 由于数据成员 n 的访问属性是公有的,所以在类外可访问它;又它是静态变量, 所以具有全局性。在构造函数中,执行的是n+操作,即每次调用构造函数n就加1。当程 序开始时,因未定义对象,所以n的值为初始化时的值,则输出为“ AA:n=0”。当定义了 对象di后,由于调用了构造函数,则
21、该对象中n=1,故输出“ d1.n=1 ”。同理,对象 d2输 出“ d2.n=2 ”。由于接下来生成了两个对象d3和d4,调用两次构造函数,n两次加1,此 时n=4,所以下面两条语句的输出为“ di.n=4”和“d2.n=4”。 5写出下列程序的输出结果。 #include class AA public: AA cout ” Constructor of AA n” ; fun(); virtual void fun() cout” AA:fun() calle d n” ; ; class BB:public AA public: BB() cout ” Constructor of B
22、B n” ; fun(); void fun() cout ” BB:fun() calle d n” ; ; void main() BB d; 答: Constructor of AA AA:fun() called. Constructor of BB. BB:fun() called. 解析 虽然函数 fun() 说明为虚函数,但当在构造函数中被调用时,呈现的是静态联编,即 基类和派生类都调用各自的函数 fun() 。所以,当生成对象 d 时,先调用基类的构造函数, 在构造函数中又调用自己的函数“ fun() ”,所以输出为“ Constructor of AA ”和 “AA:fun(
23、) called.”。同理调用派生类的构造函数时,生成的输出为“ Constructor of BB.” 和“ BB:fun() called. ”。 6请给出下面的程序的输出结果。 #include template class T void sort(T* a,int n) T num; for(int i=0;in-1;i+) for(int j=i;jaj+1) num=aj; aj=aj+1; aj+1=num; for(i=0;in;i+) coutaiendl; void main() int iver5= 12,45,9,23,37 ; double dver5= 22.3,5
24、6.7,43.5,13.8,8.6 ; sort(iver,5); sort(dver,.5); 答: 9 12 23 37 45 8.6 13.8 22.3 43.5 56.7 解析 这是使用模板的例子。函数 sort 是一个递增的排序函数, T 是个模板。当数组是整 型数据类型时, 它为整型数组排序; 当数组为双精度数据类型时, 它为双精度数组排序。所 以输出如上结果。 7分析以下程序的执行结果 #include void main() int a; int / 变量引用 b=10; couta=aendl; 解: 本题说明变量引用的方法。 b 是 a 的引用,它们分配相同的空间, b 的
25、值即为 a 的值。 所以输出为 a=10 。 8分析以下程序的执行结果 #include class Sample int x; public: Sample(); Sample(int a)x=a; Sample(Sample void disp()coutx=xendl; ; void main() Sample s1(2),s2(s1); s2.disp(); 解: 本题说明类拷贝构造函数的使用方法。 Sample 类的 Sample(Sample int y; void disp() coutx=x,y=y*pc=10; pc= p-*pc=20; p-disp(); 解: 本题说明了
26、类数据成员指针的使用方法。这里通过指向对象的指针来给类数据成员赋 值,其原理与上题相似。输出为: x=10,y=20 10分析以下程序的执行结果 #include class Sample int x; int y; public: Sample(int a,int b) x=a;y=b; int getx()return x; int gety()return y; ; void main() int (Sample:*fp)(); fp= Sample s(2,7); int v=(s.*fp)(); fp= int t=(s.*fp)(); coutv=v,t=tendl; 解: 本题说
27、明了类成员函数指针的使用方法。在 main() 中定义的 fp 是一个指向 Sample 类 成员函数的指针。执行fp=Sample:getx 后。fp指向成员函数getx(),int v=(s.*fp)()语 句等价于 int v.getx(),v=x=2; 执行 fp=Sample:gety 之后, fp 指向成员函数 gety(),int t=(s.*fp)() 语句等价于 int t=s.gety(),t=x=7 。所以输出为: v=2,t=7 11分析以下程序的执行结果 #include class Sample int x; int y; public: Sample(int a,
28、int b) x=a;y=b; int getx()return x; int gety()return y; ; void main() int (Sample:*fp)(); fp= Sample s(2,7),*p= int v=(p-*fp)(); fp= int t=(p-*fp)(); coutv=v,t=tendl; 解: 本题说明了类成员函数指针的使用方法。这里通过指向对象的指针来调用指向类成员 函数的指针,其原理与上题相似。输出仍为: v=2,t=7 12分析以下程序的执行结果 #include class base public: base()coutconstructin
29、g base classendl; base()coutdestructing base classendl; ; class subs:public base public: subs()coutconstructing sub classendl; subs()coutdestructing sub classendl; ; void main() subs s; 解: 本题说明单继承情况下构造函数和析构函数的调用顺序。这里 base 为基类, subs 为 派生类。 所以输出为: constructing base class constructing sub class destruc
30、ting sub class destrcuting base class 注意:在单继承情况下,首先调用基类的构造函数 ,随后调用派生类的构造函数,析构函 数的调用顺序则正好相反。 13 分析以下程序的执行结果: #include class base int n; public: base(int a) coutconstructing base classendl; n=a; coutn=nendl; base()coutdestructing base classendl; ; class subs:public base base bobj; int m; public: subs(
31、int a,int b,int c):base(a),bobj(c) coutconstructing sub cassendl; m=b; coutm=mendl; subs()coutdestructing sub classendl; ; void main() subs s(1,2,3); base 解: 本题说明 派生类中含有对象成员情况下构造函数和析构函数的调用顺序。这里 为基类 ,subs 为派生类, subs 类的构造函数中含有对象成员。 所以输出为: constrcuting base class n=1 constructing base class n=3 constru
32、cting sub class m=2 destructing sub class destructing base class destructing base class 注意:当派生类中含有对象成员时,构造函数的调用顺序如下: 基类的构造函数 2)对象成员的构造函数 3)派生类的构造函数 析构函数的调用顺序与之相反 14分析以下程序的执行结果 #include class A public: int n; ; class B:public A; class C:public A; class D:public B,public C int getn()return B:n; ; void
33、 main() D d; d.B:n=10; d.C:n=20; coutd.B:n,d.C:nendl; 解: D 类是从类和类派生的而类和类又都是从类派生的,但各有自己的副本。所以对于对 象 d, d.B:n 与 d.C:n 是两个不同的数据成员它们互无联系。 所以输出为: 10, 20 15分析以下程序的执行结果 #include class A public: int n; ; class B:virtual public A; class C:virtual public A; class D:public B,public C int getn()return B:n; ; voi
34、d main() D d; d.B:n=10; d.C:n=20; coutd.B:n,d.C:nendl; 解: D类是从类和类派生的而类和类又都是从类派生,但这是虚继承关系即是虚基类因此和共用 一个的副本所以对于对象 d, d.B:n 与 d.C:n 是一个成员。 所以输出为: 20, 20 16分析以下程序执行结果 #include int add(int x,int y) return x+y; double add(double x,double y) return x+y; void main() int a=4,b=6; double c=2.6,d=7.4; coutadd(a
35、,b),add(c,d)endl; 解: 本题说明函数重载的使用方法, 这里有两个 add() 函数,一个 add() 函数的参数与返 回值为 int 型,另一个的参数与返回值为 double 型,它们是根据参数类型自动区分的。 所以输出为: 10 , 10 17分析以下程序的执行结果 #include class Sample int i; double d; public: void setdata(int n)i=n; void setdata(double x)d=x; void disp() couti=i,d=dendl; ; void main() Sample s; s.set
36、data(10); s.setdata(15.6); s.disp(); 解: 本题说明重载成员函数的使用方法。 setdata() 成员函数有两个, 根据其参数类型加以 区分。 所以输出为: i=10, d=15.6 22分析以下程序的执行结果 #include class Sample int n; public: Sample() Sample(int i)n=i; Sample void disp()coutn=nendl; ; Sample return *this; void main() Sample s1(10),s2; s2=s1; s2.disp(); 解: 本题说明重载运
37、算符 (=) 的使用方法。 operator= 成员函数实现两个对象的赋值。 所以输出为: n=10 六程序设计题 1设计一个三角形类 Triangle ,包含三角形三条边长的私有数据成员,另有一个重载运算 符“+”,以实现求两个三角形对象的面积之和。 解:在 Triangle 类中设计一个友元函数 operator+(Triangle t1,Triangle t2) ,它重载运 算符 + ,返回 t1 和 t2 两个三角形的面积之和。 本题程序如下: #include #include class Triangle int x,y,z; double area; public: Triang
38、le(int i,int j,int k) double s; x=i;y=j;z=k; s=(x+y+z)/2.0; area=sqrt(s*(s-x)*(s-y)*(s-z); void disparea() coutArea=areaendl; friend double operator+(Triangle t1,Triangle t2) return t1.area+t2.area; ; void main() Triangle t1(3,4,5),t2(4,5,6); double s; coutt1:; t1.disparea(); coutt2:; t2.disparea();
39、 s=t1+t2; cout 总面积 =sendl; 本程序执行结果如下: t1:Area=6 t2:Area=9.92157 总面积 =15.9216 2重载运算符“ +”友元函数只能返回两个三角形的面积之和,不能计算三个三角形的面积 之和,改进一下,使之能计算任意多个三角形的面积之和。 解: 重载运算符为什么不能计算 3 个三角形的面积之和呢?对于式子 :s=t1+t2+t3 ,先计算 t1+t2 ,返回一个 double 数然后再进行该 double 数 +t3 的计算,显然没有这样的重载运算 符“ +”友元函数,只需要添加这样重载运算符“ +”友元函数即可。 本题程序如下: #incl
40、ude #include class Triangle int x,y,z; double area; public: Triangle(int i,int j,int k) double s; x=i;y=j;z=k; s=(x+y+z)/2.0; area=sqrt(s*(s-x)*(s-y)*(s-z); void disparea() coutArea=areaendl; friend double operator+(Triangle t1,Triangle t2) return t1.area+t2.area; friend double operator+(double d,Tr
41、iangle t) return d+t.area; ; void main() Triangle t1(3,4,5),t2(4,5,6),t3(5,6,7),t4(6,7,8); double s; coutt1:; t1.disparea(); coutt2:; t2.disparea(); coutt3:; t3.disparea(); coutt4:; t4.disparea(); s=t1+t2+t3+t4; cout 总面积 =sendl; 本程序的执行结果如下: t1:Area=6 t2:Area=9.92157 t3:Area=14.6969 t4:Area=20.3332 总面积 =50.9517 3设计一个学生类 student, 包括姓名和三门课程成绩,利用重载运算符” +“将所有学生 的成绩相加放在一个对象中,再对该对象求各门课程的平均分。 解: #include #include #include class student char name10; int deg1,deg2,deg3; public: student() student(char na,int d1,int d2,int d3) strcpy(name,na); deg1=d1;deg2=d2;deg3=d3; friend stud
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 时间管理课件观后感
- 八年级家长会学生发言稿
- 语言康复家长课件
- 中班画妈妈课件
- 2025版个人工业厂房买卖合同样本
- 2025版科技企业债券发行与风险控制合同
- 二零二五年度离婚冷静期法律援助与离婚程序全程服务协议
- 2025版架子工工程安全责任保险合同样本
- 2025承包合同下载:城市轨道交通建设项目合作协议
- 二零二五年度企业年会场地及服务合同范本
- 2025年事业单位工勤技能-河南-河南农机驾驶维修工一级(高级技师)历年参考题库含答案解析(5套)
- 2025至2030中国会议平板行业发展趋势分析有效策略与实施路径评估报告
- 2025年《工会基础知识》试题库及答案
- 2025年幼儿园教师岗位聘任协议(含资格认证及薪酬激励)
- 2025年江苏省靖江市辅警招聘考试试题题库及答案详解(名师系列)
- 机械加工投标技术方案(3篇)
- 2025年高考化学试卷真题完全解读(河北卷)
- 成都东部集团有限公司招聘考试真题2024
- 银行收息管理办法
- 海外房产投资项目方案(3篇)
- 肺癌的护理新进展
评论
0/150
提交评论