当前课程知识点:基于Linux的C++ >  第九讲 类与对象 >  9.2 程序抽象与面向对象 >  LinuxCPP0902

返回《基于Linux的C++》慕课在线视频课程列表

LinuxCPP0902在线视频

LinuxCPP0902

下一节:LinuxCPP0903

返回《基于Linux的C++》慕课在线视频列表

LinuxCPP0902课程教案、知识点、字幕

我们首先来看第一节

程序抽象与面向对象

先从这样的一个例子开始

我们要设计一个抽象的数据类型

设计能够保存二维平面上点的

抽象数据结构

这个例子其实我们已经见过了

我们原来用结构化的程序设计的

思维模式写的这个代码

就是像这样一个组织结构

在我们的头文件里声明了一个结构体

struct POINT 我们只声明没有定义它

然后我们typedefstruct POINT * PPOINT

也就是说 在整个程序的接口中

我们实际提供的不是这个结构体

而是指向这个结构体的指针

我们同时提供了一系列的接口

从PtCreate、PtDestroy然后PtGetValue、PtSetValue

一直到PtPrint这些函数

来访问抽象的点的数据结构

我们说过 你按照这样的一个方式

来实现的代码 它实际上就是

符合数据封装与信息隐藏的要求的

这样的话 会保证我们这样一个库的

实现细节尽可能地和库的使用者

是完全脱离开的

库的使用者就不会具有了解和维护

我们这个库的细节的负担

这是非常重要的一个设计思路

但是这样设计的程序代码呢

它实际上是有一个小问题

问题在哪里呢 问题就在

你只能定义指向这个结构体的指针

你并不能够定义这个结构体类型的变量

因为我们这个结构体的类型是未知的

我们仅仅声明了它 我们并没有定义它

POINT的结构体

我们仅仅声明了 而没有定义

所以你是不可以使用POINT这个结构体

来定义变量的

你只能定义PPOINT类型的变量

也就是指向这个结构体的指针

也就是说 像这样一个库的接口使用

其实是受限的

接下来的几张片子就是我们这个库的实现

我们首先要在库的代码里面

实现这个结构体struct POINT

要定义好它 然后一一实现我们函数

PtCreate、PtDestroy、PtGetValue、PtSetValue、

PtCompare、PtPrint、PtTransformIntoString

还有一个 我们需要使用到的

一个辅助函数DuplicateString

所有的这个实现中 你注意看

操纵的都是指向那个结构体的指针

这是我们在写库的代码的时候

需要特别注意的地方

我们前面讲了 你这样的一个实现

你只能处理这样的一个指针

这是它的一个问题

第二个 虽然我们将这个结构体的声明

和这个结构体所能够具有的方法

也就是它的行为

实际上封装在一个抽象的点库里面

属性和行为从我们的实现角度来讲

似乎是统一的

但我们其实并没有办法

要求程序员对所有的库的结构

按照一个特定的方式这样组织和使用

你比如说 他有可能

把那个结构体的定义抽取出来

然后放到了头文件里

这样的话 他不就可以用了嘛

这是非常重要的一个地方

我们按照这样一个实现完成了

这样的一个抽象库的一个表达

我们将它的属性

也就是这个结构体所具有的数据的

那些成员信息和在这些信息上边

所能够进行的操作

把它统一地封装在我们的源文件里

而在我们的接口上面

只提供它的型的一个描述——一个简单的描述

而不是内部实现细节

不是类型的实现细节

只有类型的简单描述

还有 可以在这个型上所进行的一种操作

当然我们实际上使用的是

指向这个结构体的指针

我们希望达到的目标就是

属性和行为的辩证统一

每一个这样的库

都按照这样一个方法来实现

那我就会说在我们程序中

结构体和这个结构体中所具有的方法

我们这个抽象的数据结构和

我们这个数据结构上面可以进行的操作集

全部封装成了一个单一的库

我们希望表达就是属性和行为

这样一个辩证统一概念

可是在结构化的程序设计里边

这样的属性和行为统一

并不是特别得完美无缺

因为实际上 我们的操作集

和我们的抽象数据结构仍然是分裂的

虽然我们表达在了同一个头文件里

但它实际上仍然是分裂的

这种分裂会导致用户 也就是库的使用者

在理解这个整个程序代码的时候

就有可能导致问题

尤其当你把很多个这样的结构体

混杂在一起的时候

很多个这样的抽象数据型

封装在一个单一的库的时候

属性和行为上边

就有可能在理解这个库的代码的时候

