OOP技术:面向对象技术1-10章习题

合集下载

c面向对象程序设计课后习题

c面向对象程序设计课后习题

c面向对象程序设计课后习题面向对象程序设计是一种以对象为基本单位的编程范式,它强调数据和行为的封装、继承和多态性。

以下是一些面向对象程序设计的课后习题,旨在帮助学生巩固和深化对面向对象概念的理解。

习题一:封装的实现1. 定义一个类 `Person`,包含私有属性 `name` 和 `age`。

2. 实现公共方法 `getName()` 和 `setName(String name)` 来获取和设置 `name` 属性。

3. 实现公共方法 `getAge()` 和 `setAge(int age)` 来获取和设置`age` 属性。

4. 添加一个构造器,允许在创建 `Person` 对象时初始化 `name` 和`age`。

习题二:继承的应用1. 定义一个基类 `Vehicle`,包含属性 `speed` 和方法 `move()`.2. 创建一个派生类 `Car`,继承自 `Vehicle`,添加属性 `wheels` 和 `color`.3. 重写 `move()` 方法,以反映汽车的移动特性。

4. 添加一个构造器,允许初始化 `Car` 对象的所有属性。

习题三:多态性的使用1. 定义一个接口 `Animal`,包含一个抽象方法 `makeSound()`.2. 创建几个实现类,如 `Dog`,`Cat`,`Bird`,它们都实现了`Animal` 接口。

3. 为每个类实现 `makeSound()` 方法,以产生不同的声音。

4. 编写一个测试类,创建 `Animal` 类型的数组,包含不同种类的动物对象,并调用 `makeSound()` 方法。

习题四:抽象类的使用1. 定义一个抽象类 `Shape`,包含抽象方法 `calculateArea()`.2. 创建几个具体类,如 `Circle`,`Rectangle`,`Triangle`,它们继承自 `Shape` 并实现 `calculateArea()` 方法。

oop基础数学习题集

oop基础数学习题集

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 类对象。

OOP技术:面向对象技术1-10章习题

OOP技术:面向对象技术1-10章习题

OOP技术:习题第1章习题1. 什么是面向对象技术?2. 面向对象与面向过程程序设计有什么不同?3. 面向对象技术有哪些优点?4. 面向对象技术中的封装性有何优缺点?如何克服这些缺点?5. 为什么要应用继承机制?6. C++对多态性的支持体现在哪些方面?7. 目前常用的面向对象程序设计语言有何异同?8. 什么是.NET?第2章习题1. 写出下面程序的运行结果。

#include <iostream.h>void main(){int* a;int* &p=a;int b=10;p=&b;cout<<*a<<endl;cout<<*p<<endl;}2. 写出下面程序的运行结果。

#include <iostream.h>void main(){int iarray[10]={0,2,4,6,8,10,12,14,16,18};int sum=0;int* iptr=iarray;for(int i=0;i<10;i++){sum+=*iptr;iptr++;}cout<<"sum is"<<sum<<endl;}3. 写出下面程序的运行结果。

#include <iostream.h>int m=8;int add3(int x,int y=7,int z=m){ return x+y+z; }void main(){int a=1,b=2,c=3;cout<<add3(a,b)<<endl;cout<<add3(10)<<endl;}4. 编程求所有的水仙花数。

如果一个三位数的个位数、十位数和百位数的立方和等于该数本身,则称该数为水仙花数。

5. 编程求1000以内所有素数。

6. 编写一个可以打印任何一年日历的程序。

oop第1次测试

oop第1次测试

OOP第一阶段测试一、填空题1.面向对象的三大特征是:继承和封装和多态。

2.子类不能(能否)继承父类的私有属性和方法。

3.如果一个方法没有方法体,我们应该把他定义成抽象方法。

4.我们应该把有可能出现异常的代码写在try 里面,不管有没有异常都必须执行的代码应该写在finally 里面。

5.JA V A程序中默认导入了包。

6.JA V A的类都是单继承,接口是多继承。

7.用final修改的方法不能被重写,用final修饰的类不能被继承。

8.用static修改的方法能(能否)直接用类名调用。

9.子类必须通过____super______关键字调用父类有参数的构造函数。

10.构造方法能(能否)被重载,不能被重写。

