面向对象是(OOP)是特殊的、设计程序的概念性方法;包含以下特性:
- 抽象;
- 封装和数据隐藏;
- 多态;
- 继承;
- 代码的可重用性;
为了实现这些特性并且将这些特性组合在一起,C++所做的最重要的改进是提供了类。
l 如何定义类;
l 如何为类提供公有部分和私有部分;
l 如何创建使用类数据的成员函数;
l 构造函数和析构函数是什么?是特殊的成员函数;创建和删除属于当前类的对象;
l this指针;
l 运算符重载和继承,代码重用的基础;
==========================================
过程性编程和面向对象编程
优先考虑如何表示数据,数据的操作;
用户与数据交互的方式有:初始化、更新和报告;——即用户接口;
==========================================
抽象和类
处理生活中复杂性的方法是:简化和抽象;
将问题的本质特征抽象出来,并根据特征来描述解决方案;
接口描述了用户如何初始化,更新和显示数据;
类型是什么
指定基本类型完成了三项工作:
l 决定数据对象需要的内存数量;
l 决定如何解释内存中的位;
l 决定可使用数据对象执行的操作或方法;
对于内置类型来说,有关操作的信息被内置到编译器中。但在C++中定义用户自定义的类型时,必须自己提供这些信息。付出这些劳动换来了根据实际需要定制新数据类型的强大功能和灵活性。
C++中的类
类是一种将抽象转换为用户定义类型的C++工具。它将数据表示和操纵数据的方法组合成一个整洁的包。
定义类:类规范由两个部分组成
类声明:以数据成员的方式描述数据部分,以成员函数的方式描述公有接口;
类方法定义:描述如何实现类成员函数;
什么是接口:
接口是一个共享框架;供两个系统交互时使用;
对于类,我们所说的公共接口,由编写类的人提供的方法组成。接口让程序员能够编写与类对象交互的代码。公共(public)就是使用类的程序,就是用户。要使用某个类,必须了解其公共接口;要编写类,必须创建其公共接口。
开发一个类,并编写一个使用它的程序,需要完成多个步骤。
通常C++程序员将接口(类定义)放在头文件中,将实现(类方法的代码)放在源代码中。
访问控制
Private
Public
描述了对类成员的访问控制。使用类对象的程序都可以直接访问公有部分,但只能通过公有成员函数来访问对象的私有成员。公有成员函数时程序和对象的私有成员之间的桥梁,提供了对象和程序之间的接口。防止程序直接访问数据被称为数据隐藏。
此外C++还提供了第三个访问控制关键字protected。
类设计尽量将公有接口与实现细节分开。公有接口表示设计的抽象组件。将实现细节放在一起并将它们与抽象分开被称为封装。数据隐藏(将数据放在类的私有部分)是一种封装,将实现的细节隐藏在私有部分中,也是一种封装。封装的另一个例子是,将类函数定义和类声明放在不同的文件中。
OOP是一种编程风格。数据隐藏防止直接访问数据,还可以让开发者无需了解数据是如何被表示的。只需要知道成员函数需要什么参数及返回什么类型即可。原则是将实现细节从接口设计中分离出来。
从程序维护角度上来看:如果以后找到更好的数据表示及成员函数细节的方法,可以从细节处修改,而无需修改程序接口。这样维护起来更加容易。
私有还是公有
无论类成员是数据成员还是成员函数,都可以在类的公有部分或私有部分中声明它。由于数据隐藏是OOP主要的目标之一,因此数据项通常放在私有部分,组成类接口的成员函数放在公有部分。否则就无法从程序中调用这个函数。
实现类成员函数
为类声明中原型表示的成员函数提供代码。
成员函数区别与普通函数的特征:
定义成员函数时,使用作用域解析运算符(: :)来标识函数所属的类;
类方法可以访问类的private组件;
void Stock: : update(double price);
update()具有类作用域,Stock的其他成员函数不必使用作用域解析运算符就可以使用update()方法,这是因为它们属于同一个类,因此update()是可见的。在类声明和方法定义之外使用update()需要采取特殊措施。
方法的第二个特点是:可以直接访问类的私有成员。
类声明中的函数都是会被定义成内联函数;
创建类的对象
Stock kate, joe;
调用成员函数,使用对象的成员函数,和使用结构成员一样,通过成员运算符:
kate.show();
joe.show();
所创建的每个新对象都有自己的存储空间,用于存储其内部变量和类成员。但同一个类的所有对象共享同一组类方法,即每一种方法只有一个副本。
例如:假设kate,joe都是Stock对象,则kate.shares将占据一块内存,joe.shares将占据一块内存,但是kate.show()和joe.show()都调用同一个方法,也就是说,它们将执行同一个代码块,只是将这些代码用于不同的数据。
在OOP中调用成员函数,被称为发送消息。将同样的消息发送给两个不同的对象将调用同一个方法,但该方法被用于两个不同的对象。(对象有各自的数据成员,但是共享一套成员函数)