以下内容为笔者手打,望读者珍惜,如有转载还请注明。

chapter2:类和对象初步
数据结构+算法=程序
$2.1结构化程序设计的不足
    结构化程序设计也称面向过程的程序设计,过程是用函数实现的.结构化程序设计规模变大后会
变得难以维护和理解,很难看出来函数之间的调用关系,某项数据到底有哪些函数可以对它进行
操作,某个函数是用来操作哪些数据的.在这种情况下,当某项数据的值出错时,很难找出是哪
一个函数导致的,函数的查错和修改变得困难.
    结构化程序设计不利于修改和扩充(增加新功能).结构化程序设计没有“封装”和“隐藏”的概念.
要访问某一个变量可以直接访问,当该变量的定义有改动时,就要把所有访问该变量的语句找出来
修改.这些语句可能分散在上百个函数之中,任务量繁杂.
    结构化程序设计不利于代码的重用,要抽取可重用的代码非常困难.例如,要重用一个函数,
而这个函数又调用了一些新程序用不到的其他函数,因此就不得不将其他函数也一并抽取出来.
更糟糕的是,也许想重用的函数访问了某些全局变量,这样就要将不相关的全局变量全部也抽取
出来,或者修改被重用的函数以去掉对全局变量的访问.总之,结构化程序设计中的各个板块
耦合度太高,想要重用某一模块非常困难.

$2.2面向对象程序设计的概念和特点
抽象,封装,继承,多态
    在面向对象的程序设计方法中,各种事物称为“对象”.将同一类事物的共同特点概括出来的
过程被称为“抽象”.对象的特点包括两个方面:属性和方法.属性指的是对象的静态特征,如员工
的姓名职位薪水等,属性可以用变量来表示.方法指的是对象的行为,以及能对对象进行的操作,如员工
可以请假加班,可以被提拔被加薪,方法可以用函数来表示.方法可以对“属性”进行操作.
    在完成抽象后将属性与方法打包成一个“类”称为“封装”.通过封装,数据和操作数据的算法
紧密联系起来,,还可以将对象的一部分属性和方法隐藏起来,让这部分属性和方法对外不可见,
另一部分属性和方法对外可见,作为对对象进行操作的接口.这样就能合理安排数据的可访问范围,
减少程序不同部分的耦合度,从而提高代码扩充、修改、重用的效率.
    以现有的代码为基础方便地扩充出新的功能和特性是所有软件开发者的需求,结构化程序设计
语言对此没有特殊支持.而面向对象程序设计语言通过引入“继承”机制,较好地满足了开发者的需求.
所谓“继承”,就是在编写一个类的时候以现有的类作为基础,使得新类从现有的“类”中派生出来,从而
达到代码扩充和代码重用的目的.
    “多态”是指不同种类的对象具有名称相同的行为,但是具体行为的实现方式不同.例如,游戏
中的弓箭手和刀斧手都有名为“攻击”的方法,但是二者的实现方式不同,只是前者是通过射箭实现
攻击,后者则是通过劈砍实现攻击.
    类+类+……类=面向对象的程序

$2.3类的定义和使用
class 类名{
    private:用来指定私有成员.一个类的私有成员,不管是成员变量还是成员函数,都只能
    在该类的成员函数内部才能访问.
    public:
    protected:与“继承”相关
    void sty();
};
void 类名::sty(){

}
类名 对象名;(定义对象)

一般地,在C++中,一个对象占用的内存空间的大小等于其成员变量所占用的内存空间的总和.
每个对象都有各自的存储空间.一个对象的某个成员变量被改变后,不会影响另一个对象.成员函数
并非每个对象各自有一份,和普通函数一样在内存中只有一份,不过可以作用于不同的对象.
    使用类的成员函数/变量使用  “变量名.成员名”
    如 Crectangle r1,r2;
    r1.w=5;r2.init(5,4);

$2.5访问对象的成员
    还可以用“指针->成员名”的形式
例:CRectangle r1,r2;
    Crectangle*p1 = & r1;
    Crectangle*p2 = & r2;
    p1->w=5;//此处的w属于p1指向的对象
    p2->init(5,4);//init函数作用在p2指向的对象上

和结构变量一样对象之间可以用“=”相互赋值,但是不能用“==”、“!=”、“<=”、“>=”
“<”、“>”进行比较运算,除非这些运算符经过适当的重载.

$2.6类成员的可访问范围
    “隐藏”的作用:设置私有成员的方式叫做“隐藏”.“隐藏”的一个目的是强制对成员变量的访问
一定要通过成员函数进行.这样做的好处是,如果以后修改了成员变量的类型等属性,只需要修改
成员函数即可;否则,所有访问成员变量的语句都需要修改.
    以上面的企业员工管理程序为例,如果szName函数不是私有的,那么整个程序中可能会有很多
类似于 strcpy(man1.szName,"Tom1234567889"); 这样的语句.假设需要将该程序移植到内存
空间紧张的手持设备上,希望将CEmployee类的成员变量szName改为char szName[5],以便节约
空间,那么所有这样的语句都要找出来修改防止数组越界会非常麻烦.
    然而,如果我们将szName变成私有的,则除了CEmployee类的成员函数内部,其他地方不可能
出现对szName 直接访问的语句,所有对szName的访问都是通过成员函数进行的.例如
e.setName("Tom1234567889"); 就算szName的长度变短了上面的语句也不需要修改,只需要修改
setName成员函数,在其中去掉超长的部分,保证数组不越界即可.
    可见,“隐藏”的机制有利于程序的修改.
    “隐藏”机制还可以避免对对象的不正确操作.有的成员函数只是设计来让同类的成员函数调用