二、问答题1,什么是方法的重载?答:在一个类中,若有个多个方法名一样, 参数列表不一样,可构成重载,与返回值无关!2,抽象类和接口有哪些相同点和不同点?答:抽象类可以有抽象方法和实例方法,也有构造函数接口中所有的方法皆为抽象方法,变量全部为类常量,没有构造函数它们的相同点:一个类若想继承某个抽象类或者说实现某个接口,那么必须实现其中所有抽象方法,否则此类将还是一个抽象类!3,说出throw关键字和throws关键字的作用。

答:throw用来抛出异常对象,throws 用来抛出异常类三、编程题1、输入一个整数,如果输入的不是整数,那么就输出“不是整数”,否则输出这个整数。

Import java.util.Scanner;public class A{public static void main(String[] args){Scanner in = new Scanner(System.in);int num=0;try{num = in.nextInt();System.out.println(num);}catch(InputMismatchException e){System.out.println(“不是整数!”);}}}2.自定义一个接口,接口中有两个方法method1和method2(),再写一个类去实现这个接口。

第10章 面向对象分析

第10章 面向对象分析
软件工程
第10章 面向对象分析
第10章 面向对象分析
• 面向对象软件开发技术
– 面向对象分析(OOA) – 面向对象设计(OOD) – 面向对象实现(OOP)
面向对象技术是一个有全新概念 的开发模式,其特点是:
(1)方法是对软件开发过程所有阶段进 行综合考虑而得到的; (2)从生存期的一个阶段到下一个阶段 所使用的方法与技术具有高度的连 续性;
取消交易
顾客可在按下选择键前任何一个时刻,拉动退币杆取 消交易收回硬币。
自动售货系统系统
-端1 * -端2
自动售货系统::售货
*
顾客
-端2
-端1 *
自动售货系统::供货
*
供货人
-端1 * -端2
自动售货系统::取货款
*
收银员
自动售货系统系统
-端1 *
-端2
售货
*
<<extends>>
售散装饮料
顾客
• 业务中的执行者扮演什么角色?这些角色可以 看作类,如客户、操作员等。
(2)筛选对象类,确定最终对象类 我们可以用以下选择特征来确定最终的对象: 1) 保留的信息:仅当必须记住有关潜在对象的 信息,系统才能运作时,则该潜在对象在分 析阶段是有用的; 2) 需要的服务:潜在对象必须拥有一组可标识 的操作,它们可以按某种方式修改对象属性 的值; 3) 多个属性:在分析阶段,关注点应该是“较 大的”信息(仅具有单个属性的对象在设计 时可能有用,但在分析阶段,最好把它表示 为另一对象的属性);
定义服务
• 对象=属性+操作(服务) • 因为在动态模型和功能模型中更明确地描 述了每个类中应该提供哪些服务,所以在 建立了这两个模型后才能最终确定类中应 有的服务。 • 事实上,在确定类中应有的服务时,既要 考虑该类实体的常规行为,又要考虑在本 系统中特殊需要的服务。

javaoop练习题

javaoop练习题

一、面向对象基础1. 简述面向对象编程的特点。

2. 解释类和对象的关系。

3. 什么是封装?举例说明。

4. 什么是继承?举例说明。

5. 什么是多态?举例说明。

6. 简述Java中的访问控制符。

7. 什么是构造函数?举例说明。

8. 什么是析构函数?举例说明。

9. 什么是抽象类?举例说明。

10. 什么是接口?举例说明。

二、类和对象1. 定义一个名为Person的类,包含姓名、年龄和性别属性,以及相应的构造函数和get/set方法。

2. 定义一个名为Student的类,继承自Person类,增加学号属性,以及相应的构造函数和get/set方法。

3. 定义一个名为Teacher的类,继承自Person类,增加职称属性,以及相应的构造函数和get/set方法。

4. 定义一个名为Student的类,实现一个名为Study的接口,包含一个名为study的方法。

5. 定义一个名为Teacher的类,实现一个名为Teach的接口,包含一个名为teach的方法。

6. 定义一个名为Car的类,包含引擎、轮胎和油箱属性,以及相应的构造函数和get/set方法。

7. 定义一个名为Engine的类,包含功率和转速属性,以及相应的构造函数和get/set方法。

8. 定义一个名为Tyre的类,包含品牌和尺寸属性,以及相应的构造函数和get/set方法。

