面向对象——对一个事物进行抽象,并将抽象出来的属性和行为放入到一个类中。对类中的属性和行为加以包装,使类中的属性和行为能够满足特定的要求(比如对内可见对外只暴露想要暴露的内容)。抽象层次的不同,也就表明了抽象出来的类之间具有了层级关系。通过合理、巧妙的使用这些具有层级的类构建出灵活的类间访问形式,最终形成了面向对象思想。
抽象
我一直理解不了抽象这个概念,后来我用一个词来代替抽象这一概念 – 析取。
找出共性谓之析,将共性放到自己想放的地方谓之取。
而想要有共性,就必须是一个宽泛的概念,起码包含两个及以上的人或物才能进行析出不是。所以析取一定是针对一个范围来进行的,单独的个体只是研究对象,而无法进行抽象。
多说一句。每个人的理解不一,我是借着谐音才对抽象有一个浅显的理解,和标准概念理解的抽象一定是存在偏差的。偏差不打紧,我自己咬动了面向对象这一概念。所以我也希望每位读者都能对面向对象有着自己的理解。
读到这里,如果你是第一次接触面向对象的思想,请先尝试抽象某些事物再继续向下读。
类
我们前面提到了,对一个范围内的事务进行析取,然后将析取出来的内容放到自己想要存放的地方。这个存放的地方我们称之为 类。
在C++语言中,类使用 class 关键字进行声明。
class class_name { ... }
,其中大括号表示类的范围,在这个范围(大括号)之内就是类的成员。
对于一个类,我们需要理解三个概念:类的声明、类的成员 和 类的对象。类的声明无需赘述,我们来看里的成员和类的对象。
类的成员
所谓之类的成员,就是我们析取出来的内容。大多数语言在面向对象时会将对象分为 成员属性 和 成员方法。
成员属性(属性)指的是那些不具有连贯性的析取,比如 楼:高度、楼层;再比如 人:年龄,工作。
成员方法(方法/行为)指的就是那些具有连贯性的动作了。比如 楼:盖楼,人:吃饭。
看到 楼:盖楼,请不要惊讶。我要是换一个写法 楼:被建造,大家就都能理解了。这也恰恰说明了抽象的重要性。好的抽象真的能帮助所有使用这个类的人(包括作者自己)省下很大的功夫。也请留意像 人:工作,这样的抽象。工作既可以是一个名词表工种,也可以是一个动词表工作内容。
其实不难看出 成员属性 叫做 成员变量,成员方法 称为 成员函数 更为贴切。
此外,C++还为每一个 成员方法 内置了一个 this 指针。
this 指针
关于 this 指针有一段话很形象的描述了其实质。
当你进入一个房子后,
你可以看见桌子、椅子、地板等,
但是房子你是看不到全貌了。
对于一个类的实例来说,
你可以看到它的成员函数、成员变量,
但是实例本身呢?
this是一个指针,它时时刻刻指向你这个实例本身
this指针的具体细节我们不关注,关注一下几点就可以了。
- 所有的成员方法(包括无参构造),其第一个参数都是一个指向本类的指针,this指针。
- this指针指向本类,可以通过this指针来访问本类的成员。但是 this 指针不能访问非本类成员,如静态成员(静态属性、静态方法都不行)
- this指针是成员方法的第一个参数,是隐藏的,无需被再次声明(因为不想过多关注 this,我一直使用这句话,尽管它有很大的缺陷)。
类的对象
类是抽象,那么对象就是具体。这恰好对应前边范围和个体的说话。类是对一个范围进行析取,而对象就是深入每个个体来研究。
针对于范围我们看他们有什么特性,但对于个体的研究却大不相同。往往我们关注的是这个个体他的具体属性是什么,以及在某个时刻他对一件事是如何处理的(年龄:甲20岁,乙30岁;在一个坑边,甲跳过去,乙绕过去,丙无所无惧直接走上去再次跌倒)。
程序研究的往往是某一个特定的类型,但世间万千大道殊途同归,对于人能研究那一定能研究其他的类型。比如,计时器:100s,当计时结束时再次打开该计时器。
- 对象的构造语法:
class_name object
对象的构造语法也说明了,类是一种数据类型,我们将其称之为类类型。