幻灯片 1

Similar documents
Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

幻灯片 1

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式]

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2

程序设计语言及基础

Microsoft PowerPoint - string_kruse [兼容模式]

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

Microsoft PowerPoint - 04-Inheritance.ppt

C++ 程序设计 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

无类继承.key

程序设计与算法语言 静态与友元 C/C++ Programming and Algorithms Static, Friend and Const Dongke Sun ( 孙东科 ) 东南大学机械工程学院 School of Mechanical Engineer

模板

Microsoft Word - 新1-12.doc

chap07.key

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票

C++ 程序设计 实验 2 - 参考答案 MASTER 2017 年 5 月 21 日 1

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

1 下列类头定义中, 正确的是 面向对象程序设计网络课程 A class x { } B public x extends y { } C public class x extends y {.} D class x extends y implements y1 { } 2 现有两个类 A B,

C++ 程序设计 实验 3 - 参考答案 MASTER 2017 年 5 月 21 日 1

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

C++ 程序设计 OJ4 - 参考答案 MASTER 2017 年 5 月 21 日 1

Guava学习之Resources

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

Microsoft PowerPoint - 第06讲_继承.ppt [兼容模式]

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

C++ 程序设计 OJ4 - 参考答案 MASTER 2019 年 5 月 3 日 1

Strings

OOP with Java 通知 Project 4: 推迟至 4 月 25 日晚 9 点

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

C++ 程序设计 OJ10 - 参考答案 MASTER 2019 年 6 月 17 日 1

untitled

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

幻灯片 1

PowerPoint Presentation

Microsoft Word - word模板-教师.doc

Microsoft Word - 第3章.doc

上海交通大学

untitled

《C语言程序设计》教材习题参考答案

Spring3.x开发入门

北京大学

软件工程文档编制

教案模板4-2

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

幻灯片 1

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复

untitled

Microsoft Word - 第3章.doc

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

新版 明解C++入門編

OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢

Microsoft PowerPoint - 10 模板 Template.pptx

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点

<4D F736F F F696E74202D20B5DA3032BDB25FC0E0BACDB6D4CFF3312E BBCE6C8DDC4A3CABD5D>

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

untitled

FY.DOC

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac)

《C语言程序设计》第2版教材习题参考答案

4. if 与 else 在使用过程中为避免嵌套出现二义性,C++ 中规定与 else 子句配对的是 ( ) A. 其之前最近的 if 语句 B. 其之前最近且尚未配对的 if 语句 C. 缩排位置相同的 if 语句 D. 其之后最近的 if 语句答案 :B 解析 :C++ 中规定与 else 子句

9.2 构造函数和析构函数 类的组合 结构体与联合体 类的 UML 描述 第十讲 类与对象 (II) 面向对象进阶 对象的生存期 静态成员 友元关系

Microsoft PowerPoint - L17_Inheritance_v4.pptx

Microsoft Word - C++CodeRule94.doc

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

untitled

Microsoft Word - 第3章.doc

新・解きながら学ぶJava

2013年度西藏自治区教育厅

實用文格式大全.doc

个 小 小 的 乡 下 人 木 匠 的 儿 子, 竟 然 有 这 么 大 的 力 量 其 实 就 是 这 点, 祂 活 出 来 的 那 种 爱, 是 世 界 上 没 有 的 祂 活 出 来 的 爱 是 世 界 上 的 人 都 需 要 的, 但 却 是 人 人 在 这 个 世 界 上 都 得 不 到

薛 秦 高 继 宁 宋 明 锁 文 洪 梁 瑞 敏 贾 跃 进 内 蒙 古 自 治 区 (3 人 ) 琪 格 其 图 米 子 良 赵 震 生 辽 宁 省 (8 人 ) 田 素 琴 白 凤 鸣 肖 瑞 崇 黄 恩 申 白 长 川 杨 世 勇 李 敬 林 王 秀 云 吉 林 省 (5 人 ) 赵 继 福

提纲 1 联编与多态性 2 用虚函数实现多态 3 虚函数的工作原理 4 纯虚函数与抽象类 5 总结与思考 Dongke Sun (Southeast University) C++ Programming and Algorithms April 12, / 36

Strings