会带来额外的负担

所以说 当我们想表达这个数据封装

和信息隐藏概念的时候

如果你没有这样的一个类的概念

你就没有办法清晰地定义

这是我们前面特别谈到的

那么最重要的一个地方

就是我们怎么样才能够

通过一种特殊的机制将这样一个

抽象的数据类型的数据封装和信息隐藏

很好地利用起来

同时又让它的属性和行为

在语言的实现的概念上完成辩证统一

实现这一点就是面向对象技术

对象首先要表达的一个概念就是量

它仍然是一个我们说的变量和常量

这样一个量的概念 这是一个

这样的量和它的行为

应该统一地组织在一起

不要像我们刚才那个抽象数据型一样

把它割裂开

虽说放在同一个接口里 同一个实现里

但是它们之间仍然是分隔开的

没有完全的统一

所以我们希望它们能够

有机地组织成一个整体

第二个 我们希望的是

能够增强对象行为的主动性

我们不是在一个对象上施加一个操作

比如讲 我们的PtDestroy

我是要销毁一个特定的点

那么我们就要传那个点的指针

给PtDestroy那个函数

这样的一个销毁动作从行为角度来讲

它实际上是被动的

因为我要传一个参数进去给PtDestroy函数

让PtDestroy那个函数负责销毁它

我们希望所表达的

是这个对象的行为的主动性

也就是说 我们希望是一个点对象

它自己去发出一个销毁的动作

然后释放它自己

这个就叫对象行为的主动性

这个思考方法和我们结构化的程序思考方法

是有很大的不同的:一个是被动性的思维

一个是主动性的思维

从程序设计这个角度来讲

一个是被动式的思维模式

一个是主动式的思维模式

这两者之间是有很大不同的

那么很自然地我们就想

如果有这样一个接口库

那么我们整个程序的架构

就算相当完整的了

比如说一个struct POINT结构体

这个结构体里面呢

封装了它的数据成员

它包括x和y两个数据成员

封装了它对应的函数

从Create、Destroy一直到Print

我把这个点库的所有的数据

和它的操作集封装在一起

全都放在它的结构体的内部

这样的话不就完成了数据和代码

它的属性和行为的有效地统一了吗

我们想要的就是这样一个机制

这样的一个机制就叫面向对象技术

我们写出来的这个东西就是一个类

当然了 就我们这个代码的实现来讲

它事实上不是真正的C++代码

不是说它不可以工作 它可以工作

但是它和我们编程平时的习惯

是有一点点差异的

或者说有一点点不吻合的地方

首先当你使用一个struct结构体的关键字

来定义对象的时候

这里面的所有的成员都是公开的

除非你限定它 否则它们全都是公开的

外界都能够看到 也就是说x和y

像这样的一个数据外界是可见的

你没有做到数据封装和信息隐藏

从这个实现角度来讲

所以说我们这样的一个实现是有问题的

基于Linux的C++课程列表:

第一讲 C/C++基本语法元素

-1.1 提纲

--LinuxCPP0101

-1.2 程序设计的基本概念

--LinuxCPP0102

-1.3 简单C/C++程序介绍

--LinuxCPP0103

-1.4 程序设计的基本流程

--LinuxCPP0104

-1.5 基本语法元素

--LinuxCPP0105

-1.6 程序设计风格

--LinuxCPP0106

-1.7 编程实践

--LinuxCPP0107

-第一讲 C/C++基本语法元素--编程实践提交入口

第二讲 程序控制结构

-2.1 提纲

--LinuxCPP0201

-2.2 结构化程序设计基础

--LinuxCPP0202

-2.3 布尔数据

--LinuxCPP0203

-2.4 分支结构

--LinuxCPP0204

-2.5 break语句

--LinuxCPP0205

-2.6 循环结构

--LinuxCPP0206

-2.7 编程实践

--LinuxCPP0207

-第二讲 程序控制结构--编程实践提交入口

第三讲 函数

-3.1 提纲

--LinuxCPP0301

-3.2 函数声明、调用与定义

--LinuxCPP0302

-3.3 函数调用栈框架

--LinuxCPP0303

-3.4 编程实践

--LinuxCPP0304

-第三讲 函数--编程实践提交入口

第四讲 算法

-4.1 提纲

--LinuxCPP0401

-4.2 算法概念与特征

--LinuxCPP0402

-4.3 算法描述

--LinuxCPP0403

-4.4 算法设计与实现

--LinuxCPP0404

-4.5 递归算法(一)

--LinuxCPP0405

