在C++中,类的接口作为函数在该类中列出,这些函数称为成员函数(member function);在Smalltalk中,称为方法(method);在Ada中,称为操作(operation)(不要与C++的操作符(operator)混淆)。这些函数提供类的接口,因此也称为接口函数(interface function)。
在C++中,不是函数的元素称为数据成员(data member)。良好的抽象(即设计良好的接口)绝不会把任何数据成员置于public区域。
类(class)和类型(type):
类型有基本类型和复合类型(用户自定义类型);
类(class)就是复合类型(用户自定义类型)。
允许客户设置对象中的数据成员值的方法,通常称为设值方法(setter)。用于返回数据成员值的方法称为获值方法(getter)。
C++中的数据抽象 数据抽象面向对象编程的一项基本任务是创建带有适当功能的类,并隐藏不必要的细节(即抽象数据)。
数据抽象的目的是,提供清晰和充足的接口,在方便且受控的模式下允许用户访问底层实现。接口应满足用户使用对象的基本需求。我们的唯一目标是:牢记客户,为让她们的生活更加舒适而不懈努力。因此,抽象的首要目标是,为客户简化操作。
如果能理解接口的概念,就很容易理解实现。接口告诉客户可以做什么,实现则负责如何做,所有的工作都在实现中完成。客户无需了解类如何实现接口所提供的操作。因此,实现用于支持由对象表现的接口。
因此,数据抽象,接口和实现都是为了客户的方便和安全。
数据抽象引出了相关的概念:数据封装(data encapsulation)。只要存在由实现支持的带接口的对象,就一定存在实现隐藏(implementation hiding)(也称为信息隐藏)。有些信息对实现而言相当重要,但是对使用接口的用户而言却毫无价值,这些信息将被隐藏在实现中。实现由接口封装,而且接口是访问该实现的唯一合法途径。
对于类来说,接口是Public部分,
对于模块来说,接口是虚基类。
有时,人们谈论的是抽象数据类型(abstract data type),而不是数据抽象(data abstraction),这可能让学习OOP的人感到困惑。其实,它们的关系非常密切。
抽象数据类型是由程序员定义的新类型,附带一组操控新类型的操作。定义新抽象类型将直接应用数据抽象的概念。抽象数据类型也称为程序员定义类型(programmer defined type)。
利用数据抽象,我们创建了一个新类型,并且为这个新类型提供了一组有用的操作。因为语言没有直接支持这个类型,所以程序员只好利用抽象实现它,因此它是一个抽象数据类型。鉴于此,数据抽象有时也被定义为:定义抽象数据类型以及一组操作并隐藏实现的过程。
我们希望让抽象数据类型也拥有和语言定义类型相同的特权和责任(也就是说,不应该让新类型的客户发现语言定义类型和抽象数据类型之间有任何区别)。要达到这个目标,必须让语言支持操作符重载。
C++中数据抽象的基本单元是类(class)。
每个类都有3个不同的访问区域。在我使用过的所有OOP语言中,只有C++精心设计了这3个区域。
public 区域是最重要的区域,为类的用户指定了类的接口。任何客户(任何使用类创建对象或通过继承使用类创建另一个类的人)都可以访问public区域。
作为public区域的对立面,private区域是任何客户都不能直接访问的区域,只供实现使用。换言之,只有类的实现才能访问private区域。
第3个区域是protected区域,用于代码的扩展和复用(继承)。
在一个类中,可以声明多个这些区域(public,protected和private),编译器将负责合并。
类和结构之间只有一个微小的差别:如果不予以指定,类中的元素都为private,而结构中的元素都为public。这是C++中,类和结构的唯一区别。
构造函数构造函数(constructor):所有与类名(本例为 TInt)相同的该类成员函数都称为构造函数,它们用于创建和初始化新对象。
为什么我们需要构造函数?
当然是为了分配内存和初始化默认值。