十三、进阶面向对象(上)

1、你考虑过吗

日常生活中,我们都习惯于对事物进行分类。那么,这种分类的思想是否可以引入程序设计中呢?

2、面向对象基本概念

  • 面向对象的意义在于

    • 将日常生活中习惯的思维方式引入程序设计中
    • 将需求中的概念直观的映射到解决方案中
    • 以模块为中心构建可复用的软件系统
    • 提高软件产品的可维护性和可扩展性
  • 类和对象是面向对象中的两个基本概念
    • 类:指的是一类事物,是一个抽象的概念
    • 对象:指的是属于某个类的具体实体
    • 类是一种模型,这种模型可以创建出不同的对象实体
    • 对象实体是类模型的一个具体实例
  • 一个类可以有很多对象,而一个对象必然属于某个类

3、生活中的类和对象

4、类和对象的意义

  • 类用于抽象的描述一类事物所特有的属性和行为

    • 如:电脑拥有CPU,内存和硬盘,并且可以开机和运行程序
  • 对象是具体的事物,拥有所属类中描述的一切属性和行为
    • 如:每一只老虎都有不同的体重,不同食量以及不同的性情

5、一些有趣的问题

  • 类一定存在实际的对象吗?
  • 类的对象数目是确定的吗?
  • 类一定都来源于现实生活中吗?
  • 类都是独立的吗?类之间存在关系吗?
  • 对象实例一定只属于一个类吗?
  • 对象实例可能完全相同吗?

6、小结

  • 面向对象是当今软件开发中的重要方法
  • 类和对象是面向对象理论中的基本概念
  • 类和对象均来源于日常生活中
  • 每个类可以有多个对象
  • 每个对象必然属于某个类

十四、进阶面向对象(下)

1、面向对象基本概念

  • 类之间的基本关系

    • 继承

      • 从已存在类细分出来的类和原类之间具有继承关系( is-a )
      • 继承的类(子类)拥有原类(父类)的所有属性和行为
    • 组合
      • 一些类的存在必须依赖于其它的类,这种关系叫组合
      • 组合的类在某一个局部上由其它的类组成
  • 类之间的基本关系 - 继承

  • 类之间的基本关系 - 组合

2、类的表示法

3、类的表示法 - 简化

问题︰

1、类之间的继承关系没有表示出来

2、继承而来的属性和行为需要重复声明

4、类的表示法 - 改进1

问题:需要使用划线来表示属性和行为,不适合于编程开发!

5、类的表示法 - 改进2

问题:使用中文进行属性和行为的描述,绝大多数编译器无法接受!

6、类的表示法 - 改进3

思考:如何用程序设计中的概念描述类的属性和行为?

7、类的表示法 - 改进4

8、编程实验:类的表示法

9、小结

  • 类之间可以存在继承关系或组合关系
  • 继承关系中子类拥有父类的一切属性和行为
  • 组合关系是类之间整体和部分的关系
  • 类及类之间的关系可以有不同的表示法
  • 编译器对类的表示法有具体的要求

十五、类与封装的概念

1、类的组合

电脑一般而言是由CPU,内存,主板,键盘和硬盘等部件组合而成。

思考:

学习电脑组装需要多少时间?

学习电脑组装是否需要学习显示器,内存,主板,键盘和硬盘等部件的设计与制造?

2、类的封装

  • 类通常分为以下两个部分

    • 类的实现细节
    • 类的使用方式

  • 当使用类时,不需要关心其实现细节
  • 当创建类时,才需要考虑其内部实现细节

例:

普通用户使用手机

只需要学习如何发短信,打电话,拍照,等等

手机开发工程师

要考虑手机内部的实现细节

  • 封装的基本概念

    • 根据经验:并不是类的每个属性都是对外公开的

      • 如:女孩子不希望外人知道自己的体重和年龄
      • 如:男孩子不希望别人知道自己的身高和收入
    • 而一些类的属性是对外公开的
      • 如:人的姓名,学历,国籍,等
    • 必须在类的表示法中定义属性和行为的公开级别
      • 类似文件系统中文件的权限
  • C++中类的封装
    • 成员变量:C++中用于表示类属性的变量
    • 成员函数:C++中用于表示类行为的函数
    • C++中可以给成员变量和成员函数定义访问级别
      • public

        • 成员变量和成员函数可以在类的内部和外界访问和调用
      • private
        • 成员变量和成员函数只能在类的内部被访问和调用

3、编程实验:类成员的访问属性

4、类成员的作用域

  • 类成员的作用域都只在类的内部,外部无法直接访问
  • 成员函数可以直接访问成员变量和调用成员函数
  • 类的外部可以通过类变量访问public成员
  • 类成员的作用域与访问级别没有关系
  • C++中用struct定义的类中所有成员默认为public

5、编程实验:类成员的作用域

6、小结

  • 类通常可以分为使用方式和内部细节两部分
  • 类的封装机制使得使用方式和内部细节相分离
  • C++中通过定义类成员的访问级别实现封装机制
  • public成员可以在类的内部和外界访问和调用
  • private成员只能在类的内部被访问和调用

十六、类的真正形态

1、问题:经过不停的改进,结构体struct变得越来越不像它在C语言中的样子了!!!

2、类的关键字

  • struct在C语言中已经有了自己的含义,必须继续兼容
  • 在C++中提供了新的关键字class用于类定义
  • class和struct的用法是完全相同的
  • class和struct有什么区别?
    • 在用struct定义类时,所有成员的默认访问级别为public
    • 在用class定义类时,所有成员的默认访问级别为private