的,并不希望对外开放,就可以将他声明为私有的隐藏起来.在设计类的时候,应当尽可能隐藏
使用者不需要知道的实现细节,只留下必要的接口(即一些成员函数)来对对象进行操作(防止外行
随便使用成员函数/变量出错).

以上内容为笔者手打,望读者珍惜,如有转载还请注明。

程序设计与算法三~C++面向对象程序设计~北大郭炜MOOC学习笔记~第二章:类和对象初步(新标准C++程序设计)相关推荐

  1. 程序设计与算法三~C++面向对象程序设计~北大郭炜MOOC学习笔记~第三章:类和对象进阶(新标准C++程序设计)

    以下内容为笔者手打,望读者珍惜,如有转载还请注明. chapter 3:类和对象进阶 $3.1构造函数 $3.1.1 构造函数的概念和作用     全局变量在程序装入内存时就已经分配好了存储空间,程序 ...

  2. 程序设计与算法三~C++面向对象程序设计~北大郭炜MOOC学习笔记~第五章:继承与派生(新标准C++程序设计)

    以下内容为笔者手打,望读者珍惜,如有转载还请注明. 第五章 继承与派生 $5.1 继承与派生的概念 $5.1.1 基本概念     在C++中,当定义一个新的类B时,如果发现类B拥有某个已经写好的类A ...

  3. 程序设计与算法三~C++面向对象程序设计~北大郭炜MOOC学习笔记chapter1第一章(新标准C++程序设计)

    以下内容为笔者手打,望读者珍惜,如有转载还请注明. $1.4强制类型转化运算符的新形式:     类型名(待转化的表达式),如double(a),int(3.5) $1.5函数参数的默认值     在 ...

  4. Effective Java(第三版) 学习笔记 - 第四章 类和接口 Rule20~Rule25

    Effective Java(第三版) 学习笔记 - 第四章 类和接口 Rule20~Rule25 目录 Rule20 接口优于抽象类 Rule21 为后代设计接口 Rule22 接口只用于定义类型 ...

  5. 蓝桥杯备考——算法竞赛入门经典(第2版)学习笔记2

    算法竞赛入门经典(第2版)学习笔记2 第二章 循环结构程序设计 2.1 for循环 2.2 while 循环和do-while 循环 2.3 循环的代价 2.4 算法竞赛中的输入输出框架 2.5 注解 ...

  6. 北大郭炜慕课程序设计与算法(一)C++的OpenJudge题目答案

    北大郭炜慕课程序设计与算法(一)C++的OpenJudge题目答案 学习心得 题目答案 001 输出第二个整数 002 字符菱形 003 打印ASCII码 004 打印字符 005 整型数据类型存储空 ...

  7. C++语言程序设计——知识点复盘(第四章 类与对象)

    目录 面向对象程序设计的基本特点 1.抽象 2.封装 3.继承 4.多态 类和对象 类的成员函数 1.成员函数的实现 2.目的对象. 3.带默认形参值的成员函数 4.内联成员函数 构造函数 析构函数 ...

  8. 数字图像处理学习笔记(三):ORB算法(尺度不变特征变换)Oriented FAST and Rotated BRIEF

    数字图像处理学习笔记(三):ORB算法(尺度不变特征变换)Oriented FAST and Rotated BRIEF 一.概述 参考:特征点匹配+特征检测方法汇总 ORB的全称是Oriented ...

  9. 陈宝林《最优化理论与算法》超详细学习笔记 (三)————单纯形法

    陈宝林<最优化理论与算法>详细学习笔记 (三)----单纯形法 数学模型 最优性检验与解的判别 最优解的判别定理 无穷多最优解判别定理 无界解判别定理 其他情形 第三章 单纯形法 单纯形表 ...

最新文章

  1. HDU 1431 素数回文
  2. WebMagic实现分布式抓取以及断点抓取
  3. mysql服务器配置优化
  4. iOS - 设置导航栏之标题栏居中、标题栏的背景颜色
  5. MySQL使用Amoeba作为Proxy时的注意事项
  6. python用另一个字段替代本字段的null_Python中的数据库
  7. Android 抽屉布局
  8. 使用Java Stream摘要统计
  9. NVDKC6416平台H.264算法优化
  10. Java滑动窗口的最大值
  11. 如何将CAD图纸在线转换成JPG图片格式
  12. Android调用默认浏览器打开指定url
  13. Ubuntu16.04在Wine-3.0平台安装最新版TIM(QQ),不折腾那些没用的!
  14. Android平台i2c-tools及16位地址读写,以及not executable: 64-bit ELF file解决办法
  15. electron通过注册表打开软件
  16. 小程序源码:团长头像制作小程序
  17. 串行通信比并行通信的速度更高
  18. 浅析云计算的七种应用类型
  19. 一次linux oops分析
  20. [Linux][问题解决]Linux访问本地网站可以,但是外部访问不行

热门文章

  1. html多媒体效果怎么使用,HTML多媒体标签video、audio、marquee详细讲解
  2. 127.0.0.1 myz.php,在nginx上用FastCGI解析PHP
  3. PostgreSQL 源码解读(147)- Storage Manager#3(fsm_search函数)
  4. Unknown database ‘xxx‘
  5. K-Means对红酒数据进行聚类||python
  6. 计算机领域的道德模范,2015-2016年学校道德模范董敏事迹
  7. 梦幻西游 python.dll,答疑第三期 | 使用 Airtest 最常见的 8 大问题
  8. Houdini 导出粒子替代物至Maya渲染
  9. FL Studio 插件使用教程 —— 3x Osc(上)
  10. 期货贴水如何交割(期货交割升贴水)