-4.6 递归算法(二)

--LinuxCPP0406

-4.7 容错与计算复杂度

--LinuxCPP0407

-4.8 编程实践

--LinuxCPP0408

-第四讲 算法--编程实践提交入口

第五讲 程序组织与开发方法

-5.1 提纲

--LinuxCPP0501

-5.2 库与接口

--LinuxCPP0502

-5.3 随机数库(一)

--LinuxCPP0503

-5.4 随机数库(二)

--LinuxCPP0504

-5.5 作用域与生存期

--LinuxCPP0505

-5.6 典型软件开发流程(一)

--LinuxCPP0506

-5.7 典型软件开发流程(二)

--LinuxCPP0507

-5.8 编程实践

--LinuxCPP0508

-第五讲 程序组织与开发方法--编程实践提交入口

第六讲 复合数据类型

-6.1 提纲

--LinuxCPP0601

-6.2 字符

--LinuxCPP0602

-6.3 数组(一)

--LinuxCPP0603

-6.4 数组(二)

--LinuxCPP0604

-6.5 结构体

--LinuxCPP0605

-6.6 编程实践

--LinuxCPP0606

-第六讲 复合数据类型--编程实践提交入口

第七讲 指针与引用

-7.1 提纲

--LinuxCPP0701

-7.2 指针基本概念

--LinuxCPP0702

-7.3 指针与函数

--LinuxCPP0703

-7.4 指针与复合数据类型(一)

--LinuxCPP0704

-7.5 指针与复合数据类型(二)

--LinuxCPP0705

-7.6 字符串

--LinuxCPP0706

-7.7 动态存储管理(一)

--LinuxCPP0707

-7.8 动态存储管理(二)

--LinuxCPP0708

-7.9 引用

--LinuxCPP0709

-7.10 编程实践

--LinuxCPP0710

-第七讲 指针与引用--编程实践提交入口

第八讲 链表与程序抽象

-8.1 提纲

--LinuxCPP0801

-8.2 数据抽象(一)

--LinuxCPP0802

-8.3 数据抽象(二)

--LinuxCPP0803

-8.4 链表(一)

--LinuxCPP0804

-8.5 链表(二)

--LinuxCPP0805

-8.6 链表(三)

--LinuxCPP0806

-8.7 链表(四)

--LinuxCPP0807

-8.8 函数指针(一)

--LinuxCPP0808

-8.9 函数指针(二)

--LinuxCPP0809

-8.10 抽象链表(一)

--LinuxCPP0810

-8.11 抽象链表(二)

--LinuxCPP0811

-8.12 编程实践

--LinuxCPP0812

-第八讲 链表与程序抽象--编程实践提交入口

第九讲 类与对象

-9.1 提纲

--LinuxCPP0901

-9.2 程序抽象与面向对象

--LinuxCPP0902

-9.3 类类型

--LinuxCPP0903

-9.4 对象(一)

--LinuxCPP0904

-9.5 对象(二)

--LinuxCPP0905

-9.6 类与对象的成员(一)

--LinuxCPP0906

-9.7 类与对象的成员(二)

--LinuxCPP0907

-9.8 类与对象的成员(三)

--LinuxCPP0908

-9.9 继承(一)

--LinuxCPP0909

-9.10 继承(二)

--LinuxCPP0910

-9.11 继承(三)

--LinuxCPP0911

-9.12 多态(一)

--LinuxCPP0912

-9.13 多态(二)

--LinuxCPP0913

-9.14 编程实践

--LinuxCPP0914

-第九讲 类与对象--编程实践提交入口

第十讲 操作符重载

-10.1 提纲

--LinuxCPP1001

-10.2 四则运算符重载(一)

--LinuxCPP1002

-10.3 四则运算符重载(二)

--LinuxCPP1003

-10.4 关系与下标操作符重载

--LinuxCPP1004

-10.5 赋值操作符重载(一)

--LinuxCPP1005

-10.6 赋值操作符重载(二)

--LinuxCPP1006

-10.7 赋值操作符重载(三)

--LinuxCPP1007

-10.8 赋值操作符重载(四)

--LinuxCPP1008

-10.9 赋值操作符重载(五)

--LinuxCPP1009

-10.10 流操作符重载(一)

--LinuxCPP1010

-10.11 流操作符重载(二)

--LinuxCPP1011

-10.12 流操作符重载(三)

--LinuxCPP1012

-10.13 操作符重载总结

--LinuxCPP1013

-10.14 编程实践

--LinuxCPP1014

