抽象数据类型
前面定义的 c a r car car类非常具体,程序常常通过定义类表达更加通用的概念,就抽象数据类型ADT的而言,使用类是非常好的概念,顾名思义ADT以通用的方式来描述数据类型,而没有引入语言和实现细节,例如栈。
我们不妨以栈为例,来看看如何描述一个抽象数据类型
具有的操作
- 可以创建空栈
- 可以讲数据项添加到栈顶
- 可以讲数据项从栈顶删除
- 可以查看栈是否填满
- 可以查看栈是否为空
来看下面实例
typedef int Item;
class Stack{
private:
enum class Stack_Size {Small = 10,Medium = 100,Large = 1000};
Item _ItemArr[(unsigned long)Stack_Size::Large];
int top;
public:
Stack();
bool isEmpty() const;
bool isFull() const;
bool push(const Item&);
bool pop(Item&);
};
私有部分表明改栈是由数组实现的,而公有接口隐藏了这一点,所以即使程序兴致大发,合理的改为new实现,对于外部使用者来说也没有任何区别,而为了栈通用,使用了typedef来定义数据类型,在后面我们会学到类模版来更好实现的这一点。
通过私有化数据成员来保证各个数据项能被成员函数正确的处理,这种保证措施是OOP更加可靠的之一。
总结
面向对象编程强调的是程序如何使用数据,使用OOP方法解决编程第一步是根据他与程序的接口来描述数据.从而制定如何使用数据。然后设计一个类来实现该接口,一般来说私有数据成员存储信息,公有成员函数提供访问数据的唯一途径,类将数据和方法合成一个单元,其私有性实现数据隐藏。
一般来说,将类声明分为两个文件存储,一个头文件存储类声明(由函数原型表示的方法),定义成员函数的源代码应该放在源文件中,这样便将接口细节和实现细节分开,从理论来上说只需要查看接口就可以使用类。程序不应该依赖类的实现细节,只要程序与类通过定义接口的方法进行通信,程序就可以随意的对任何部分进行修改,而不必担心导致意外的不良影响。
类是用户定义的类型,对象是类的实例,C++试图让用于定义的类型与内置类型更加一致,提供了许多与普通内置类型相同的操作方法。