<1>什么是面向对象的思想
C语言是面向过程的语言, C++是C语言的拓展,C++是面向对象的语言,而面向对象是一种思想,即OOP思想。如下图所示,
实体:就是客观存在并可相互区别的事物,例如人、书本、动物等。人作为实体,具有姓名、性别、年龄等这些属性以及吃饭、睡觉等行为。
类:是对现实生活中一类具有共同特征的事物的抽象,可以将数据和函数封装在一起,即类包含成员变量和成员方法。类的本质是类型,不是数据,所以不存在于内存中,不能被直接操作,只有被实例化为对象时,才可操作。例如“学生”这个类可以“学习”,而“木头”这个类就不会学习。
对象:对象是类(Class)的实例化,对象可以操作。
所以面向对象的思想就是,将现实中的问题即实体的属性、行为抽象成ADT抽象数据类型、方法,然后抽象成类的成员变量(属性)、成员函数(行为)。最后把类实例化为对象,成员变量针对对象来说是私有的,成员方法针对对象来说是公有的。
<2>面向对象的思想的特征
面向对象有三大特征:封装性、继承性、多态性。
(1)封装性指的是隐藏了对象的属性和实现细节,仅对外提供公共的访问方式,这样就隔离了具体的变化,便于使用,提高了复用性和安全性。类提供关键字public、protected和private用于声明哪些数据和函数是公有的、受保护的或者是私有的。这样可以达到信息隐藏的目的,即让类仅仅公开必须要让外界知道的内容,而隐藏其它一切内容。
封装:只隐藏对象的属性和实现细节,仅对外提供公共访问方式
优点:将变化隔离、便于使用、提高复用性、提高安全性原则:将不需要对外提供的内容隐藏起来;把属性隐藏,提供公共方法对其访问
(2)继承性,就是在一个已存在的类的基础上建立一个新的类,新的类具有它所继承的类的全部特性,且可以增加一些新的特性。派生类继承了基类的全部数据和函数,并具有自己私有的数据和函数,是“is a”的关系。这就提高了代码的复用性。继承是作为多态的前提的。
继承:提高代码复用性;继承是多态的前提
成员变量、成员方法、作用域、静态成员方法均可以继承,析构函数、构造函数、友元函数不能继承。
为什么析构函数不能被继承呢?
子类继承父类,就是继承了父类的成员函数和成员变量。初始化子类时,会先自动调用父类的构造函数。然后才调用子类的构造函数,析构时,按相反顺序进行。就是先构造的后析构,构造时首先会调用基类的构造函数,然后调用成员对象的构造函数。析构则严格按照与构造相反的次序执行,如果违背编译器将无法自动执行析构过程。
(3)多态性从系统实现的角度来讲可以划分为两类:静多态和动多态,以前学过的函数重载和运算符的重载属于静态多态性,在程序编译时就能决定调用的是哪一个函数,静态多态是通过函数的重载来实现的(运算符重载实际上也属于函数的重载)。动态多态性是程序运行过程中才动态地确定操作所针对的对象,运行时多态性是通过虚函数来实现的。多态的静多态和动多态,即早绑定和晚绑定。
静态多态:编译器在编译期间完成的,编译器根据函数实参的类型(可能会进行隐式类型转换),可推断出要调用那个函数,如果有对应的函数就调用该函数,否则出现编译错误。
动态绑定:在程序执行期间(非编译期)判断所引用对象的实际类型,根据其实际类型调用相应的方法。使用virtual关键字修饰类的成员函数时,指明该函数为虚函数,派生类需要重新实现,编译器将实现动态绑定。
动多态发生的条件:
1、指针指向一个完整的对象。
2、通过基类指针或引用调用基类的虚函数。