-第十讲 操作符重载--编程实践提交入口

第十一讲 泛型编程

-11.1 提纲

--LinuxCPP1101

-11.2 泛型编程概览

--LinuxCPP1102

-11.3 异常处理机制(一)

--LinuxCPP1103

-11.4 异常处理机制(二)

--LinuxCPP1104

-11.5 运行期型式信息(一)

--LinuxCPP1105

-11.6 运行期型式信息(二)

--LinuxCPP1106

-11.7 模板与型式参数化

--LinuxCPP1107

-11.8 题外话:术语翻译

--LinuxCPP1108

-11.9 泛型编程实践(一)

--LinuxCPP1109

-11.10 泛型编程实践(二)

--LinuxCPP1110

-11.11 泛型编程实践(三)

--LinuxCPP1111

-11.12 泛型编程实践(四)

--LinuxCPP1112

-11.13 泛型编程实践(五)

--LinuxCPP1113

-11.14 泛型编程实践(六)

--LinuxCPP1114

-11.15 泛型编程实践(七)

--LinuxCPP1115

-11.16 泛型编程实践(八)

--LinuxCPP1116

-11.17 泛型编程实践(九)

--LinuxCPP1117

-11.18 泛型编程实践(十)

--LinuxCPP1118

-11.19 编程实践

--LinuxCPP1119

-第十一讲 泛型编程--编程实践提交入口

第十二讲 Linux系统编程基础

-12.1 提纲

--LinuxCPP1201

-12.2 程序执行环境(一)

--LinuxCPP1202

-12.3 程序执行环境(二)

--LinuxCPP1203

-12.4 程序执行环境(三)

--LinuxCPP1204

-12.5 程序执行环境(四)

--LinuxCPP1205

-12.6 输入输出(一)

--LinuxCPP1206

-12.7 输入输出(二)

--LinuxCPP1207

-12.8 文件系统

--LinuxCPP1208

-12.9 设备

--LinuxCPP1209

-12.10 库(一)

--LinuxCPP1210

-12.11 库(二)

--LinuxCPP1211

-12.12 makefile文件(一)

--LinuxCPP1212

-12.13 makefile文件(二)

--LinuxCPP1213

-12.14 makefile文件(三)

--LinuxCPP1214

-12.15 编程实践

--LinuxCPP1215

-第十二讲 Linux系统编程基础--编程实践提交入口

第十三讲 进程编程

-13.01 提纲

--LinuxCPP1301

-13.02 进程基本概念

--LinuxCPP1302

-13.03 信号

--LinuxCPP1303

-13.04 进程管理(一)

--LinuxCPP1304

-13.05 进程管理(二)

--LinuxCPP1305

-13.06 进程管理(三)

--LinuxCPP1306

-13.07 进程间通信(一)

--LinuxCPP1307

-13.08 进程间通信(二)

--LinuxCPP1308

-13.09 进程间通信(三)

--LinuxCPP1309

-13.10 进程间通信(四)

--LinuxCPP1310

-13.11 进程池

--LinuxCPP1311

-13.12 编程实践

--LinuxCPP1312

-第十三讲 进程编程--编程实践提交入口

第十四讲 线程编程

-14.1 提纲

--LinuxCPP1401

-14.2 线程基本概念

--LinuxCPP1402

-14.3 线程管理(一)

--LinuxCPP1403

-14.4 线程管理(二)

--LinuxCPP1404

-14.5 线程管理(三)

--LinuxCPP1405

-14.6 线程管理(四)

--LinuxCPP1406

-14.7 线程同步机制(一)

--LinuxCPP1407

-14.8 线程同步机制(二)

--LinuxCPP1408

-14.9 C++11线程库(一)

--LinuxCPP1409

-14.10 C++11线程库(二)

--LinuxCPP1410

-14.11 C++11线程库(三)

--LinuxCPP1411

-14.12 C++11线程库(四)

--LinuxCPP1412

-14.13 C++11线程库(五)

--LinuxCPP1413

-14.14 编程实践

--LinuxCPP1414

-第十四讲 线程编程--编程实践提交入口

第十五讲 网络编程

-15.1 提纲

--LinuxCPP1501

-15.2 Internet网络协议

--LinuxCPP1502

-15.3 套接字(一)

--LinuxCPP1503

-15.4 套接字(二)

--LinuxCPP1504

-15.5 编程实践

--LinuxCPP1505

-第十五讲 网络编程--编程实践提交入口

课程文档

-课程PDF文件

LinuxCPP0902笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。