13 接口及对象关系练习题
- 格式:pdf
- 大小:142.21 KB
- 文档页数:2
面向对象程序设计练习题库与答案一、单选题(共36题,每题1分,共36分)1.下列关于静态内部类的说法,错误的是()A、静态内部类不能直接访问外部类的非静态成员B、静态内部类只能访问外部类的静态成员C、创建静态内部类的对象时,必须要先创建外部类的对象D、静态内部类,就是使用static关键字修饰的成员内部类正确答案:C2.以下选项中,哪个是FileInputStream的父类()A、FileB、FileOutputC、OutputStreamD、InputStream正确答案:D答案解析:FileInputStream是用来读取文件的字节流,属于InputStream类的子类。
3.下面关于FileInputStream和FileOutputStream的说法中,错误的是()A、FileInputStream是InputStream的子类,它是操作文件的字节输入流B、FileOutputStream是OutputStream的子类,它是操作文件的字节输出流C、如果使用FileOutputStream向一个已存在的文件中写入数据,那么写入的数据会被追加到该文件原先的数据后面D、使用FileInputStream读取文件数据时,必须保证要读取的文件存在并且是可读的正确答案:C答案解析:如果使用FileOutputStream向一个已存在的文件中写入数据,如果构造函数FileOutputStream的参数append的值是true,那么写入的数据才会追加到原先数据之后,否则的话,原先的数据会被清空,然后再写入新的数据。
4.下列关于类的说法中,错误的是()A、Java中创建类的关键字是class。
B、类中可以有属性与方法,属性用于描述对象的特征,方法用于描述对象的行为。
C、Java中对象的创建,首先需要定义出一个类。
D、一个类只能创建一个对象。
正确答案:D答案解析:类是对象的模板,对象是类的实例,一个类是可以创建多个对象的。
接口的练习题接口是面向对象编程中的一个重要概念,它定义了类与类之间的协议。
在Java语言中,接口通过关键字“interface”来定义,可以理解为一种抽象的类,它只包含常量和抽象方法的声明。
接口的作用是实现多重继承,让一个类可以同时拥有多个接口的特性。
接下来,我们将通过一些练习题来深入理解接口的使用。
1. 定义一个接口Shape,包含一个计算面积的抽象方法getArea()和一个计算周长的抽象方法getPerimeter()。
```public interface Shape {double getArea();double getPerimeter();}```2. 创建一个矩形类Rectangle,实现Shape接口。
```public class Rectangle implements Shape {private double width;private double height;public Rectangle(double width, double height) { this.width = width;this.height = height;}@Overridepublic double getArea() {return width * height;}@Overridepublic double getPerimeter() {return 2 * (width + height);}}```3. 创建一个圆形类Circle,实现Shape接口。
```public class Circle implements Shape {private double radius;public Circle(double radius) {this.radius = radius;}@Overridepublic double getArea() {return Math.PI * radius * radius;}@Overridepublic double getPerimeter() {return 2 * Math.PI * radius;}}```4. 创建一个测试类Test,用于测试Rectangle和Circle类的功能。
一、基础语法1. 变量和数据类型定义变量并赋值数据类型转换列表和元组操作2. 控制流条件语句循环语句break和continue语句3. 函数定义和调用函数递归函数默认参数和可变参数4. 模块和包导入模块模块中的函数和变量创建自定义模块二、面向对象编程1. 类和对象创建类和实例化对象类的继承方法重写和多态2. 属性和装饰器属性的getter和setter类装饰器方法装饰器3. 封装和抽象封装原理抽象类和抽象方法抽象基类4. 异常处理tryexcept语句自定义异常异常传播三、文件操作1. 文件读取打开和关闭文件读取文件内容文件读取示例2. 文件写入写入文件内容文件追加文件写入示例3. 文件路径路径操作文件路径示例四、网络编程1. 基础网络TCP/IP协议套接字编程基础网络示例2. HTTP请求发送HTTP请求获取HTTP响应HTTP请求示例3. 请求使用SSL/TLS加密请求示例五、数据结构和算法1. 列表列表操作列表排序列表示例2. 集合集合操作集合示例3. 字典字典操作字典示例4. 排序算法冒泡排序选择排序快速排序5. 查找算法线性查找二分查找哈希表查找六、数据库操作1. SQLite数据库创建数据库和表插入、更新、删除数据查询数据2. MySQL数据库连接MySQL数据库创建表和索引数据操作3. ORM框架使用Django ORM使用FlaskSQLAlchemy ORM示例七、Web开发1. Flask框架创建Flask应用路由和视图模板渲染2. Django框架创建Django项目模型、视图、模板表单处理3. JavaScript和jQuery基础JavaScript语法 jQuery操作DOMAJAX请求八、自动化测试1. 单元测试使用unittest模块编写测试用例测试覆盖率2. 集成测试使用pytest模块编写集成测试用例测试环境配置3. 自动化测试框架使用Selenium使用Robot Framework自动化测试示例九、并发编程1. 多线程创建线程线程同步线程安全2. 多进程创建进程进程间通信进程池3. 异步编程使用asyncio库协程和事件循环异步IO4. 并发工具使用queue模块使用threading模块使用multiprocessing模块十、网络爬虫1. 爬虫基础爬取网页内容解析HTML内容模拟浏览器行为2. 数据提取提取网页中的数据数据清洗和存储数据爬取示例3. 反爬虫策略处理IP封禁处理验证码使用代理IP4. 分布式爬虫使用Scrapy框架分布式任务调度分布式爬虫示例十一、机器学习1. 数据预处理数据清洗特征提取数据可视化2. 线性回归线性回归模型模型训练和评估线性回归应用3. 决策树决策树模型模型训练和评估决策树应用4. 支持向量机支持向量机模型模型训练和评估支持向量机应用十二、Web框架1. Django创建Django项目使用Django模型Django视图和模板2. Flask创建Flask应用使用Flask蓝图Flask中间件3. FastAPI创建FastAPI应用使用FastAPI路由FastAPI依赖注入4. Tornado创建Tornado应用使用Tornado异步处理 Tornado模板十三、API开发1. RESTful API设计资源和操作HTTP方法路由设计2. JSON和XML数据格式JSON数据解析XML数据解析数据序列化和反序列化3. API安全认证和授权数据加密API安全测试4. API文档使用Swagger使用RedocAPI文档编写十四、软件工程1. 版本控制使用Git分支管理代码合并和冲突解决2. 代码审查审查流程审查工具代码质量提升3. 代码风格和规范PEP 8编码规范使用代码风格检查工具代码重构4. 项目管理使用Trello使用Jira项目进度跟踪十五、操作系统1. 进程管理进程状态转换进程同步与互斥进程调度算法2. 内存管理内存分配与回收分页和分段虚拟内存3. 文件系统文件和目录操作文件存储结构文件系统性能优化4. 网络协议TCP/IP协议栈套接字编程网络安全协议十六、数据库高级1. MySQL高级特性存储引擎索引优化性能调优2. NoSQL数据库MongoDBRedis数据模型和操作3. 数据库连接池连接池原理连接池配置连接池管理4. 数据库备份与恢复备份策略恢复流程备份恢复工具十七、云计算1. 云服务模型IaaS、PaaS、SaaS 云计算平台云服务提供商2. 虚拟化技术虚拟机容器技术虚拟化原理3. 云存储云存储服务数据备份与恢复云存储性能优化4. 云安全云安全架构数据加密云安全最佳实践十八、网络安全1. 网络攻击类型DDoS攻击SQL注入XSS攻击2. 防火墙和入侵检测系统防火墙规则入侵检测系统安全策略3. 加密技术对称加密非对称加密数字签名4. 安全协议SSL/TLSIPsecSSH十九、移动开发1. Android开发Activity生命周期广播接收器SQLite数据库2. iOS开发ObjectiveCSwiftUIKit框架3. 响应式设计响应式布局媒体查询移动端优化4. 移动端安全应用安全数据安全用户隐私保护1. 机器学习算法神经网络决策树支持向量机2. 深度学习卷积神经网络循环神经网络对抗网络3. 自然语言处理文本分类机器翻译语音识别4. 计算机视觉图像识别目标检测3D重建,二十一、软件测试1. 单元测试框架unittestpytestnose2. 集成测试测试驱动开发测试金字塔测试覆盖率分析3. 性能测试压力测试负载测试性能瓶颈分析4. 安全测试漏洞扫描漏洞利用安全测试报告二十二、版本控制1. Git分支管理分支策略分支合并分支冲突解决2. Subversion(SVN)版本库操作提交和更新修订历史查询3. Gitflow工作流程特定场景下的Git工作流程发布流程维护和开发分支4. 分布式版本控制系统GitLabBitbucketGitHub二十三、项目管理1. 项目计划项目目标设定项目范围定义项目时间表2. 项目监控进度跟踪资源管理风险评估3. 项目沟通团队沟通策略会议管理沟通工具使用4. 项目交付版本发布用户培训二十四、软件架构1. 架构风格微服务架构容器化架构微服务与容器化结合2. 分布式系统设计服务发现负载均衡分布式事务3. 高可用架构数据库复制高可用集群故障转移机制4. 云原生架构Kubernetes服务网格容器编排二十五、前端开发1. HTML/CSSHTML5新特性CSS3动画响应式设计2. JavaScript框架ReactAngularVue.js3. 前端工具链WebpackBabelGulp4. 前端性能优化图片优化CSS优化JavaScript性能分析二十六、后端开发1. RESTful API设计RESTful原则API文档编写API测试2. Web框架比较Django vs FlaskSpring Boot vs Express Ru on Rails vs Laravel 3. 数据库设计ER图设计关系型数据库设计非关系型数据库设计4. 安全设计身份验证和授权数据加密安全漏洞防护答案一、基础语法1. 变量和数据类型定义变量并赋值数据类型转换列表和元组操作2. 控制流条件语句循环语句break和continue语句3. 函数定义和调用函数递归函数默认参数和可变参数4. 模块和包导入模块模块中的函数和变量创建自定义模块二、面向对象编程1. 类和对象创建类和实例化对象类的继承方法重写和多态2. 属性和装饰器属性的getter和setter类装饰器方法装饰器3. 封装和抽象封装原理抽象类和抽象方法抽象基类4. 异常处理tryexcept语句自定义异常异常传播三、文件操作1. 文件读取打开和关闭文件读取文件内容文件读取示例2. 文件写入写入文件内容文件追加文件写入示例3. 文件路径路径操作文件路径示例四、网络编程1. 基础网络TCP/IP协议套接字编程基础网络示例2. HTTP请求发送HTTP请求获取HTTP响应HTTP请求示例3. 请求使用SSL/TLS加密请求示例五、数据结构和算法1. 列表列表操作列表排序列表示例2. 集合集合操作集合示例3. 字典字典操作字典示例4. 排序算法冒泡排序选择排序快速排序5. 查找算法线性查找二分查找哈希表查找六、数据库操作1. SQLite数据库创建数据库和表插入、更新、删除数据查询数据2. MySQL数据库连接MySQL数据库创建表和索引数据操作3. ORM框架使用Django ORM使用FlaskSQLAlchemy ORM示例七、Web开发1. Flask框架创建Flask应用路由和视图模板渲染2. Django框架创建Django项目模型、视图、模板表单处理3. JavaScript和jQuery基础JavaScript语法 jQuery操作DOMAJAX请求八、自动化测试1. 单元测试使用unittest模块编写测试用例测试覆盖率2. 集成测试使用pytest模块编写集成测试用例测试环境配置3. 自动化测试框架使用Selenium使用Robot Framework自动化测试示例九、并发编程1. 多线程创建线程线程同步线程安全2. 多进程创建进程进程间通信进程池3. 异步编程使用asyncio库协程和事件循环异步IO4. 并发工具使用queue模块使用threading模块使用multiprocessing模块十、网络爬虫1. 爬虫基础爬取网页内容解析HTML内容模拟浏览器行为2. 数据提取提取网页中的数据数据清洗和存储数据爬取示例3. 反爬虫策略处理IP封禁处理验证码使用代理IP4. 分布式爬虫使用Scrapy框架分布式任务调度。
对象图试题及答案1. 什么是对象图?对象图是UML(统一建模语言)中的一种图,用于展示系统中对象的静态结构。
它描述了对象的实例以及对象之间的关系。
2. 对象图和类图有什么区别?对象图是类图的实例,展示了系统中对象的实例以及它们之间的关系。
而类图则描述了系统中的类以及类之间的关系。
3. 对象图中通常包含哪些元素?对象图中通常包含以下元素:- 对象:用矩形表示,矩形内包含对象的名称和属性值。
- 关系:用线连接对象,表示对象之间的关系。
- 消息:用带箭头的线表示对象之间的交互。
4. 如何在对象图中表示关联关系?关联关系在对象图中用一条线表示,线的两端分别连接着相关的对象。
5. 对象图中的聚合关系如何表示?聚合关系在对象图中用一条带有空心菱形的线表示,菱形位于聚合的端。
6. 组合关系在对象图中如何表示?组合关系在对象图中用一条带有实心菱形的线表示,菱形位于组合的端。
7. 在对象图中如何表示继承关系?继承关系在对象图中用一条带有空心箭头的线表示,箭头指向基类。
8. 对象图中的依赖关系如何表示?依赖关系在对象图中用一条虚线表示,线的一端连接着依赖的对象。
9. 请描述一个简单的对象图示例。
假设有一个银行系统,其中包含客户和账户两个类。
客户类有一个属性是账户,表示客户拥有的账户。
对象图可以表示为:- 客户对象A,属性值包括姓名和账户。
- 账户对象B,属性值包括账户号码和余额。
- 客户对象A和账户对象B之间存在一个关联关系。
10. 在对象图中,如何表示一个对象的创建?对象的创建在对象图中用一条带有实心圆点的线表示,圆点位于创建的对象端。
11. 对象图可以用于哪些场景?对象图可以用于以下场景:- 展示系统的一个特定时刻的状态。
- 展示系统在特定操作过程中的状态。
- 展示系统在特定条件下的状态。
12. 对象图在软件开发中的作用是什么?对象图在软件开发中的作用包括:- 帮助开发者理解系统的静态结构。
- 辅助开发者设计和实现系统。
面向对象考试题目和答案一、单项选择题(每题2分,共20分)1. 面向对象程序设计中,对象的状态由()来表示。
A. 属性B. 方法C. 消息D. 类答案:A2. 在面向对象程序设计中,封装的目的是()。
A. 隐藏对象的属性B. 隐藏对象的方法C. 隐藏对象的实现细节D. 隐藏对象的消息答案:C3. 面向对象程序设计中,继承的主要优点是()。
A. 重用代码B. 减少代码量C. 提高程序的可读性D. 所有以上选项答案:D4. 在面向对象程序设计中,多态性是指()。
A. 一个对象可以有多个类B. 一个类可以有多个对象C. 一个消息可以有多个行为D. 一个类可以有多个属性答案:C5. 在面向对象程序设计中,以下哪个不是类的组成部分()。
A. 属性B. 方法D. 函数答案:D6. 在面向对象程序设计中,以下哪个概念不是面向对象的核心概念()。
A. 封装B. 继承C. 多态D. 过程答案:D7. 在面向对象程序设计中,以下哪个概念是面向对象的核心概念之一()。
A. 函数B. 过程C. 消息D. 抽象8. 在面向对象程序设计中,以下哪个不是类的成员()。
A. 属性B. 方法C. 函数D. 消息答案:C9. 在面向对象程序设计中,以下哪个不是类的属性()。
A. 私有属性B. 保护属性C. 公共属性D. 全局属性答案:D10. 在面向对象程序设计中,以下哪个不是类的访问修饰符()。
B. 保护C. 公共D. 静态答案:D二、多项选择题(每题3分,共15分)1. 面向对象程序设计中,以下哪些是类的属性()。
A. 私有属性B. 保护属性C. 公共属性D. 全局属性答案:ABC2. 面向对象程序设计中,以下哪些是类的成员()。
A. 属性C. 函数D. 消息答案:ABD3. 面向对象程序设计中,以下哪些是类的访问修饰符()。
A. 私有B. 保护C. 公共D. 静态答案:ABC4. 面向对象程序设计中,以下哪些是面向对象的核心概念()。
13接口及对象关系练习题【练习题】接口及类练习1. 创建接口飞翔Ifly该接口只包含方法飞fly()2. 创建动物抽象类Animal包含抽象方法:1)吃eat()2)睡觉sleep()公共属性:name3. 创建鸽子类Pigeon1)鸽子类继承动物类并实现飞翔接口2)添加属性:鸽子类别pType4. 创建飞机类Plane1)飞机类实现飞翔接口2)添加公共属性:飞机名name飞机所属单位pCompy5. 在主方法中1)实例化鸽子对象信鸽:xinge信鸽的名字为:tom ; 类别为:信鸽让信鸽飞翔2)实例化飞机对象直升机:whirlybird直升机的名字为:长江8号所属单位为:解放军A1001部队让该直升机飞翔6. 设计人类1)人类控制飞翔接口,控制方法:Ctrl(Ifly ff)2) 公共属性:Name7. 在主方法中实例化人,名字为:merrymerry 调用控制方法:让直升机飞翔merry 调用控制方法:让信鸽飞翔【练习题】对象关系练习设计图书信息类、学生类,用于模仿学生借阅图书信息。
尤其注意学生借阅图书信息应如何表达。
借阅图书方法应包含在学生类中还是图书类中?借阅图书的方法是否有参数?【练习题】对象关系练习模拟主人与小狗关系,要求:主人能找到自己的小狗,小狗能找到自己的主人控制台输出:主人:merry 有一条狗叫花花品种是金巴小狗:花花的主人是merry升级版的主人与狗每一个可以养多条狗(用数组实现,注意是在修改狗类还是主人类)每条狗都可以讨好自己的主人主人可以转让自己的任意一条狗(若没有任何狗则不能转让)转让给新主人时,若新主人的狗数已达到,则不能接收该狗控制台输出:主人:merry 可以有3 条狗名字是:小花小黄小红主人:jack 可以有2 条狗名字是:花花花花讨好主人jack小红讨好主人merrymerry 将狗小黄转让给jackmerry 现在有狗:小花小红jack 现在有狗:花花小黄jack 将狗花花转让给merryjack 现在有狗:小黄merry 现在有狗:小花小红花花。
接口编程练习题在软件开发中,接口编程是一项非常重要的技能。
通过接口编程,我们可以实现不同模块之间的通信和交互,提高代码的可复用性和可维护性。
为了帮助大家熟悉接口编程,我将给出一些接口编程的练习题,供大家实践和探索。
练习题一:接口定义请定义一个名为"Shape"的接口,具有计算面积和计算周长的两个方法。
这个接口可以被不同的图形类实现,比如圆形、正方形等。
每个图形类都需要实现这两个方法,并根据具体的形状计算出相应的面积和周长。
练习题二:接口的实现请创建一个圆形类"Circle",实现上述"Shape"接口,并根据半径计算圆形的面积和周长。
具体的计算公式可以自行选择。
练习题三:多态性应用请创建一个方法"printShapeInfo",接收一个"Shape"类型的参数,并打印该图形的面积和周长信息。
在方法内部,借助接口的多态性,可以接收不同形状的图形对象,并调用对应的方法。
练习题四:接口的扩展请思考并设计一个扩展"Shape"接口的子接口或实现类,增加计算体积的方法。
然后创建一个相应的图形类,实现该接口,并实现计算体积的方法。
练习题五:接口的应用场景请思考并描述在实际项目中,接口编程可以带来哪些好处和应用场景。
举例说明接口编程在实践中的应用情景,以及通过接口编程实现的功能和效果。
通过以上的练习题,我们可以初步了解和掌握接口编程的基本概念和用法。
接口编程的灵活性和可扩展性使得我们可以更好地进行模块化开发和代码复用,提高项目的开发效率和质量。
在实际的软件开发中,合理地运用接口编程可以帮助我们更好地组织和管理代码,提高系统的可维护性和可拓展性,是一个非常重要的编程技能。
希望大家通过这些接口编程的练习题,能够更加深入地理解和应用接口编程的思想和方法,为自己的软件开发能力提升打下坚实的基础。
希望大家能够在实践中不断探索和学习,不断提高自己的编程水平。
面向对象编程基本知识练习一、判断题1.不需要定义类,就能创建对象。
()2.构造方法用于给类的private 实例变量赋值。
()3.对象一经声明就可以立即使用。
()4.在定义变量和方法时,必须清楚地在其面前标上访问权限修饰符。
()5.Java 程序中的参数传递都是把参数值传递给方法定义中的参数。
()6.在类定义中,成员访问权限修饰符不能多次出现。
()7.new 操作符动态地为对象按其指定的类型分配内存,并返回该类型的一个引用。
()8.类的方法通常设为public,而类的实例变量一般也设为public。
()9.构造方法在创建对象时被调用。
()10.通过点运算符与类对象的引用相连,可以访问此类的成员。
()11.声明为protected 的类成员只能被此类中的方法访问。
()12.同一个类的对象使用不同的内存段,但静态成员共享相同的内存空间。
()13.类的成员变量可以放在类体的任意位置。
()14.声明为protected 的类成员可以被此类作用域中的任何对象访问。
()15.没有返回值的方法可以用void 来表示,也可以不加。
()二、选择题1. 下面对对象概念描述错误的是:( )A 操作是对象的动态属性B 任何对象都必须有继承性C 对象间的通讯靠消息传递D 对象是属性和方法的封装体2.编译并运行下面的程序,运行结果为:( )public class A{public static void main(String[] args){A a=new A();a.method(8);}void method(int i){System.out.println(“int:“+i);}void method(long i){System.out.println(“long:“+i);}}A 程序可以编译运行,输出结果为int:8B 程序可以编译运行,输出结果为long:8C 程序有编译错误,因为两个method()方法必须定义为静态(static)的D 程序可以编译运行,但没有输出3.下面关于类的说法不正确的是:()A 类是Java 语言中的一种复合数据类型B 类中不包含数据变量和方法C 类是对所有具有一定共性的对象的抽象D Java 语言的类只支持单继承4.能作为类及其成员的修饰符是:()A interfaceB classC protectedD public5.设x、y 均为已定义的类名,下列声明对象x1 的语句不可能正确的是:()A public x xl=new y();B public y xl=new x();C x xl=new x();D x xl=x();6.面向对象程序设计技术的特点是:()A 可重用性B 可维护性C 表示方法的一致性D 可重用性、可维护性、表示方法的一致性7.下列方法定义中,方法头不正确的是:()A public static x(double a){…}B public static int x(double y){…}C void x(double d)D public int x(){…}8.设已声明了一个类A 的两个对象al、a2,为了初始化a1 和a2,下面语句正确的是:()A al=new(); a2=new();B al=A new(); a2=A new();C al,a2=new A();D al=new A(); a2=new A();9.构造方法何时被调用?()A 类定义时B 使用对象的变量时C 调用对象方法时D 创建对象时10.下列哪个类声明是正确的?()A public abstract class Car{…}B abstract private move(){…}C protected private number;D abstra ct final class Hl{…}11.下列不属于面向对象程序设计的基本特征的是:()B 封装C 继承D 静态12.请看下面的程序段class Person {String name,department;int age;public Person(String n) { name = n; }public Person(String n,int a) { name = n; age = a; }public Person(String n,String d,int a) {//doing the same as two arguments version of constructer//including assignment name=n,age=a}}下面那一选项可以添加到“//doing the same……”处:()A Person(n,a)B this(Person(n,a))C this(n,a)D this(name.age)13.()是一个特殊的方法,用于对类的实例变量进行初始化。
java面向对象程序设计期末考试题及答案一、选择题(每题2分,共20分)1. 在Java中,以下哪个关键字用于声明一个类?A. classB. interfaceC. structD. enum答案:A2. Java中的继承是?A. 单继承B. 多继承C. 无继承D. 混合继承答案:A3. 下列哪个是Java中的访问修饰符?A. privateB. protectedC. publicD. 以上都是答案:D4. Java中哪个关键字用于实现多态?A. abstractB. finalC. staticD. override答案:D5. Java中接口和抽象类的主要区别是?A. 接口可以有构造方法B. 抽象类可以有构造方法C. 接口不能有构造方法D. 抽象类不能有构造方法答案:C6. 在Java中,下列哪个是正确的方法重载?A. 方法名相同,参数列表不同B. 方法名不同,参数列表相同C. 方法名和参数列表都相同D. 方法名相同,返回类型不同答案:A7. 下列哪个不是Java的集合框架中的接口?A. ListB. SetC. MapD. Stream答案:D8. Java中,下列哪个是线程安全的单例模式实现?A. 懒汉式B. 饿汉式C. 双重检查锁定D. 以上都是答案:B9. Java中,下列哪个是正确的异常处理关键字?A. tryB. catchC. finallyD. 以上都是答案:D10. 在Java中,下列哪个是正确的泛型使用方式?A. List<String> list = new ArrayList<>();B. List list = new ArrayList<>();C. List<String> list = new ArrayList<Integer>();D. List list = new ArrayList<String>();答案:A二、填空题(每题2分,共20分)1. Java中,一个类可以继承______个父类。
1.面向对象程序设计中的数据隐藏指的是参考答案为: DA.输入数据必须输入保密口令B.数据经过加密处理 C. 对象内部数据结构上建有防火墙D.对象内部数据结构的不可访问性解析输入数据必须输入保密口令和数据经过加密处理都不是面向对象程序设计的特征;对象内部数据结构上也不可能建有防火墙,所以它们都不是面向对象程序设计中所指的数据隐藏;面向对象程序设计系统中的封装单位是对象,对象之间只能通过接口进行信息交流,外部不能对对象中的数据随意地进行访问,这就造成了对象内部数据结构的不可访问性,也使得数据被隐藏在对象中;这就是面向对象程序设计中的数据隐藏所指;2.下列各项中符合函数重载必须满足的条件的是参考答案为:DA.必须有不同的参数个数B.对应的参数类型必须不相同 C. A和B必须同时满足D.A和B只要满足一个即可解析我们知道,在同一个作用域中,要实现函数重载必须满足的条件的是:① 有不同的参数个数;或者② 对应的参数有不相同的数据类型,即①和②中只要有一个满足就可以了;当然两者都满足更好,但这不是必须的;3.下列带缺省值参数的函数说明中,正确的说明是参考答案为:AA.int Funint x,int y=2,int z=3; B.int Funint x=1,int y,int z=3;C. int Funint x,int y=2,int z; D.int Funint x=1,int y,int z=3;解析在带缺省值参数的函数说明中,正确的说明应该是无缺省值的参数依次排列在参数表的左边,排完无缺省值的参数后,再依次排列带缺省值的参数;从所给出的四个选项来看,只有“int Funint x,inty=2,int z=3”符合这条规定,其它的都不符合;4.有如下的对类“CSample”的说明,其中是错误的;class CSample { 参考答案为:AA.int a=23;B.CSample;public:C.CSampleint val;D.~ CSample;}解析在上面对类“CSample”说明中,“CSample”和“CSampleint val”是该类重载的构造函数、“~ CSample”是该类的析构函数,这三个语句都是正确的;错误的语句是“int a=23”,因为它违反了在类的声明不管是引用性声明,还是定义性声明中都不能以赋值表达式的形式给它的数据成员进行初始化; 5.已知类A中的一个成员函数的说明如下:void SetA &a;则该函数的参数“A &a”的含义是参考答案为:CA.指向A的指针为aB.将变量a的地址赋给类AC.类A对象引用a用作函数的形参D.变量A与a按位与后作函数参数解析因为A是一个类,所以“A &a”表示a是类A的对象,但因为对象a的前缀了符号“&”,则“&a”表示是类A的对象引用;所以“A &a”的含义是类A对象引用a用作函数的形参;6.若类A和类B的定义如下:class A {public:int i,j;void get;};class B:A {int i,j;protected:int k;public:void make;};void B::make { k=ij; }则其中是非法的表达式; 参考答案为:DA.void get;B.int k;C.void make;D.k=ij;解析对于给定的四项中,前三项都是正确的,只有第四项是错误的;因为,类B是类A的私有派生类缺省访问类型,所以A中的公类型的数据成员在类B中成为了私有数据成员,但函数“void B::make”既然是类B的成员函数,则既可访问类A中的公有数据成员,也能访问类B中的私有数据成员,则表达式“k=ij;”造成了访问的二义性,即其中的i和j,到底是取自类A呢还是取自类B呢7.下面的主程序中,语句是错误的;class A {int i;public:virtual void fun=0;Aint a { i=a; }};class B {int j;public:void fun { cout<<”B::fun\n”; }Bint b,int c :Ab { j=c; }};void main 参考答案为:AA.{ A a5;B.A pa;C.B b7;D.B pb;}解析在类A中,函数“virtual void fun=0”为纯虚函数,因此,类A为抽象类;作为抽象类,它是不能被用来定义具体对象的,而语句“A a5;”恰恰是定义抽象类的对象的,所以它是错误的8.拷贝复制构造函数的作用是参考答案为:CA.进行数据类型的转换B.用对象调用成员函数C.用对象初始化对象D.用一般类型的数据初始化对象解析进行数据类型的转换和用一般类型的数据初始化对象都是一般构造函数的功能;用对象调用成员函数不用构造函数,只要用“对象名.成员函数名”即可;所以拷贝复制构造函数的作用,只能是用对象来初始化对象;9.下列说法中,正确的说法是参考答案为:BA.所有的运算符都能被重载B.运算符被重载时,它们的优先级与结合性不会改变C.当需要时,我们可以自定义一个运算符来进行重载D.每个运算符都可以被重载成成员函数和友元函数解析当重载运算符时,不是所有的运算符都能被重载,有几个运算符是不能被重载的,如三元运算符“:”、‘.’、‘’、‘::’、‘’等;也不是每个运算符都可以被重载成成员函数和友元函数,如运算符‘=’、‘’、‘’、和‘→’都只能被重载成成员函数;无论何时,都不能自定义运算符来进行重载,也即重载只能对已有运算符进行;但是运算符被重载时,它们的优先级与结合性不会改变; 10.下面对结构或类中成员的访问中,不正确的访问是参考答案为:AA.; 其中pointer为指向类对象的指针B.pointer->salary;C.x=; 其中worker为具有类类型的对象D.Location &rA=A1;int x=rA.GetX; Location为已定义的类,A1为对象解析因pointer为指向类对象的指针,所以“pointer->salary”是正确的访问数据成员的形式;因worker为具有类类型的对象,所以“”也是正确的访问数据成员的形式;因Location为已定义的类,A1为对象,所以“Location &rA=A1;int x=rA.GetX;”表示以对象A1初始化对象引用rA,然后由对象引用rA调用成员函数GetX给变量x赋值,这样的访问成员函数的形式也是正确的;“;”中,因为运算符‘.’的优先级高于运算符‘’的优先级,所以相当于“;”,那正确的形式应该是“pointer→salary;”;故“”是不正确的访问;11.C++ 对 C 语言作了很多改进,即从面向过程变成为面向对象的主要原因是 DA.增加了一些新的运算符B. 允许函数重载,并允许设置缺省参数C. 规定函数说明符必须用原型 D. 引进了类和对象的概念12.下列符号不能组成标识符的是 A A. 连接符 B. 下划线 C. 大小写字母 D. 数字字符13.类型修饰符 unsigned 不能修饰 D A. char B. int C. long int D. float14.在 int a=3,int p=&a ;中, p 的值是 D A. 变量 a 的地址值 B. 无意义 C. 变量 p 的地址值15.下列关于指针的操作中,错误的是 D A. 两个同类型的指针可以进行比较运算 B. 可以用一个空指针赋给某个指针 C. 一个指针可以加上两个整数之差 D. 两个同类型的指针可以相加二,填空题不写解答过程,将正确的答案写在每小题的空格内;错填或不填均无分;1.面向对象程序设计中的多态性包括静态多态性和动态多态性,前者由____________机制支持,而后者则由____________机制支持;答:函数重载、虚函数解析静态多态性又称编译时多态性,调用何函数应该在编译之前就知道了,所以必须由函数重载机制来支持;动态多态性又称运行时多态性,调用何函数只有在运行时才知道,所以由虚函数与指针或引用机制来支持;2.由cha r const str=”stucture”;所以定义的指针称为____________,关键字const 所修饰的是____________;答:指向常量的指针、指针所指的字符串解析根据由‘’在修饰符“const”中位置的不同,它所修饰的对象也不同,“const ”表示所修饰的是指针所指的常量,该指针称为指向常量的指针;“ const”表示所修饰的是指针本身,该指针称为常指针;“ const ”则表示所修饰的是指针本身和指针所指常量,该指针称为指向常量的常指针;3.引入虚基类的目的是为了解决多重继承中的____________和____________问题;答:二义性、多占用空间解析在允许多重继承时可能出现两个问题,第一个是公有派生类中的成员通过不同基类调用它们上一级公共基类的同一成员,这就产生了调用的二义性;每一个基类都为它们的上一级公共基类存有备份,这就引起了公共基类的重复存储,也就多占了存储空间;引入虚基类的目的是为了解决多重继承中的这两个问题;4.构造函数与析构函数所调用的虚函数是____________的函数,因此调用时实现的是____________联编;答:所在类、静态解析在生成派生类的对象时,先调用基类的构造函数生成基类对象,再调用派生类的构造函数来生成派生类对象;所以当在构造函数中调用虚函数时,当调用基类的构造函数时,此时派生类还未生成,所以它只能调用自己的虚函数;调用派生类构造函数时,它也只能调用自己的虚函数,因为虚函数的调用是不能由派生类调用基类的;在析构派生类对象是时,先调用派生类的析构函数析构掉派生类对象,再调用基类的析构函数来析够掉基类的对象;所以当在析够构函数中调用虚函数时,派生类的析构函数调用的是它自己的虚函数原因同构造函数,基类的析构函数调用的也是它自己的虚函数,因为此时派生类对象以已被析构掉了;由上可见,当构造函数与析够函数调用虚函数时,它们调用的都是自己类的函数,因此调用时实现的是静态联编;7.说明一个const成员函数又称常量成员函数的方法是,将const写在__________之间,而且它修饰的是__________;答:函数头与函数体、this指针解析为了说明一个常量成员函数的方法是,将const写在函数头的右圆括号‘’与函数体的左花括号‘{’之间,而且它修饰的是对象所属的this指针;表示该函数不能修改它所在对象中的数据成员的值; 20.对某个运算符的重载,实际上是用关键字____________与该运算符组成一个运算符函数,而且该运算符函数的返回类型不能是____________的;答:operater、void解析对某个运算符的重载,实际上是用关键字operater 与该运算符组成一个运算符函数,而且该运算符函数的返回类型不能是无类型的,即不能是void的;三改错题1.分析下列程序中的错误,并说明出错原因;includeclass base {const int n;public:base { cout<<”Initializing default\n”; }baseint m { cout<<”Initializing\n”; n=m; }~base { cout<<”Destroying\n”; }};void main{ base x1;base y=x;}答:1 n=m; const数据成员不以该形式赋值2错误处base y=x;,以对象初始化对象解析1作为const数据成员n不能用赋值表达式的形式为其赋初值,必须在定义构造函数时在函数头中以“baseint m:nm”形式来初始化;2base y=x; 语句中‘=’不是赋值的意思,而是初始化的意思;即在定义类base的对象y时,以对象x给它初始化,相当于base yx;;但是以对象初始化对象时,必须调用拷贝构造函数才行;因程序中没给出拷贝构造函数,也不能调用系统的缺省拷贝构造函数,因用户给出了构造函数后,再也不能调用系统提供的任何缺省构造函数;所以,base y=x;是错误的;2.分析下列程序中的错误,并说明出错原因;includeclass A {int x;public:Aint a { x=a; fun; }virtual void fun=0;};class B:public A {public:Bint b :Ab {}void fun { }};void main{ A aa5;B bb8;}答:1A aa5; 抽象类不能定义对象解析1在构造函数“Aint a”调用了纯虚函数“fun”,因构造函数调用虚函数是静态联编,即调用的是它自己类的虚函数;在此调用的是纯虚函数,它只被说明,而未定义,所以不可能被执行,因此出错;2抽象类相当于是对类的引用性声明,所以它只能定义该类的指针和引用,而不能定义它的对象;在此,A 为抽象类,而“A aa5”却定义了A的对象,因此是错误的;3.分析下列程序中的错误,并说明出错原因;includeclass AA {int aa;AAint xx { aa=xx; }public:int get { return aa; }~AA { cout<<”Destroying”<<AA<< endl;};main{ AA elem5;cout<<<<endl;}答:1AAint xx 的访问属性错、应具有公有属性解析1构造函数虽是由系统自动调用来生成对象的,但一般都是在类外调用,所以它的访问属性必须是公有的;程序中构造函数的访问属性是私有的缺省值,运行中必定出错;四.完成程序题本大题共5小题,每小题4分,共20分根据题目要求,完成程序填空;1.仔细阅读下列求两个点之间距离的程序,根据程序的输出结果在划线处填入正确语句;class point {float x,y;public:pointfloat a,float b { x=a; y=b; }float distancepoint &p {float dx=_____①______;float dy=_____②______;return floatsqrtdxdx+dydy;}};void main{ point p12,3,p232,43;cout<<③___<<endl;}答:①②③distancep2解析由于求两点之间距离的函数“distance”为成员函数,所以由该函数的this指针所指对象可用作起点参数之一,另一个用作终点的参数,必须在函数的参数表中显式地给出;dx 和dy分别计算两个结点间x和y坐标间的距离,因此应该为:dx= – x 和 dy = – y;对它们求平方相加后开方即可,得到两点间的距离:floatsrrtdada+dydy;在主程序中求p1和p2两个结点之间的距离,由于由p1调用距离函数,所以由p2作为它的参数,即distancep2;2.两个复数只有当它们的实部和虚部分别相等时,才被认为它们相等;在空格处填入合适的内容,以完成下面的程序,使其重载运算符“==”,用以比较两个复数的相等;请在主函数中输出比较的结果;includeclass complex {double real,imag;public:complexdouble r,double i { real=r; imag=i; }bool operator==complex &;};int complex:: operator==complex &com{ return_____①_____ }void main{ complex c1,,c2,;if______②______return cout<<”true\n”;elsereturn cout<<”false\n”;}答:① real==&&imag==② c1==c2或==c2解析若两个复数的相等,则必有它们的实数部分和虚数部分都相等,所以运算符重载函数中返回“real==&&imag==”,只有real==与imag==都为真时,该函数的返回值才为真;在主程序中,为了比较两个复数c1和c2,可以隐式地写成“c1==c2”,也可显式写成“==c2”;3.下列程序中声明了两个类AA和BB,其中函数“print”是类AA的成员函数,但是类BB的友元函数;请在①、②和③处各填入正确的内容,使程序能正常运行;include_____①______;class AA {int t;public:AAint x { t=x; }void printBB &b;};class BB {int s;public:BBint y { s=y; }friend v oid ___②___printBB &;};void ____③_____{ cout<<”AA:”<<T<<”;BB:”<<<<endl;}void main{ AA m6;BB n8;n;}答:① class BB;② AA::③ AA::printBB &w解析由于AA类的成员函数“print”是类BB的友元函数,因此它必须有一个BB类的引用作为参数,以便有引用BB类数据成员的接口;但此时BB类还未定义,为解决此矛盾,在①处先对BB类作引用性声明“class BB;”,告诉系统BB类在后面定义;因为函数“print”是类AA的成员函数,在类外定义必须加上类名和作用域分辨符,即在②处加上“AA::”;在BB类外定义“print”时,因是友元,所以没有加上“BB::”的必要,但“AA::”还是必须加的,所以在③处填“AA::printBB &w”;五.程序分析题1.请分析以下的程序,给出该程序的正确执行结果;include<iostream>using namespace std;int addint x,int y Array {return x+y; }void main{int m=2,n=3;cout<<"1:"<<addm++,m+n<<endl;m=2,n=3;cout<<"2:"<<add++m,m+n<<endl;m=2,n=3;cout<<"3:"<<addm+n,m++<<endl;m=2,n=3;cout<<"4:"<<addm+n,++m<<endl;}答:1:72:83:84:9解析在说明答案之前,要说明两个问题:1C++语言中,函数参数是压在栈里的,因压栈是从前往后进行的,所以出栈就是从后向前进行的,也即先取最后的参数,然后再向前逐个取用;2对于单加运算,m++是先执行后加1,++m是加1后再执行;由此,因m=2,n=3;,所以:1:m+++m+n=2+2+3=7 m++后执行,且后加1,所以m=2一直未变2:++m+m+n=3+2+3=8 ++m后执行,但先加1,执行++m时,m=3了3:m+n+m++=3+3+2=8 先执行m++,后加1,执行m+n时,m=3了4:m+n+++m=3+3+3=9; 先执行++m,且先加1,故一开始就有m=33.请分析下面的程序并给出该程序的执行结果;includeclass AA {int a;public:AA { cout<<”In itualizing AA\n”; }~AA { cout<<”Destroying 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 AAInitualizing BBEnding mainDestroying BBDestroying AA解析虽然在主程序中只定义了一个类BB的对象,但在类BB中声明了类AA的对象作为它的数据成员;当一个类中含有对象作为数据成员时,在生成对象时,先调用成员对象的构造函数,再调用类自己的构造函数,所以输出了“Initualizing AA”成员对象构造函数的输出和“Initualizing BB”类自己构造函数的输出;对象生成后,执行下一句输出语句,则输出“Ending main”;此时程序结束,调用析构函数来析构掉对象,先调用类自身的析构函数,其输出为“Destroying BB”,再调用成员对象的析构函数,其输出为“Destroying AA”;4.写出下列程序的运行结果;includeclass AA {public:static int n;AA { n++; }};int AA::n=0;main{ cout<<”AA::n=”<<AA::n<<endl;AA d1;cout<<<<<endl;AA d2;cout<<<<<endl;AA d3,d4;cout<<<<<endl;cout<<<<<endl;}答:AA::n=0=1=2=4=4解析由于数据成员n的访问属性是公有的,所以在类外可访问它;又它是静态变量,所以具有全局性;在构造函数中,执行的是n++操作,即每次调用构造函数n就加1;当程序开始时,因未定义对象,所以n的值为初始化时的值,则输出为“AA::n=0”;当定义了对象d1后,由于调用了构造函数,则该对象中n=1,故输出“=1”;同理,对象d2输出“=2”;由于接下来生成了两个对象d3和d4,调用两次构造函数,n两次加1,此时n=4,所以下面两条语句的输出为“=4”和“=4”;5.写出下列程序的输出结果;includeclass 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 BB.\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 called.”;同理调用派生类的构造函数时,生成的输出为“Constructor of BB.”和“BB::fun called.”;6.请给出下面的程序的输出结果;includetemplate class Tvoid sortT a,int n{ T num;forint i=0;i<n-1;i++{ forint j=i;j<n-1;j++ifaj>aj+1{ num=aj; aj=aj+1; aj+1=num; }}fori=0;i<n;i++cout<<ai<<endl;}void main{ int iver5={ 12,45,9,23,37 };double dver5= { ,,,, };sortiver,5;sortdver,.5;}答:9 12 23 37 45解析这是使用模板的例子;函数sort是一个递增的排序函数,T是个模板;当数组是整型数据类型时,它为整型数组排序;当数组为双精度数据类型时,它为双精度数组排序;所以输出如上结果;7.分析以下程序的执行结果 include<>void main{int a;int &b=a; fp;fp=&Sample::gety;int t=s.fp;cout<<"v="<<v<<",t="<<t<<endl;}解:本题说明了类成员函数指针的使用方法;在main中定义的fp是一个指向Sample类成员函数的指针;执行fp=Sample::getx后;fp指向成员函数getx,int v=s.fp语句等价于int ,v=x=2;执行fp=Sample::gety之后,fp指向成员函数gety,int t=s.fp语句等价于int t=,t=x=7;所以输出为:v=2,t=711.分析以下程序的执行结果include<>class Sample{int x;int y;public:Sampleint a,int b{x=a;y=b;}int getx{return x;}int gety{return y;}};void main{int Sample::fp;fp=&Sample::getx;Sample s2,7,p=&s;int v=p->fp;fp=&Sample::gety;int t=p->fp;cout<<"v="<<v<<",t="<<t<<endl;}解:本题说明了类成员函数指针的使用方法;这里通过指向对象的指针来调用指向类成员函数的指针,其原理与上题相似;输出仍为:v=2,t=712.分析以下程序的执行结果include<>class base{public:base{cout<<"constructing base class"<<endl;}~base{cout<<"destructing base class"<<endl; }};class subs:public base{public:subs{cout<<"constructing sub class"<<endl;}~subs{cout<<"destructing sub class"<<endl;}};void main{subs s;}解:本题说明单继承情况下构造函数和析构函数的调用顺序;这里base为基类,subs为派生类;所以输出为:constructing base classconstructing sub classdestructing sub classdestrcuting base class注意:在单继承情况下,首先调用基类的构造函数 ,随后调用派生类的构造函数,析构函数的调用顺序则正好相反;13.分析以下程序的执行结果:include<>class base{int n;public:baseint a{cout<<"constructing base class"<<endl;n=a;cout<<"n="<<n<<endl;}~base{cout<<"destructing base class"<<endl;}};class subs:public base{base bobj;int m;public:subsint a,int b,int c:basea,bobjc{cout<<"constructing sub cass"<<endl;m=b;cout<<"m="<<m<<endl;}~subs{cout<<"destructing sub class"<<endl;}};void main{subs s1,2,3;}解:本题说明派生类中含有对象成员情况下构造函数和析构函数的调用顺序;这里base为基类,subs 为派生类,subs类的构造函数中含有对象成员;所以输出为:constrcuting base classn=1constructing base classn=3constructing sub classm=2destructing sub classdestructing base classdestructing 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 main{D d;::n=10;::n=20;cout<<::n<<","<<::n<<endl;}解: D类是从类和类派生的而类和类又都是从类派生的,但各有自己的副本;所以对于对象d,::n与::n 是两个不同的数据成员它们互无联系;所以输出为:10,2015.分析以下程序的执行结果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;}};void main{D d;::n=10;::n=20;cout<<::n<<","<<::n<<endl;}解:D类是从类和类派生的而类和类又都是从类派生,但这是虚继承关系即是虚基类因此和共用一个的副本所以对于对象d,::n与::n是一个成员;所以输出为:20,2016.分析以下程序执行结果include<>int addint x,int y{return x+y;}double adddouble x,double y{return x+y;}void main{int a=4,b=6;double c=,d=;cout<<adda,b<<","<<addc,d<<endl;解:本题说明函数重载的使用方法, 这里有两个add函数,一个add函数的参数与返回值为int型,另一个的参数与返回值为double型,它们是根据参数类型自动区分的;所以输出为: 10,1017.分析以下程序的执行结果include<>class Sample{int i;double d;public:void setdataint n{i=n;}void setdatadouble x{d=x;}void disp{cout<<"i="<<i<<",d="<<d<<endl;}};void main{Sample s;10;;;}解:本题说明重载成员函数的使用方法;setdata成员函数有两个,根据其参数类型加以区分;所以输出为:i=10, d=22.分析以下程序的执行结果include<>class Sample{int n;public:Sample{}Sampleint i{n=i;}Sample &operator =Sample;void disp{cout<<"n="<<n<<endl;}};Sample &Sample::operator=Sample s{Sample::n=;return this;}void mainSample s110,s2;s2=s1;;}解:本题说明重载运算符=的使用方法;operator=成员函数实现两个对象的赋值;所以输出为: n=10六.程序设计题1.设计一个三角形类Triangle,包含三角形三条边长的私有数据成员,另有一个重载运算符“+”,以实现求两个三角形对象的面积之和;解:在Triangle类中设计一个友元函数operator+Triangle t1,Triangle t2,它重载运算符"+",返回t1和t2两个三角形的面积之和;本题程序如下:include<>include<>class Triangle{int x,y,z;double area;public:Triangleint i,int j,int k{double s;x=i;y=j;z=k;s=x+y+z/;area=sqrtss-xs-ys-z;}void disparea{cout<<"Area="<<area<<endl;}friend double operator+Triangle t1,Triangle t2{return +;}};void main{Triangle t13,4,5,t24,5,6;double s;cout<<"t1:"; ;cout<<"t2:"; ;s=t1+t2;cout<<"总面积="<<s<<endl;本程序执行结果如下:t1:Area=6t2:Area=总面积=2.重载运算符“+”友元函数只能返回两个三角形的面积之和,不能计算三个三角形的面积之和,改进一下,使之能计算任意多个三角形的面积之和;解:重载运算符为什么不能计算3个三角形的面积之和呢对于式子:s=t1+t2+t3,先计算t1+t2,返回一个double数然后再进行该double数+t3的计算,显然没有这样的重载运算符“+”友元函数,只需要添加这样重载运算符“+”友元函数即可;本题程序如下:include<>include<>class Triangle{int x,y,z;double area;public:Triangleint i,int j,int k{double s;x=i;y=j;z=k;s=x+y+z/;area=sqrtss-xs-ys-z;}void disparea {cout<<"Area="<<area<<endl;}friend double operator+Triangle t1,Triangle t2{return +;}friend double operator+double d,Triangle t{return d+;}};void main{Triangle t13,4,5,t24,5,6,t35,6,7,t46,7,8;double s;cout<<"t1:"; ;cout<<"t2:"; ;cout<<"t3:"; ;cout<<"t4:"; ;s=t1+t2+t3+t4;cout<<"总面积="<<s<<endl; }本程序的执行结果如下:t1:Area=6t2:Area=t3:Area=t4:Area=总面积=3.设计一个学生类student,包括姓名和三门课程成绩,利用重载运算符”+“将所有学生的成绩相加放在一个对象中,再对该对象求各门课程的平均分; 解:include<>include<>include<>class student{char name10;int deg1,deg2,deg3;public:student{}studentchar na,int d1,int d2,int d3{strcpyname,na;deg1=d1;deg2=d2;deg3=d3;}friend student operator+student s1,student s2{static student st;=+;=+;=+;return st;}void disp{cout<<setw10<<name<<setw5<<deg1<<setw5<<deg2<<setw5<<deg3<<endl;}friend void avgstudent &s,int n{cout<<setw10<<"平均分"<<setw5<<n<<setw5<<n<<setw5<<n<<endl;}};void main{student s1"Li",77,82,85,s2"Zheng",75,62,89;student s3"Ma",89,87,95,s4"Xu",55,79,65,s;out<<"输出结果"<<endl;;;s=s1+s2;avgs,2;;;s=s3+s4;avgs,2;}运行结果:输出结果li 77 82 85zheng 75 62 89平均分 76 72 87Ma 89 87 95Xu 55 79 65平均分 72 83 804.计算e的值;e是自然对数的底,它和π一样是数学中最常用的无理数常量;其近似值的计算公式为:e=1+1/1+1/2+1/3+...+1/n-1+r当n充分大时,这个公式可以计算任意精度e的近似值;为了保证误差r<ε,只需1/n-1 > r <ε程序代码如下:// programinclude<>void main{const double eps=;int n=1;float e=,r=;do // 开始do循环;循环条件由后面的while中的表达式值确定;{e+=r;n++;r/=n;}whiler>eps;cout<<"The approximate Value of natural logarithm base is: ";cout<<e<<endl;}5.16.设计一个立方体类Box,它能计算并输出立方体的体积和表面积;解: Box类包含三个私有数据成员a立方体边长、volume体积和area表面积,另有两个构造函数以及seta设置立方体边长、getvolume计算体积、getarea计算表面积和disp输出结果;。
【练习题】接口及类练习
1. 创建接口飞翔Ifly
该接口只包含方法飞fly()
2. 创建动物抽象类Animal
包含抽象方法:1)吃eat()
2)睡觉sleep()
公共属性:name
3. 创建鸽子类Pigeon
1)鸽子类继承动物类并实现飞翔接口
2)添加属性:鸽子类别pType
4. 创建飞机类Plane
1)飞机类实现飞翔接口
2)添加公共属性:飞机名name
飞机所属单位pCompy
5. 在主方法中
1)实例化鸽子对象信鸽:xinge
信鸽的名字为:tom ; 类别为:信鸽
让信鸽飞翔
2)实例化飞机对象直升机:whirlybird
直升机的名字为:长江8号
所属单位为:解放军A1001部队
让该直升机飞翔
6. 设计人类
1)人类控制飞翔接口,控制方法:Ctrl(Ifly ff)
2) 公共属性:Name
7. 在主方法中
实例化人,名字为:merry
merry 调用控制方法:让直升机飞翔
merry 调用控制方法:让信鸽飞翔
【练习题】对象关系练习
设计图书信息类、学生类,用于模仿学生借阅图书信息。
尤其注意学生借阅图书信息应如何表达。
借阅图书方法应包含在学生类中还是图书类中?借阅图书的方法是否有参数?
【练习题】对象关系练习
模拟主人与小狗关系,要求:主人能找到自己的小狗,小狗能找到自己的主人
控制台输出:
主人:merry 有一条狗叫花花品种是金巴
小狗:花花的主人是merry
升级版的主人与狗
每一个可以养多条狗(用数组实现,注意是在修改狗类还是主人类)每条狗都可以讨好自己的主人
主人可以转让自己的任意一条狗(若没有任何狗则不能转让)
转让给新主人时,若新主人的狗数已达到,则不能接收该狗
控制台输出:
主人:merry 可以有3 条狗
名字是:小花小黄小红
主人:jack 可以有2 条狗
名字是:花花
花花讨好主人jack
小红讨好主人merry
merry 将狗小黄转让给jack
merry 现在有狗:小花小红
jack 现在有狗:花花小黄
jack 将狗花花转让给merry
jack 现在有狗:小黄
merry 现在有狗:小花小红花花。