C++之于C,就像Algol-68之于Algol ---David L.Jones
如果你觉得C++还不够复杂,那你知道protected abstract virtual base pure virtual private
destructor是什么意思吗?你上次用到它又是什么时候呢?---Tom Cargill,C++ Journal,1990年秋
11.1初始OOP
从实用的角度讲,C++是ANSI C的一个超集,他基本上兼容ANSI C。不过C语言的有些特性在C++中并不支持。但是,要想从C++获益,或甚至完全理解它,必须理解一些基础概念。使用C++编程时“object-oriented paradigm”(面向对象编程模型)和“转换思维”的意思。我去掉了C++中的一些神秘之处,尽量用平实的语言来描述C++,把它与你所熟悉的C语言特性联系起来,帮助你尽快入门。
这有点类似于窗口编程模型。有时我们需要从窗口系统的角度学习改写自己的程序,此时的控制逻辑就要转变成主窗口循环处理。面向对象编程(OOP)也差不多,但它从改写数据类型的角度对程序进行读写。
面向对象编程把对象的使用作为程序设计的中心主题。软件对象的定义有很多种,其中绝大部分定义都同意面向对象的关键就是把一些数据进行操作的代码组合在一起,共用某种时髦手法将它们做成一个单元。许多编程语言把这种类型的单元称为class(类)。
面向对象编程的特点是继承和动态绑定。C++通过类的派生支持继承,通过虚拟函数支持动态绑定。虚拟函数提供了一种封装类体系实现细节的方法。
这里,我们将调用函数来进行这个操作,把焦点集中于抽象概念而不是底层实现细节中。
术语 | 定义 |
抽象(abstraction) | 它是一个去除对象中不重要的细节的过程。只有那些描述了对象的本质特征的关键点才被保留。抽象是一种设计活动,其他的概念都是提供抽象的OOP特性 |
类(class) | 类是一种用户自定义类型,就好像int这样的内置类型一样。内置类型已经有了一套针对它的完善操作(如算术运算等),类机制也必须允许程序员规定他所定义的类能够进行的操作。类里面的任何东西被称为类的成员。 |
对象(object) | 某个类的一个特定变量,就像j可能是int类型的一个变量一样。对象也可以被称作类的实例。 |
封装(encapsulation) | 把类型、数据和函数结合在一起,组成一个类。在C语言中,头文件就是非常脆弱的封装实例。它之所以是一个微不足道的例子。是因为它的组合是纯词法上的,编译器并不知道头文件是一个语义单位 |
继承(inheritance) | 这是一个很大的概念---允许类从一个更简单的基类中接收数据结构和函数。派生类获得基类的数据和操作,并可以根据需要对它们进行改写,也可以在派生类中增加新的数据和函数成员。在C语言中不存在继承的概念,没有任何内容可以模拟这个特性。 |
现在C++是一个相当庞大的语言。