收藏 分销(赏)

《C++面向对象设计》(黑白-用于打印输出).doc

上传人:a199****6536 文档编号:9829811 上传时间:2025-04-10 格式:DOC 页数:70 大小:4.68MB 下载积分:16 金币
下载 相关 举报
《C++面向对象设计》(黑白-用于打印输出).doc_第1页
第1页 / 共70页
《C++面向对象设计》(黑白-用于打印输出).doc_第2页
第2页 / 共70页


点击查看更多>>
资源描述
资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。 第一章 引论 1.1 系统的复杂性 面向对象设计方法 1.2 系统分析和设计方法 1.3 面向对象设计方法的特点 1.4 面向对象设计方法的应用 1.5 本课程的内容 土木工程系计算机应用研究室 马智亮 1 3 5 2 1.1 系统的复杂性 ·硬件系统: 微机CPU ·软件系统 早期: 运算速度和内存容量等硬件限制 60-70年代: 推出时间 运算速度 晶体管数 8080 1974 1987 1989 1993 - 3万 硬件性能价格比改进 高级语言的出现 80386 3-5 MIPS 28万 80486 - - 100万 310万 Ö10万句 Pentium Pentium4 Ö1000句/人月 => 8人年! 3000 MIPS - 复杂性 4 注意: 复杂系统往往十分重要! e.g. 全球飞机订票系统 铁路车辆调度系统 • 关于系统分析和设计方法的误区 我足够聪明, 不需要方法指导 –不能有效地进行大型软件的开发 ”散兵游勇”, ”手工作坊式” –不能有效地借鉴和利用别人的经验 ”低水平重复” 股票交易管理系统 社会影响 重建代价 先进而可靠的系统分析和设计方法! –不能很好地与软件开发商合作 ”小农经济, 自给自足” 6 1 1.2 系统分析和设计方法 一方法分类 软件工程 • 软件工程的角度 生命周期法(LC) 原型法(PR) • 程序构成的角度: 程序=算法+数据结构 面向功能(FO) 面向数据(DO) 将软件作为一个工程产品来对待。 功能, 过程 – 需要经过规划、 分析、 设计、 实现等过程 -> 生命周期法 或 – 需要经过小规模实验、 正式投产等过程 -> 原型法 面向对象(OO) 7 8 生命周期法 原型法 将软件的生命周期划分为几个阶段, 对每个 阶段的成果复审经过后才进入下一阶段 首先建立原型, 在不断充实原型的基础上形 成最终系统 规划 => 项目实施计划 1)确定用户基本需求; 需求分析 => 系统需求说明及用户手册 2)开发初始原型; 设计 编程 测试 维护 => 设计说明及调试计划 => 程序代码 3)运行原型, 让用户提改进意见; 4)修改完善原型; => 测试报告 5)若未形成最终系统, 转 3)。 => 维护报告 9 10 二 常见设计方法 • 常见设计方法的类属 需求分析和设计是系统开发中最重要的阶段 分析方法和设计方法总是联系在一起的 -> 分析和设计方法简称为设计方法 面向功能FO 面向数据DO 面向对象OO 生命周期法LC 原型法PR LC-FO PR-FO LC-DO PR-DO LC-OO PR-OO 当前比较流行的设计方法有: 自顶向下结构化设计方法 数据驱动设计方法 自顶向下结构化设计方法 数据驱动设计方法 面向对象设计方法 面向对象设计方法: 新兴的~ 11 12 2 三 自顶向下结构化设计方法 基本思想 e.g. 报表制作 报表制作 计算 1) 将功能逐步分解划分为模块 2) 让模块间形成层次 输入数据 打印报表 3) 将程序结构限制为顺序、 选择和循环 读入编辑检查 印表头印表体 打印 13 14 四数据驱动设计方法 ·又称Jackson方法 e.g.报表制作 文件 记录 处理文件 处理记录 ·基本思想: 强调问题的组合, 使程序结构与问题结构 ( 即数据结构) 相对应。 数据项1数据项2 数据项3 处理 处理 处理 数据项1 数据项2 数据项3 15 16 五面向对象设计方法 基本思想: e.g.报表制作 1.打印报表 2.印刷 1) 经过识别对象和类来分解问题领域, 尽量 让对象和类对应于现实中的事物; 控制台 报表 2) 建立类之间的相互关系: e.g.继承关系; 3.生成 4.生成 表头 3) 以类为模板生成对象, 让对象协同工作去 实现系统的具体功能。 5.打印 表体 6.打印 印刷器 17 18 3 1.3 面向对象设计方法的特点 六常见设计方法比较 一优点 ·适用范围 1) 充分利用面向对象语言的表现力 数据驱动设计方法不适于大型系统开发 ·与高级语言的关系 2) 系统结构对应于现实生活, 系统结构相 对稳定 3) 系统结构自然, 便于理解和交流, 可维护 性和可扩充性好 自顶向下结构化~: FORTRAN, COBOL, C 面向对象~: Smalltalk, C++, Java ·混合使用的可能性 -> 适用于开发大型和复杂系统 总体: 无 局部: 有 19 21 23 20 1.4 面向对象设计方法的应用 二 缺点 ·系统类型 单机系统 1)系统执行速度比较慢 基于C/S( 客户/服务器) 结构的系统 基于B/S( 浏览器/服务器) 结构的系统 2)初始成本高 设计方法学习: 几周 -> 实践: 几个月 三 能否取代传统设计方法? 系统代码数在10万句以下时, 与自顶向下结构化方法差别不大; 系统代码数在10万句以上时, 推荐使用 ·系统应用领域 几乎覆盖所有的领域: 操作系统, 文档处理, 图象识别, 用户界 面, 专家系统CAD, CAI 等 22 1.5 本课程的内容和要求 • 我们用它来做什么? –从事系统的开发 Chp.2 对象模型 模型 语言 Chp.3 编程语言C++ e.g. 利用面向对象语言进行大型系统开发 e.g. 利用Autodesk ObjectARX的二次开发 –从事大型系统的开发管理 与开发商进行更有效的沟通 –作为一种通用的解决问题的方式 e.g. 管理大型工程项目 设计原理 Chp.4 面向对象设计原理 表示方法 Chp.5 标准建模语言UML Chp.6 统一的软件开发过程 实施步骤 24 4 作业1 • 教学要求的基本考虑 1. 请参考有关文献, 归纳程序设计语言的发展过 程及趋势。要求: 作为研究生的课来要求 –要注明文献的出处 –不合格者需要重做 – 9月22日( 周四) 提交 –无教科书, 指定参考文献 –需要主动去查找并阅读相关文献 –需要阅读一定的外文资料 –需要做大作业( Project) 结合课程进展分步提交, 完善后最终提交 提示: 能够上网检索有关刊物, 或浏览有关 的网页。 25 26 5 第二章 对象模型 2.1 概述 2.1 概述 一 回顾 2.2 对象和类 2.3 抽象原则 2.4 封装原则 2.5 模块原则 2.6 层次原则 2.7 其它原则 面向对象设计方法的基本思想 与自顶向下结构化设计方法相比 不同的角度: 把问题领域分解为对象和类 = 识别对象和类 什么是对象和类? 如何分解? 如何系统化? 1 3 5 2 二 对象模型的概念 对象模型 模型: 原系统的简化系统 抽象原则 类型原则 ~ : 反映进行问题领域分解及系统化的基本 原则, 是面向对象设计方法的工程基础。 封装原则 平行原则 层次原则 持久原则 模块原则 由一些原则组成: 主要: 抽象、 封装、 模块、 层次 非主要: 类型、 平行、 持久 4 2.2 对象和类 关于原则的注意点 一 对象的概念 • 形成概念框架 • 描述性定义 这些原则本身并不新, 只是在面向对象设计 方法中被集成在一起 对象是用面向对象设计方法构造系统时所使 用的基本要素。这里限于考虑软件系统。 • 主要原则构成判别准则 • 形象化说法 只有在系统设计中使用了全部的主要原则, 才属于面向对象设计 对象是用面向对象设计方法构筑软件系统时 所使用的基本材料 <->自顶向下结构化设计方法? 6 1 • 可作为对象的事物 现实生活中有关的事物均能够成为对象 e.g.报表制作 1.打印报表 2.印刷 –看得见、 摸得着的~ 控制台 e.g.桌子、 椅子、 教室、 电灯、 温度计、 文档 –可被人领悟的~ 报表 3.生成 表头 4.生成 e.g.弯矩、 座位、 买卖交易、 交通事故 –思想和行动有所指向的~ 5.打印 表体 e.g.技术员、 医生、 顾客、 债权人 6.打印 印刷器 7 8 • 对象的特性 二类的概念 任何对象都可被唯一地识别并具有属性和行 为。 e.g. 温度计对象 识别: 区分不同的对象, e.g. m1, m2 属性: 测温范围、 当前温度 值的变化反映对象状态的变化 行为: 测温、 校准 • 描述性定义 用来规定相似对象的共同特征、 并用来生成 对象的系统要素。对象都需要从类来生成。 e.g. 温度计类 • 形象化说法 类是对象的模板、 对象是类的实例 使用对象需要先定义类 反映为其它对象或外部提供的服务 9 10 typedef float Temperature; typedef unsigned int Location; class TemperatureSensor{ public: 三用C++语言表示类和对象 e.g. ”温度计”类 类的定义和使用类似于C语言中的结构体 •用数据成员表示属性 TemperatureSensor(Location); // 构造函数 ~TemperatureSensor(); // 析构函数 void calibrate(Temperature actualTemperature); Temperature currentTemperature(); •用成员函数表示行为 private: •构造函数: 生成对象时被自动执行的函数 •析构函数: 对象消亡时被自动执行的函数 Temperature TemperatureRangeHigh; Temperature TemperatureRangeLow; Temperature currentTemp; }; 11 12 2 2.3 抽象原则 e.g. 生成温度计对象 一基本内容 TemperatureSensor theSensor1(1); 体会: 模板 应用抽象方法: 舍弃事物个别的、 非本质的 特征, 抽取共同的、 本质的特征。 e.g. e.g. 对象的使用 Temperature Temp; 图书馆、 教室、 研究室… 桌子、 椅子、 连为一体的桌椅… 红色的、 黄色的、 白色的… 座位 Temp=theSensor1.currentTemperature(); 讨论: 软件系统中的温度计和实物温度计的关 系是什么? 13 14 确定对象和类的过程中 二 确定对象和类 有时不能简单确定对应于实际事物的对象和类 而需要根据更高层次的抽象来确定 e.g. The Mark IV Special Coffee Maker 开始: Boiler, Warmer, BrewButton, RelieveValve, Indicator 首先应用的原则! 常常做的事: • 系统中的对象 <- 现实世界中的事物 • 类 <- 对象 • 属性 <- 事物的特征 • 行为 <- 事物的特征 后来: Sprayer, Warmer, UI 详见网上英文资料 特别说明: 抽象相对于观察者的视点而存在 同一系统, 不同设计者也可能采用不同的抽象 15 16 RelieveValve Boiler 三 建立对象的界面 • 对象的界面代表对象的外部特征, 包含对象 的行为: –对象能做什么: 承担的责任 –对象如何使用: 对外部( 对象) 所做的约定 Warmer • 相对于对象的实现 • 应用抽象原则来确定 BrewButton Indicator 17 18 3 四程序实现: C++语言 五 应用例 在类的public部分表示对象的界面 水溶液植物农场 植物种在培养棚内的水溶液中 培养环境因素: 温度、 湿度、 浓度、 光照等 -> 用自动化系统来监控 如何对该软件系统进行设计? 识别对象和类 -> 建立对象的界面 19 21 23 20 回调函数 class ActiveTemperatureSensor{ public: • 温度计类 系统中的温度计: 对实际温度计进行控制 –被动式温度计 ActiveTemperatureSensor(Location, void (*f)(Location, Temperature)); ~ ActiveTemperatureSensor(); 如前例: 可进行校准, 可报告温度 <=> 被动对象 void calibrate(Temperature actualTemperature); void establishSetpoint(Temperature setpoint, Temperature delta); –主动式温度计 Temperature currentTemperature(); 温度>规定度数 -> 启动空调机 <=> 主动对象 private: … } 22 2.4 封装原则 • 讨论 一基本内容 –在该例中, ”对象的界面”是如何体现的? 利用信息隐藏的办法, 将对象的实现与对象 的界面分离开来, 使外部( 对象) 只能经过 对象的界面来利用对象的服务。 所承担的责任: 校准、 测温成员函数 对外部的约定: 成员函数的参数表 –观察者的视点有何不同? 实现问题的离散化。即, 如果只改变对象的 实现方法, 并不会影响到利用它的服务的外 部( 对象, 即客户对象) 。 采用被动对象时, 需要用其它对象与之 配合, 实现对温度的控制 24 4 一般封装 e.g.: 记数器 客户对象 <=> 服务器对象 访问者和被访问者: 被服务和服务关系 归零 记数 –服务器对象所提供的服务均体现在界面上, 界面同时反映了对客户对象的约定 读数 –服务器对象的实现细节均被封装起来 当前数 对象的实现: 机械式? 电子式? 25 26 二 对象封装的确定 和抽象相对 三程序实现: C++语言 经过protected和private以及文件的形式来组 织代码 将对象的实现封装起来, 包括 •对象的属性 –定义类时 将类的数据成员及表现内部行为的成员函数放在 类定义的private或protected部分; •对象的界面的实现 •实现对象的界面过程中用到的内部行为 –实现类时 将成员函数的实现放在不同的文件中。 27 28 1/3 //gplan.h 四 应用例 typedef unsigned int Day; typedef unsigned int Hour; enum Light{OFF, ON}; typedef float Concentration; struct Condition{ Temperature temperature; Light lighting; PH acidity; 水溶液植物农场: 植物培育计划类 –抽象: 建立培育计划, 清除培育计划, 报告培育 计划等行为 –封装: 包括 有关的属性( 数据) ”时间: 环境因素的状态 ”关系 封装 Concentration concentration; }; 对象行为实现: 基于属性的 29 30 5 2/3 3/3 class GrowingPlan{ public: //gplan.cpp #include "plan.h" GrowingPlan(char* name); virtual ~GrowingPlan(); void clear(); GrowingPlan::GrowingPlan(char* name){ ... } virtual void establish(Day, Hour, const Condition&); virtual GrowingPlan::~GrowingPlan() { ... const Condition& desiredCondition(Day, Hour); } protected: const Condition& desiredCondition(Day, Hour){ Condition conditionArray[10000]; ... } ... … }; 31 32 class homeStereoSystem{ public: PlayCD(const CD& theCD); private: Speaker itsSpeaker[2]; Turner itsTurner; 家庭音响系统: 家庭音响类 •抽象: 播放CD •封装: 作为组成要素 控制面板、 功放器、 喇叭等对象 TurnTable itsTurnTable; CDPlayer itsCDPlayer; CassetteDeck itsCassetteDeck; Amplifier itsAmplifier; }; 33 34 2.5 模块原则 一 基本内容 二 模块的确定 将类组合成一系列内聚力强、 耦合力弱且可 操作的模块去构成复杂系统。 • 模块结构简单、 易懂 -> 独立设计、 修改 • 模块界面稳定 -> 修改一个模块的实现时不 至于影响别的模块 –模块内的各个类关联紧密: 逻辑上 –模块间联系松散 • 模块内容相对完整、 独立 -> 程序的重用 • 考虑非技术因素: 分工、 保密等 –模块的大小适中 模块也有界面和实现 简化问题, 便于分工进行系统开发 35 36 6 三程序实现: C++语言 四 应用例 C++语言中未直接提供支持模块的机制, 可使用文件的形式来组织模块 水溶液植物农场 •有关培育计划的类形成模块 •有关控制培育计划执行的类形成模块 •有关图形用户界面类形成的模块 •... 37 38 //培育计划模块界面(gplan.h) #include "gtypes.h" //培育计划模块实现(gplan.cpp) #include "gplan.h" #include "except.h" #include "actions.h" class GrowingPlan{…}; GrowingPlan::GrowingPlan(char* name){…} virtual GrowingPlan:: ~GrowingPlan{…} … class FruitGrowingPlan{…}; class GrainGrowingPlan{…}; … 关联紧密的 各个类的定义 //相当于C语言程序的.c文件 类成员函 数的实现 //相当于C语言程序的头文件 39 40 2.6 层次原则 讨论 一 基本内容 • 有关控制培育计划执行的类形成的模块界面 至少应包含什么? 经过对类和对象进行等级划分来形成层次结 构, 以简化对事物的理解。 – gplan.h 包括 –有关图形用户界面类形成的模块界面 • 如何经过模块实现程序的重用? –类层次结构 –对象层次结构 –按照一定的方式来组织模块结构 41 42 7 二类层次结构 • 特性 • 定义 继承性: 子类能够继承父类的特性 对于类A和类B, 若满足: B是一种A( 特殊/ 一般关系) , 则称: A是B的父类, B是A的 子类; 又称为一般/特殊结构。 程序代码的共享 -> 表示的经济性 • 分类 e.g. 微机: 计算机 –单继承: 一个子类只拥有一个父类 –多继承: 一个子类拥有一个以上的父类 43 45 47 44 • e.g. 水溶液植物农场: 单继承 要建立水果培育计划的类 class GrowingPlan{ public: //前面给出过 •选取GrowingPlan作为父类 父类表现子类所共享的属性和行为 GrowingPlan(char* name); virtual ~GrowingPlan(); void clear(); e.g. FruitGrowingPlan, VegetableGrowingPlan, FlowerGrowingPlan等类 virtual void establish(Day, Hour, const Condition&); 均需要clear等行为 const Condition& desiredCondition(Day, Hour); protected: •子类对父类提供的行为进行具体化或扩充 Condition conditionArray[10000]; … }; e.g. 函数estimateYield 46 typedef unsigned int Yield; class FruitGrowingPlan : public GrowingPlan{ public: • e.g. 水溶液植物农场: 多继承 要建立苹果类 FruitGrowingPlan(char* name); virtual ~FruitGrowingPlan(); virtual establish(Day, Hour, Condition&); Boolean isHarvested() const; unsigned dayUntilHarvest() const; Yield estimateYield() const; protected: 既是一种水果, 又是一种花 class apple : public Flower, public Fruit{ … }; Boolean repHarvested; Yield repYield; 问题: 重复继承? }; 48 8 1/2 2/2 class FlowerMixin{ class FruitMixin{ public: public: FlowerMixin(Day timeToFlower, Day timeToSeed); virtual ~FlowerMixin(); Day timeToFlower() const; Day timeToSeed() const; protected: … }; FruitMixin(Day timeToHarvest); virtual ~FruitMixin(); Day timeToHarvest() const; protected: … }; 独立地表示被继 承类的一些独特 操作和属性 class apple : public Plant, public FlowerMixin, public FruitMixin{ … }; 49 50 三对象层次结构 • 特性 • 定义 形成较高层次的对象和类 对于类A和类B, 若满足: A的对象中包含有 B的对象, 则称A与B形成对象层次关系; 又 称为聚合结构, A的对象为聚合对象, B的 对象为被聚合对象。 简化对事物的理解 • 分类: 聚合对象和被聚合对象之间 –物理包含: 同生同灭 –非物理包含: 互为参照关系 51 52 2.7 其它原则 一类型原则 • e.g. 花园类 能够对类进行强制, 使不同类的对象不可互 换, 或至多以有限的方式互换。 class Garden{ public: Garden(); virtual ~Garden(); protected: Plant * repPlants; GrowingPlan repPlan; }; • 实现方法 一般经过语言来实现 与语言类型有关: 强类型~、 弱类型~ 强类型语言: 强制严格, 在编译时可检出是 否违反。 53 54 9 • e.g.有限的互换 二并行原则 GrowingPlan a("ABC"), b(" FG"); FruitGrowingPlan c("LMN"); a=b; 能够使多个对象同时拥有线程。 线程: 不需外部触发、 独立地运行的任务 a=c; 区分主动对象和被动对象: 拥有线程的对象 为主动对象 c=a; //C++语言(X) e.g. 主动式温度计 控制台对象与温度计对象同时被激活 55 56 • 实现方法 三 持久原则 –利用语言提供的功能 –利用库存类 C++: Sched, Timer, Task 能够使对象具有持久性。 • 数据按持久性分类 –利用系统中断功能: 周期性地中断应用程 序: 看起来像多线程 –对表示式求值后得到的数据 –计算过程中的局部变量 –不同执行模块间存在的数据 –程序的不同版本间存在的数据 –程序之外存在的数据 临时数据 持久数据 57 58 作业2 • 持久数据的处理方法 请查阅有关文献, 归纳对象模型所包含的主要 原则的起源、 发展及其与编程语言的关系。 使用数据文件或数据库 要求: 面向对象数据库 <=> 关系数据库 –对象的存在从内存扩展到外存 –要注明文献的出处 –不合格者需要重做 – 10月13日交 –主要由于价格因素还未得到广泛应用 59 60 10 请开始做大作业( 另附) 61 11 3.1概述 第三章面向对象编程语言C++ 一 C++语言的发展 ·C语言: 70年代初, 为构筑UNIX •运算符丰富 •数据结构柔软 •直接访问物理地址 •目标代码质量高 3.1概述 3.2对C语言格式上的改进点 3.3封装性 3.4友元函数和友元类 3.5继承性 3.6多态性 •可移植性好 -> 系统软件、 应用软件 1 3 5 2 4 6 • 开发动机: 与C语言成一体系, 与C语言 独立存在, 事件驱动的仿真语言 • 编译器 –1985 • 发展过程 AT&T 1.0版编译器 –现在 Simula 67 C Agol-68 Microsoft Visual C++ .NET ( 前一版本6.0) Borland C++ Builder 6 Studio 特点: 集成开发环境( IDE) CwithClasses C++ 1983 仿真语言Simula 67: 类和继承 算法结构语言Agol-68: 多态性 3.2对C语言格式上的改进点 二 C++语言的好处 • C语言的超集 -> 利用C语言的积累, 便于学习 • 普遍采用的面向对象语言 三 学习前提 • 已掌握了C语言, 否则请自学 • 本章只讲述相对于C语言的主要增量部分 • 目的是帮助大家理解程序 一 常量的定义 C++: const double PI=3.141592; PI=2.1; //(X) C: #define PI 3.141592 1 二 变量的定义 三 结构体变量的定义 C++: 可在函数的任意部分定义 -> 方便变量的增加 C++: 定义结构体变量时可省去”struct” struct emp{ char* name; int salary; }; #include <stdio.h> void main (){ int s=0; for (int j=1; j<=50; j++) s=s+j; printf (”s=%d\n”, s); } emp engineer; 7 8 e.g. 用参照型实现函数参照调用( <-> C指针) 四 参照型( 引用) #include <stdio.h> • 为实体定义别名。 void add10(int& i){ • 格式: 类型名& 变量名=表示式; i = i + 10; } main(){ int size=512; int k=1; add10(k); printf(”k=%d\n”, k); } int& refSize=size; // refSize和size代表同一实体 9 10 五 数据类型转换 六 注释 C++:数据类型( 表示式) ; C++: int x=186; //x holds an integer value e.g. x=float(j); C: int x=186; /*x holds an integer value */ C: ( 数据类型) 表示式; e.g. x=(float)j; 11 12 2 七 输入输出 八 内存的动态分配和释放 ( 流输入输出) int* spt=new int[15]; delete [] spt; #include <iostream.h> #include <stdio.h> main(){ float x; scanf(”%f”, &x); printf(”x=%f\n”, x); } main(){ float x; cin >> x; cout << ”x=” << x << int* spt=malloc(60); free(spt); ”\n”; } 13 14 16 18 3.3封装性 一 类的定义 说明 1) 区分数据成员和成员函数的访问特性 private: 只能在类内被访问 protected: 只能在类内或其子类内被访问 public: 可在任意处被访问 class 类名{ 说明部分 public: 数据成员及成员函数 实现部分 protected: 数据成员及成员函数 private: 类名::成员函数名(){ 2) 结构体被扩展, 具有与类相同功能 不同点: 缺省访问特性 数据成员及成员函数 … } }; 类为private <-> 结构体为public 15 二 简单例程序 int Set::isMember(int ex){ for (int j=0; j<nelem; j++) if (elem[j]==ex) return 1; #include <iostream.h> class Set{ 编译预处理 private: return 0; int elem[1000]; int nelem; } 类的实现部分 <->连同private 部分: void Set::putElem(int ee, int ps){ public: 类的说明部分 <-> public: 对象的界面 if (ps<=0 && ps<1000){ Set(){nelem=0;} int Nelem(){return nelem;} int isMember(int); void putElem(int, int); }; elem[ps]=ee; 对象的实现 if (ps> nelem) nelem=ps; } } iset.cpp iset.h 17 3 void main(){ 说明 Set ss; for (int j=0; j<10; ++j) ss.putElem(j+600, j); cout << ”Nelem()=” << ss.Nelem() << ”\n”; cout << ss.isMember(601) << ” ”; cout << ss.isMember(609) << ” ”; cout << ss.isMember(610) << ”\n”; } 1) 文件组织: 习惯上3个文件 ·iset.h 预编译及类的说明部分 #include ”iset.h” 类的实现部分 #include ”iset.h” 主函数 主函数 对象的定义 ·iset.cpp ·main.cpp Nelem()=10 1 1 0 main.cpp 19 20 2) 利用对象和类作为构成程序的基本要素 三 构造和析构函数 3) 封装性( 数据封装) : 将数据放在private或 protected部分, 使外部不能直接访问, 外部 对数据的访问需经过 public部分定义的成员 函数来进行; 对象的实现与对象的界面分开 特殊的成员函数: 构造函数与类同名, 析构 函数在类名前加~ • 构造函数: 生成对象时被自动执行, 用于进 行对象的初始化, 一般在其中动态分配内存 4) 内联函数: <->外联函数 • 析构函数: 对象消亡时被自动执行, 进行对 象的内存清理工作, 一般在其中释放内存 好处: 省去调用过程 -> 提高执行速度 缺点: 未封装 -> 简单函数 • 缺省的构造函数和析构函数: 函数体是空的 21 22 2/2 1/2 #include <iostream.h> #include ”tdate.h” void main(){ Tdate today( , 9, 22), tomorrow( , 9, 23); cout << ”Today is ”; today.Print(); //tdate.h month = m; day = d; class Tdate{ public: cout << ”CON called.\n”; Tdate(int y, int m, int d); ~ Tdate(); } TDate:: ~ Tdate(){ cout << ”DES called.\n”; } void TDate::Print(){ cout << year << ”.” << month << ”.” << day <<endl; void Print() private: CON called
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服