9. 定义一个名为OilTank的类,包含容量和油量属性,以及相应的构造函数和get/set方法。

10. 定义一个名为Rectangle的类,包含长和宽属性,以及计算面积和周长的方法。

三、继承和多态1. 定义一个名为Animal的抽象类,包含一个抽象方法名为eat。

2. 定义一个名为Dog的类,继承自Animal类,实现eat方法。

3. 定义一个名为Cat的类,继承自Animal类,实现eat方法。

4. 定义一个名为Bird的类,继承自Animal类,实现eat方法。

5. 定义一个名为Mammal的类,继承自Animal类,包含一个方法名为milk。

oop技术:面向对象技术复习思考题.doc

11.用typedef可以增加新类型。
12.宏替换不占用运行时间。
13.在include命令行中,用双引号和用尖括号将被包含的文件名括起来没有区别。
14.C++编译中的编译预处理可以看作一行C++语句。
15.头文件必须由系统提供。
16.创建派生类对象时,先调用基类的构造函数,再调用派生类的构造函数,当销毁这个对 象时顺序正好相反,先调用派生类的析构函数,再调用基类的析构函数。
cin » c;
if(c == 'c')
(
cout« "you chose 'c'" « endl;
continue; //返回主菜单
}
if(c == d)
(
cout« "you chose'd'" « endl;
continue; //返回主菜单
}
else
(
cout« "you didn't choose c or d!"« endl;
11.在定义拷贝构造函数时,为什么通常还要定义一个重载的赋值运算符?
12.拷贝构造函数在哪几种情况下调用?
%1.判断题
1.C++语言程序中,要调用的函数必须在main。函数中定义。
2.C++语言程序中,main。函数必须放在程序开始的部分。
3.C++语言程序中,urn语句必须放在函数的最后。
4.C++程序中有调用关系的所有函数必须放在同一源程序文件中。
int k;
for(k=0;k<=l 00;k+=50)

面向对象C++程序设计——各章习题答案

面向对象C++程序设计各章习题参考答案第1章面向对象技术概论一.选择题1. A2. C3. D4. B5. C二.填空题1. 封装、继承、多态性2. 面向对象分析(OOA)、面向对象设计(OOD)、面向对象实现(OOI)、面向对象测试(OOT)和面向对象系统维护(OOSM)。

3. 实例实例4. 多态性5. 消息消息传递第2章 C++简单程序设计一.选择题:1. B2. B3. B4. C5. C6. D7. D8. C9. D 10. C11. A 12. A二.填空题:1.4;2;2;8;12. 103. 04. 87;79;115. (1)x值为6,表达式的值为6(2)x值为6,但表达式的值为5(3)x值为4,表达式的值为4(4)x值为5,表达式的值为5(5)x变为6,y的值为5(6)x变为4,y的值为4(7)x变为6,y的值为25(8)x的值为6,y的值为366. const7. c+i*sizeof (c[i])8. x<=3||x>=109. a<=b&&b!=510. 30 30三.程序分析题:1.s=552.a,b99,96,194100.2,94.8,1963.i,s=15,564.13 15 22 14 645.14 25四.编程题(参考答案):1. 假设数组中含8个元素,参考答案如下:#include<iostream.h>void main(){int c=0,i,a[8],k;cout<<"input a[i]:"<<endl;for(i=0;i<8;i++)cin>>a[i];cout<<"input k:"<<endl;cin>>k;for (i=0;i<8;i++)if (a[i]>=k) c++;cout<<c;cout<<endl;}2. 参考答案:#include<iostream.h>void main(){const int n=50,m=10;int i,j,k;int index[n]; //存放学号float s,score[n],sum; //存放成绩for(i=0;i<n;i++)cin>>index[i]>>score[i]; //从键盘输入数据sum+=score[i];cout.precision(2); //设置输出宽度cout<<endl<<"A verage score:"<<sum/n; //输出平均分数cout.width(28); //设置输出宽度cout<<endl<<"Student ID:"; //输出学号for(i=0;i<10;i++) //选取前m名分数最高的学生,输出其学号及成绩{s=score[i];k=i;for(j=i+1;j<n;j++)if(s<score[j]){s=score[j];k=j;}if(k>i){score[k]=score[i];score[i]=s;j=index[k];index[k]=index[i];index[i]=j;}cout.width(4); //输出序号,学号和分数cout<<endl<<i+1;cout.width(11);cout<<index[i];cout.width(12);cout.precision(2);cout<<score[i];}cout<<endl;}3.#include<iostream.h>void main(){double x,y;cout<<”Input x:”;cin>>x;if(x<3.0)y=(x-2)*x;elseif(x>=-3.0&&x<=3.0) y=x;else y=x-2;cout<<”x=”<<x<<”,”<<”y=”<<y<<endl;}执行该程序后,显示如下信息:(分别输入3.2,2,-5) Input x:3.2↙输出结果如下:x=3.2,y=1.2Input x:2↙输出结果如下:x=2,y=2Input x:-5↙输出结果如下:x=-5,y=35该程序中使用了if-else if-else语句,用来实现三路分支。

OOP技术:面向对象程序设计期末复习指导

OOP技术:面向对象程序设计期末复习指导面向对象程序设计课程系中央电大开放教育本科计算机科学与技术专业统设必修课程,本课程的期末复习以中央电大下发的资料和网上复习指导为准。

为了加强期末复习,下面市电大给出一套综合练习题,仅作参考。

综合练习题一、单选题1、 C++源程序文件的默认扩展名为( )。

A:cpp B:exe C:obj D:lik2、用new运算符创建一个含10个元素的一维整型数组的正确语句是( )。

A: int *p=new a[10];B: int *p=new float[10];C: int *p=new int[10];D: int *p=new int[10]={1,2,3,4,5}3、假定有“struct BOOK{char title[40]; float price;}; BOOK *book=new BOOK;”,则正确的语句为()。

A: strcpy((*book)->title,”Wang Tao”);B: strcpy(*book.title,”Wang Tao”);C: strcpy(book->title,”Wang Tao”);D: strcpy(book.title,”Wang Tao”);4、假定指针变量p定义为“int *p=new int[30];”,要释放p所指向的动态内存,应使用语句()。

A: delete p;B: delete *p;C: delete &p;D: delete []p;5、关于消息,下列说法中不正确的是()。

A: 发送消息的对象请求服务,接受消息的对象提供服务B: 消息的发送者必须了解消息的接收者如何相应消息C: 在C++中,消息的发送具体体现为对接收消息的对象的某个函数的调用D: 每个对象只能接收某些特定格式的消息6、对于任一个类,用户所能定义的析构函数的个数至多为( )。

A: 0 B: 1 C: 2 D: 任意个7、 do语句能够改写为()语句。

OOP技术:面向对象基础知识题

OOP技术面向对象基础知识题一、判断题1.面向对象的程序设计是一种以对象为基础,由事件驱动对象执行程序的设计方法。

2.所谓属性是指对象的名字、大小、位置和颜色等特性。

3.方法是对象调用的、用来完成特定操作的特殊子程序。

4.一个工程必须有一个启动对象,默认的启动对象是第一个被创建的窗体。

5.可以在程序设计阶段通过属性窗口,也可以通过程序代码设置对象的属性。

6.如果对象的Enabled属性为False,则对象不对事件做出响应。

*7.除了作为启动对象的窗体外,工程中其他的窗体只有通过加载语句或相关的对象方法对窗体进行加载,并设置可见,窗体才会显示在屏幕上。

*8.在窗体中用Show或Hide方法和在代码中将Visible属性分别设置True 或False 的效果是一样的。

9.窗体的Caption 属性用来设置窗体的标题,在代码中可用这个标题引用该窗体。

*10.当对象具有焦点时,按下键盘上一个键会触发该对象的KeyDown 事件。

*11.当对象具有焦点时,松开键盘上一个键会触发该对象的KeyUp 事件。

*12.当对象具有焦点时,按下、松开键盘上一个键会触发该对象的KeyPress 事件。

该事件先于KeyDown事件而后于KeyUp事件发生。

13.窗体的Enabled属性为False时,窗体上的按钮、文本框等控件仍会对用户的操作做出反应。

*14.执行Form1.Hide 语句,窗体Form1被隐藏,同时Form1的Visible属性自动被置成False。

*15.在一个窗体的代码中不能使用UnLoad语句来卸载本窗体,即一个窗体只能由其他窗体卸载。

16.语句Form1.Move 1000,1200把窗体Form1移动到水平坐标为1000单位,把窗体宽度改成为1200单位。

17.在程序代码中设置对象属性时,若对象名缺省,则隐含指当前窗体对象的属性。

18.Print方法的缺省对象是当前窗体。

19.在程序代码中,可以用赋值语句给对象的属性赋值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

OOP技术:习题第1章习题1. 什么是面向对象技术?2. 面向对象与面向过程程序设计有什么不同?3. 面向对象技术有哪些优点?4. 面向对象技术中的封装性有何优缺点?如何克服这些缺点?5. 为什么要应用继承机制?6. C++对多态性的支持体现在哪些方面?7. 目前常用的面向对象程序设计语言有何异同?8. 什么是.NET?第2章习题1. 写出下面程序的运行结果。

#include <iostream.h>void main(){int* a;int* &p=a;int b=10;p=&b;cout<<*a<<endl;cout<<*p<<endl;}2. 写出下面程序的运行结果。

#include <iostream.h>void main(){int iarray[10]={0,2,4,6,8,10,12,14,16,18};int sum=0;int* iptr=iarray;for(int i=0;i<10;i++){sum+=*iptr;iptr++;}cout<<"sum is"<<sum<<endl;}3. 写出下面程序的运行结果。

#include <iostream.h>int m=8;int add3(int x,int y=7,int z=m){ return x+y+z; }void main(){int a=1,b=2,c=3;cout<<add3(a,b)<<endl;cout<<add3(10)<<endl;}4. 编程求所有的水仙花数。

如果一个三位数的个位数、十位数和百位数的立方和等于该数本身,则称该数为水仙花数。

5. 编程求1000以内所有素数。

6. 编写一个可以打印任何一年日历的程序。

7. 在10000以内验证哥德巴赫猜想之“1+1”命题:任意大的偶数,都可以表示为两个素数之和。

8. 编写一个函数,用冒泡法对输入的十个整数从小到大排序。

9. 编写一个函数,输入一个十六进制数,输出相应的十进制数。

10. 将给定的一个二维数组(3×3)转置,即行列互换。

11. 用非递归的函数调用方式求fibonaci数列第n项。

fibonaci数列形如:0,1,1,2,3,5,8,13,┄其通项为:F0=0;F1=1;┄;F n=F n-1+F n-2。

12. 编写重载函数max,分别返回字符数组、int数组、long数组、float数组、double 数组和字符串数组的最大元素。

第3章习题1. 类定义由哪些部分组成?在定义和使用时要注意什么问题?2. 说明一个类的公有成员、保护成员和私有成员的区别。

3. 何时执行类构造函数及析构函数?若该对象作为类的成员,何时执行其构造函数和析构函数?4. 创建一个Employee类,该类中有字符数组,表示姓名、街道地址、市、省和邮政编码。

其功能有修改姓名、显示数据信息。

要求其功能函数的原型放在类定义中,构造函数初始化每个成员,显示信息函数要求把对象中的完整信息打印出来。

其中数据成员为保护的,函数为公有的。

5. 修改第4题中的类,将姓名构成Name类,其名和姓在该类中为保护数据成员,其构造函数为接受一个指向完整姓名字符串的指针。

该类可显示姓名。

然后将Employee类中的姓名成员(字符数组)修改为Name类对象。

6. 改正下列程序中的错误,并说明理由。

程序1:include <iostrea.h>;class Student{publicvoid Student()void display(){cin<<'number:'<<number<<endlcout<<name:<<name<<endl;cout<<score:<<score<<endl;private:int number,char* name,float score;}程序2:include <iostream.h>;class example(){private:int date;static int countpublic;void example(int y=10)(date=y;)(cout<<"date="<<date;return count;)}7. 写出下面程序的运行结果。

注意:构造函数和析构函数的执行次序、构造函数的初始化表。

#include <iostream.h>class Ex{public:Ex(int x,char c='c');~Ex(){cout<<'B'<<endl;}void outdata(void){cout<<ch<<da<<endl;}private:int da;char ch;};void main(){Ex x(3,'a'),y(1);Ex z[2]={Ex(10,'a'),Ex(1,'d')};x.outdata();y.outdata();z[0].outdata();}Ex::Ex(int x,char c):da(x),ch(c) {cout<<'A'<<endl;}8. 写出下面程序的运行结果。

#include <iostream.h>#include <string.h>#include <stdio.h>class Ex{public:Ex(const char* s){len=strlen(s);p=new char[len+1];strcpy(p,s);}Ex(){p=new char[8];cout<<"****"<<endl;}Ex(const Ex& st){len=strlen(st.p);p=new char[len+1];strcpy(p,st.p);}~Ex(){delete p;}void outdata(void){printf("%x:%d ,%x:%s\n",&len,len,&p,p);}private:int len;char* p;};void main(){Ex x("first");Ex y=x,z;x.outdata();y.outdata();}9. 写出下面程序的运行结果。

#include <iostream.h>class MyClass{public:MyClass();MyClass(int);void Display();~MyClass();protected:int number;};MyClass::MyClass(){cout<<"Constructing normally\n";}MyClass::MyClass(int m){number=m;cout<<"Constructing with a number:"<<number<<endl;}void MyClass::Display(){cout<<"Display a number:"<<number<<endl;}MyClass::~MyClass(){cout<<"Destructing\n";}void main(){MyClass obj1;MyClass obj2(10);obj1.Display();obj2.Display();}10. 什么是静态数据成员?它有何特点?11. 编写一个类,声明一个数据成员和一个静态数据成员。

其构造函数初始化数据成员,并把静态数据成员加1,其析构函数把静态数据成员减1。

(1)编写一个应用程序,创建该类的3个对象,然后显示其数据成员和静态数据成员,再析构每个对象,并显示它们对静态数据成员的影响。

(2)修改该类,增加静态成员函数并访问静态数据成员,并声明静态数据成员为保护成员。

体会静态成员函数的使用,静态成员之间与非静态成员之间互访问题。

12. 假设有两个类Student和Score,使用时,怎样允许Score成员访问Student中的私有成员和保护成员?13. 为什么要定义友元?友元有哪几种类型?14.改正下面代码的错误。

#include <iostream.h>class Animal;void SetValue(Animal&,int);void SetValue(Animal&,int,int);class Animal{public:friend void setValue(Animal&,int);protected:int itsWeight;int itsAge;};void SetValue(Animal& ta,int tw){ta.itsWeight=tw;}void SetValue(Animal& ta,int tw,int tn){ta.itsWeught=tw;ta.itsAge=tn;}void main(){Animal peppy;SetValue(peppy,5);SetValue(peppy,7,9);}将第14题程序中的友元改成普通函数,为此增加访问类中保护数据的成员函数。

第4章习题1. 什么是继承?它在软件设计中有什么作用?2. 比较类的三种继承方式之间的差别。

3. 如果派生类B已经重新定义了基类A的一个成员函数fn1(),没有定义重载成员函数fn2(),怎样调用基类的成员函数fn1()、fn2()?4. 写出运行结果,分析程序中的访问权限,并回答所列问题。

#include <iostream.h>class A{public:void f1();A(){cout<<"A Constructor"<<endl;i1=10;j1=11;cout<<"i1="<<i1<<"j1="<<j1<<endl;}~A(){cout<<"A Destructor"<<endl;}protected:int j1;private:int i1;};class B:public A{public:void f2();B(){cout<<"B Constructor"<<endl;i2=20;j2=21;cout<<"i2="<<i2<<"j2="<<j2<<endl;}~B(){cout<<"B Destructor"<<endl;} protected:int j2;private:int i2;};class C:public B{public:void f3();C(){cout<<"C Constructor"<<endl;i3=30;j3=31;cout<<"i3="<<i3<<"j3="<<j3<<endl;}~C(){cout<<"C Destructor"<<endl;} protected:int j3;private:int i3;};void main(){A a;B b;C c;}(1)派生类B中成员函数f2()能否访问基类A中的成员f1()、i1和j1?(2)派生类B的对象b能否访问基类A中的成员f1()、i1和j1?(3)派生类C中成员函数 f3()能否访问直接基类 B中的成员 f2()、j2和i2?能否访问间接基类A中的成员f1()、j1和i1?(4)派生类C的对象c能否访问直接基类B中的成员f2()、i2和j2呢?能否访问间接基类A中的成员f1()、j1和i1?(5)根据上述结果总结继承中构造函数和析构函数的调用顺序。

相关文档
最新文档