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

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

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成员函数,在其中去掉超长的部分,保证数组不越界即可.
    可见,“隐藏”的机制有利于程序的修改.
    “隐藏”机制还可以避免对对象的不正确操作.有的成员函数只是设计来让同类的成员函数调用
的,并不希望对外开放,就可以将他声明为私有的隐藏起来.在设计类的时候,应当尽可能隐藏
使用者不需要知道的实现细节,只留下必要的接口(即一些成员函数)来对对象进行操作(防止外行
随便使用成员函数/变量出错).

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值