3、编程实验:class的初探

4、小实例

  • 需求:开发一个用于四则运算的类

    • 提供setOperator 函数设置运算类型
    • 提供setParameter 函数设置运算参数
    • 提供result函数进行运算
      • 其返回值表示运算的合法性
      • 通过引用参数返回结果

5、类的真正形态

  • C++中的类支持声明和实现的分离
  • 将类的实现和定义分开
    • .h 头文件中只有类的声明

      • 成员变量和成员函数的声明
    • .cpp源文件中完成类的其它实现
      • 成员函数的具体实现

6、实例分析:Operator类的分析

7、小结

  • C++引进了新的关键字class用于定义类
  • struct和class的区别在于默认访问级别的不同
  • C++中的类支持声明和实现的分离
    • 在头文件中声明类(使用方式)
    • 在源文件中实现类(内部细节)

C++ 深度解析教程(五)进阶面向对象、类与封装的概念、类的真正形态相关推荐

  1. 十五、类与封装的概念

    1.类的封装 C++中类的封装: 成员变量:C++中用于表示类属性的变量 成员函数:C++中用于表示类行为的函数 C++中可以给成员变量和成员函数定义访问级别 public:成员变量和成员函数可以在类 ...

  2. 【C++】 15_类于封装的概念

    类的组合 电脑一般而言是由 CPU, 内存,主板,键盘和硬盘等部件组合而成. 思考: 学习电脑组装需要多少时间? 学习电脑组装是否需要学习显示器,键盘,鼠标,主板,内存等部件的设计与制造? 类的封装 ...

  3. python深度讲解_《深度剖析CPython解释器》21. Python类机制的深度解析(第五部分): 全方位介绍Python中的魔法方法,一网打尽...

    楔子 下面我们来看一下Python中的魔法方法,我们知道Python将操作符都抽象成了一个魔法方法(magic method),实例对象进行操作时,实际上会调用魔法方法.也正因为如此,numpy才得以 ...

  4. Spring源码深度解析(五):Spring AOP原理及源码详解

    前言 OOP表示面向对象编程,是一种编程思想:AOP表示面向切面编程,也是一种编程思想,AOP的概念可以参考文章:SpringAOP基本概念详解. 正文 1.AbstractAdvisorAutoPr ...

  5. 深度解析(十五)哈夫曼树

    哈夫曼树(一)之 C语言详解 本章介绍哈夫曼树.和以往一样,本文会先对哈夫曼树的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙 ...

  6. C++基础与深度解析第五章: 语句

  7. 【C++深度剖析教程8】C++的操作符重载的概念

    之前学习了类的函数重载的概念,今天学习操作符重载的概念.在这之前我们先看一个例子: 上面是一个复数的加法,a为复数的实部,b为复数的虚部,在main函数里我想实现复数c1与c2的加法.很显然,正常的+ ...

  8. php封装redis类,php封装redis操作类

    Redis系列-key相关主要操作函数_数学_自然科学_专业资料.这篇 blog 主要总结下,redis 中跟 key 相关的常用函数 1)keys 语法:keys pattern 解释:查找所有匹配 ...

  9. 用java定义图书book类_Java封装图书信息类

    了解上节有关封装的知识后,本节通过完整的例子再次实现封装.要求编写表示图书的 Book 类,实现以下需求: 基本信息包括图书名称(bookName).总页数(pagelbtalNum),其中页数不能少 ...

最新文章

  1. electron 利用 electron-builder实现自动更新
  2. android 无法安装测试版本,在测试应用更新时,安装无提示阻止Android版本构建签名APK...
  3. PHP中可变变量和php可变函数到底有什么用?
  4. keil mdk5安装
  5. console程序显示彩色文字 .
  6. iOS之深入解析数组遍历的底层原理和性能分析
  7. git 删除本地仓库中的分支_本地 Git 仓库与 GitHub 关联
  8. LeetCode MySQL 1435. 制作会话柱状图
  9. easyui怎样实现textarea
  10. 给安利公司董事长郑李锦芬女士的一封信
  11. 【恋上数据结构】冒泡排序、选择排序、堆排序
  12. cad指示箭头快捷键命令_47个快捷键+50个CAD技巧助你玩转CAD
  13. Unity 使用LitJson 解析Json数据
  14. Flex Builder4.7 与 MyEclipse2013集成 64位
  15. 蓝牙原理—Radio射频协议
  16. 计算机组成原理什么是模,计算机组成原理中字、位元组、位各指什么?单位用什么表示?...
  17. AGV激光Slam导航环境要求说明
  18. 大数据智能营销笔记本人工智能下引入新的交互方式
  19. (完美解决)升级win10,提示VirtualBox 立即卸载此应用,因为它与Windows 10 不兼容
  20. 绩效考核成绩管理平台

热门文章

  1. 战争与文明维修服务器有补偿吗,【战争与文明】2017年10月26日更新维护公告
  2. 在Oracle Linux上部署Yunzai Bot v3保姆式教程/甲骨文云/云崽Bot/原神
  3. 【华为OD机试真题 python】火星文计算 【2022 Q4 | 100分】
  4. void main 和 int main的区别
  5. 如何说服别人跟你合作
  6. mysql如何动态查询_Mysql动态查询
  7. 项目中的复制问题 --- clipboard
  8. Navicat无法显示ndm2文件
  9. 当前网友眼中越老越吃香的行业到底是什么?
  10. PHP以星号隐藏用户名手机号码和邮箱实例