姓名 : 年级专业 : 学号 : 凡年级专业 姓名 学号错写 漏写或字迹不清者, 成绩按零分记 密 封 线 java 较难 试卷 总分 题号 一 二 三 四 五 题分 得分 D 国际通信协议 4 下面选项中, 不是面向对象的特征的是 ( ) A 封装 B 继承 得分 一 单选题 ( 每题 3 分,

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

Microsoft Word - ch04三校.doc

团 学 要 闻 我 校 召 开 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 3 月 17 日, 我 校 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 在 行 政 办 公 楼 五 楼 会 议 室 举 行, 校 团 委 委 员 各 院 ( 系 ) 团 委 书 记 校 学 生

Unternehmens-Präsentation

北京大学

Microsoft Word - 教学大纲.doc

<4D F736F F D E4345C6BDCCA84323B1E0B3CCD2AAB5E3D6AED2BB2E646F63>

2.3 链表

c_cpp

Microsoft PowerPoint - 06_Struct.ppt

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

public class Phone { String brand; double price; void call(){ System.out.println("hi,how are you doing"); 案例 3-2 对象的创建及对象内存图 1 考核知识点对象的创建和引用 掌握创建对象的方式

Chapter12 Derived Classes

记 忆 155 期 北 京 大 学 文 革 专 辑 (9) 目 录 专 稿 章 铎 从 高 云 鹏 的 遭 遇, 看 迟 群 之 流 的 专 制 附 : 高 云 鹏 给 胡 宗 式 章 铎 的 信 (2015 年 11 月 19 日 ) 评 论 马 云 龙 王 复 兴 抢 救 记 忆 : 一 个 北

硕士论文正文


不 会 忘 记, 历 史 不 会 忘 记, 当 一 个 古 老 神 州 正 以 崭 新 的 姿 态 昂 首 屹 立 于 世 界 东 方 的 时 候, 当 世 界 把 延 伸 的 广 角 镜 瞄 准 这 片 神 奇 土 地 的 时 候, 中 国 人 民 已 深 深 感 到, 现 在 所 拥 有 的,

第一章

标题

第 二 章 鉴 证 业 务 的 定 义 和 目 标 第 五 条 鉴 证 业 务 是 指 注 册 会 计 师 对 鉴 证 对 象 信 息 提 出 结 论, 以 增 强 除 责 任 方 之 外 的 预 期 使 用 者 对 鉴 证 对 象 信 息 信 任 程 度 的 业 务 鉴 证 对 象 信 息 是 按

Transcription:

第三课类和对象 ( 封装 ) 互联网新技术在线教育领航者 1

内容概述 1. 封装的概念 2. 访问控制 3. 栈类的封装 4. 构造与析构 5.myString 构造函数 6. 构造与析构的次序 7. 类文件写法 8. 对象的内存 9.this 指针初探 10. 构造函数初始值列表 11. 拷贝构造和赋值运算符重载 12. 浅拷贝 13. 深拷贝 14. 成员函数内联 15. 友元 16.const 和 static 成员 17. 单例模式 18. 类类型隐式转换 19. 类类型传参和返回值 20. 练习 :mylist 链表 互联网新技术在线教育领航者 2

封装 类的基本思想 : 数据抽象和封装 数据抽象是一种依赖于接口和实现分离的编程技术 接口 : 类的用户所能执行的操作实现 : 类的数据成员 接口函数的实现及其他私有函数的实现封装 : 实现了类的接口和实现的分离 封装后的类隐藏了实现细节 ; 类的用户只能使用接口而无法访问实现部分 面向对象三大特性 : 封装 继承 多态 互联网新技术在线教育领航者 3

访问控制 struct 结构体 结构体变量 class 类 对象 1. 数据与行为不分离 ( 成员变量, 成员函数 ) 2. 权限控制 : 类内开放, 类外控制保证数据完整性 正确性 3. 成员函数, 调用内部变量不需要传参 访问说明符 : public: 公共的 protected: 保护的 private: 私有的 C++ 中,class 和 struct 没有本质区别, 只是默认权限不同 互联网新技术在线教育领航者 4

栈类 权限控制的重要性提供的接口 : isempty(), isfull(), init(), destroy(), top(), push(), pop() 成员函数 const 互联网新技术在线教育领航者 5

构造函数 析构函数 构造函数 : 每个类都定义了它的对象被初始化的方式, 类通过一个或多个特殊的成员函数来控制其对象的初始化 ( 生成对象时自动调用 ) 析构函数 : 释放对象使用的资源 ( 对象销毁时自动调用 ) 构造函数 : 与类名相同, 无返回, 可以有参数析构函数 :~ 与类名相同, 无参数, 无返回 互联网新技术在线教育领航者 6

构造函数初步 1. 可以有参数, 有默认参数, 可以重载 2. 若未提供构造函数, 系统默认生成一个无参空构造若提供, 则不再生成默认无参空构造函数类名 a; // 调用无参构造 [ 不能写成类名 a(), 编译器会认为是函数声明 ] 类名 a(xx); // 调用有参构造 a{xx} 也可以 通过 new 在堆空间创建对象, 同样会自动调用构造函数 互联网新技术在线教育领航者 7

构造函数初步 :mystring 类的构造函数 思考 :string 类是怎么实现的? 模仿标准库的 string 类 : string s1; // 无参构造 string s2( abc ) // 有参构造 互联网新技术在线教育领航者 8

析构函数初步 析构函数 : 释放对象使用的资源 ( 对象销毁时自动调用 ) 1. 无参, 无返回 ( 不可重载 ) 2. 若未提供, 系统默认生成一个空析构函数 通过 delete 销毁堆空间上的对象, 同样会自动调用析构 设计原则 : 自己申请的资源, 自己负责释放 互联网新技术在线教育领航者 9

构造与析构 : 次序 1. 多个对象, 按次序构造, 析构次序相反 2. 类中有成员变量也是类对象的时候, 先运行成员类的构造函数, 再运行本类的构造函数 析构次序与构造次序相反 3. 注意类中成员变量是类的指针类型的话, 不会调用构造函数 互联网新技术在线教育领航者 10

构造与析构 : 次序 1. 栈空间中的对象脱离作用域时, 析构 2. 堆空间中的对象 delete 时, 析构 互联网新技术在线教育领航者 11

类文件写法 通常将一个类分为 2 个文件 : 类的声明写在类名.h 类的实现写在类名.cpp 一个类就是一个作用域 在类的外部定义成员函数时 : 返回值类型类名 :: 函数名 ( 参数 ) 互联网新技术在线教育领航者 12

对象的内存 类 对象, 模具 产品 创建对象时 : 只有成员变量开辟内存 没有成员变量时, 占 1 个字节 成员函数并不占用对象的空间 class 中的成员变量和 C 中的 struct 一样, 要对齐 补齐 互联网新技术在线教育领航者 13

this 指针初探 This 指针可认为是顶层 const, 不能修改 this = xxx; 错误 互联网新技术在线教育领航者 14

构造函数初始值列表 有些类中, 初始化和赋值的区别事关低层效率的问题 初始化的先后次序, 与成员变量出现的先后次序一致 互联网新技术在线教育领航者 15

拷贝构造和赋值运算符重载 拷贝构造函数 : class 类名 { 类名 (const 类名 & another); } 1. 系统提供默认的拷贝构造, 若自己提供, 则不复存在 2. 默认拷贝构造是等位拷贝, 也就是所谓的浅拷贝 3 要实现深拷贝, 必须要自己实现 赋值运算符重载 : 类名 { 类名 & operator=(const 类名 & 源对象 ) ; return *this; } 与拷贝构造类似 互联网新技术在线教育领航者 16

浅拷贝 浅拷贝可能会造成内存泄漏 重析构 互联网新技术在线教育领航者 17

深拷贝实现 赋值运算符重载 : 要注意自己给自己赋值的情况 互联网新技术在线教育领航者 18

成员函数内联 内联函数 :inline 修饰, 编译时展开 互联网新技术在线教育领航者 19

友元 封装 : 类的数据成员一般定义为私有成员, 外部要访问类的私有成员只能通过接口 ( 如 get,set 方法 ) 特殊情况 : 类外有些函数需要频繁地访问类的数据成员, 此时可以将这些函数定义为该类的友元函数 友元的好处 : 提高了程序的运行效率 ( 减少类型和安全性检查及调用的时间开销 ) 友元的副作用 : 破坏了类的封装性和隐藏性, 使得非成员函数可以直接访问类的私有成员 友元可以是一个函数, 称为友元函数 ; 友元也可以是一个类, 称为友元类 互联网新技术在线教育领航者 20

友元 同类之间可直接访问 例 :A(const A &other) { num = other.num; } 全局函数 类成员函数可作为友元函数 类的所有成员函数都可直接访问 : 友元类 互联网新技术在线教育领航者 21

友元 (1) 友元关系不能被继承 (2) 友元关系是单向的, 不具有交换性 若 B 是 A 的友元, A 不一定是 B 的友元 (3) 友元关系不具有传递性 若 B 是 A 的友元, C 是 B 的友元, 不能推出 C 是 A 的友元 互联网新技术在线教育领航者 22

类的 const 常量成员 const 成员变量, 不能修改, 只能在初始值列表中初始化 const 成员函数 : 1. const 放在函数声明之后, 实现体之前 void fun()const { } 2. 承诺在本函数内部不会修改类内的数据成员, 不会调用其它非 const 成员函数 3. const 构成函数重载 (why? this 指针底层 const) const 对象, 只能调用 const 成员函数 可访问所有数据成员, 不可修改 互联网新技术在线教育领航者 23

类的 static 静态成员 static 成员变量 : 同类对象间信息共享, 类外存储, 必须类外初始化, 可通过类名访问, 也可通过对象访问 静态成员函数 : 管理静态数据成员, 对静态数据成员封装 ( 对外提供接口 ) 静态成员函数 : 只能访问静态数据成员 静态成员函数属于类, 没有 this 指针 互联网新技术在线教育领航者 24

单例模式 1. 将默认构造函数和析构函数声明为私有, 外部无法创建, 无法销毁 ( 只能自己销毁自己 ) 2. 使用一个私有的静态本类类型的指针变量, 用来指向该类的唯一实例 3. 用一个公有的静态方法来获取该实例, 第一次调用该方法时, 创建实例并返回 ( 懒汉式 ), 以后调用直接返回 4. 用一个公有的静态方法来删除该实例, 以保证该实例只会被删除一次 互联网新技术在线教育领航者 25

类类型隐式转换 互联网新技术在线教育领航者 26

类类型临时量 类类型临时量, 在表达式结束后自动析构 互联网新技术在线教育领航者 27

类类型传参 互联网新技术在线教育领航者 28

类类型返回值 互联网新技术在线教育领航者 29

练习 :mylist 链表 1 实现一个链表类 : 1. 带头结点 2. 数据类型是 Student 类, 学号起始编号是 100 3. 实现下列功能 : mylist(const mylist& other); // 深拷贝构造 mylist &operator=(const mylist& other); // 赋值重载 void insert_tail(int _age,const string& _name); // 尾插 bool del_node(int _id); // 按 id 删除节点 void print()const; // 遍历打印 inline int get_size()const; // 获取链表中元素个数 互联网新技术在线教育领航者 30

练习 :mylist 链表 2 Student_Node 类 ( 结点 ): 1. 学号自动增长 static 静态变量和静态函数 2. Student_Node 类没有实现析构 拷贝构造 赋值运算符重载, 可行吗? 3. 假如学员姓名用自己写的 mystring 类, 那么要在哪里自己实现上面的那些函数? 4. 声明了 mylist 是 Student_Node 的友元类, 假如不允许使用友元, 该类还需要提供哪些函数? 互联网新技术在线教育领航者 31

练习 :mylist 链表 3 mylist 类 : 1. 内联函数为啥写在 mylist.h 头文件中? 2. 链表要求带头结点, 构造函数怎么写? 3. 拷贝构造函数和赋值运算符重载实现上有什么区别? 4. 要如何析构 mylist? 互联网新技术在线教育领航者 32

练习 :mylist 链表 4 互联网新技术在线教育领航者 33

练习 :mylist 链表 5 互联网新技术在线教育领航者 34

练习 :mylist 链表 6 mylist 其他函数 : insert_tail : 尾插 del_node : 根据学号删除 互联网新技术在线教育领航者 35

练习 :mylist 链表 7 互联网新技术在线教育领航者 36