为了达到对OOP最准确最深入的理解,我把散落各处边边角角的有关OOP的描述都梳理总结在此,希望连点成线,逐个击破,形成成熟的OOP思维。
c++ 集合了面向对象编程,泛型编程和过程化编程三种编程范式于一体。(所有说c++难都是因为要学的东西太多,实际上学会了就会异常灵活)
-
过程化编程: 强调算法,是要让问题去满足语言的特性,是top-down 的设计,自顶向下,旨在把大型程序分解为小的便于管理和处理的任务。不断地分解,变为一个个小小的模块,用函数实现。C语言就是典型的过程化编程。
-
OOP :为了应付复杂程度不断增高的编程任务而发明的,通过重用代码和抽象通用概念的方式解决大型项目的处理, 强调数据, 旨在设计和问题的特性对应的数据类型,是用语言去满足问题的需求。是bottom up的方法。所以OOP方法首先就是要设计类,是从类的设计到整个程序的完成的。当然设计有用又可靠的类是很难的,所以厂商提供了大量的类库(都是很可靠的经过仔细测试的代码),可以一定程度简化我们的工作
-
泛型编程:由模板提供。强调独立于特定数据类型,编写独立于类型的代码,比如对不同类型的数据进行排序,一般要对整数,小数,字符等类型各写一个排序函数,但是泛型编程通过对语言本身进行扩展,可以只写一个泛型函数,(即不是特定数据类型的函数)。OOP侧重于管理大型项目,而泛型编程提供了执行常见任务的工具,比如对数据排序或者合并链表。
c++的二重性:OOP提供高级抽象;C语言提供低级硬件访问
继承:OOP中最强大特性之一。派生类,基类。派生类可以继承基类的特性,还能重用基类的代码。
- 公有继承:派生对象是基类对象的特例。比如:物理学家和科学家。
- 私有继承:
- 保护继承:
- 多重公有继承:一个类从多个类派生而来。
类就是oop的代表,所以类是oop的核心,抓紧类,就抓紧了oop。
用c佳佳就是为了用他的oop特性!可见oop才更重要,语言本身没有oop特性重要,语言只是实现oop编程方式的工具,多种语言都可以实现oop编程方式,在这一点上,c佳佳并不特殊。
计算机的发展历程中,是硬件带动了软件的发展。先有了计算机,主要是大型机和工作站,然后促使人们编程序控制硬件做事情,于是从机器语言到汇编语言,到c和pascal在上世纪七十年代引领人们进入结构化编程的有秩序有规程的时代。你可以清晰的看到语言的进步和变化。上个世纪的八十年代,c一统天下,在编程语言中占据着统治地位。但也正是同时,用c的人多了,发现问题的人也就多了,于是人们解决痛点,在大型程序的开发上,发明了一种新的编程模式,oop。当时只有c佳佳和SmallTalk两个语言可以做到oop。
其实计算机语言就处理俩概念,那么多代码,实际上抽象概括起来,就是数据和方法/算法。
过程性语言就强调算法方面,就是你先确定计算机,她应该做啥,然后你就写程序让她做这些事情,就结了。即根据要做什么!来写程序。数据倒是次要的,要用就用呗,没有提前去规划考虑数据本身。后来在过程化编程的基础上又改进了一些,变成了结构化编程,大大提高了程序的清晰度,可靠性和可维护性,即把一个大任务分成很多子任务,自顶而下的,用多个子程序或者函数来分别实现一部分功能。但是结构化编程还是根据要执行什么操作来构思一个程序,还是强调算法。
oop是一次很大的改变,革新,它完全从另一个角度出发,计算机科学家们可真聪明!它强调数据,他的核心理念就是,设计与问题本质特点相对应的一个数据形式!!!类,就是这种新的数据格式,而对象,就是根据类这个规范而构造出来的数据结构!!
比如一个绘图程序,就要设计很多个类,一个类被定义用于表示圆,一个类表示矩形,一个类表示直线等等等等,然后基于这些类,我们来开发一个使用这些类的程序。所以oop它是自下而上的编程,先写低级组织(类),再写高级组织(程序)。
oop不把重心放在任务上,而是放在表示概念上。它引入了很多新概念,比如多态,继承,信息隐藏,,,使得oop不仅仅只是把数据和方法合并为类的定义,还有很多其他的好处,比如代码重用,保护数据,为函数和运算符创建多个定义,使用旧类派生新类。
oop的目标就是去抽象通用概念,把他们可能需要的方法抽象出来,然后尽量代码重用。在这一点上,泛型编程也一样,它也是为了使得代码重用和抽象通用概念更简单。
OOP的本质是设计并扩展自己的数据类型。C++内置的类型是创建自己的类型的基本组件。
OOP强调程序如何表示数据。
OOP编程第一步就是根据程序和类的接口来描述数据,指定如何使用数据。
然后设计一个类实现出这个接口。私有数据成员存储信息,公有成员函数提供访问数据的唯一途径。所以私有部分实现了数据隐藏。只要知道公有接口就可以使用类。
要把接口和细节分开,一般是把有接口的类声明放在头文件。有成员函数实现的源代码放在方法文件。
每个对象都存储自己的数据,但共享类方法。
如果方法需要显式地引用调用它的对象,就要用this指针。this指针指向调用对象的地址,所以*this是调用对象的别名。
OOP另一个目标:隐藏内部机理,强调实质。比如重载运算符就做到了这一点,代码更简单自然贴近人类思维。