一、数据类型:
在任何编程语言中,数据类型作为一个整体,ANSI-C包含的类型为:int、double、char……,程序员很少满意语言本身提供的数据类型,一个简单的办法就是构造类似:array、struct 或union。
那么,什么是数据类型呢?我们可以这样定义:一种数据类型是一些值的集合——通常char类型共有256不同的值,int有更多,double也包含更多的值,但是它通常和数学意义上的实数不同。
相应地,我们可以定义数据类型:包含一些值的集合,在值上面添加一些操作。通常,这些值都是计算机可以表示,同时对其的操作或多或少反应了可行的硬件指令。ANCI-C中的int类型在这方面表现得不是很好:在不同的机器上有不同的值,并且算术右移等操作也可能不同。
例如,通常我们定义一个线性结构的数据结构如下:
typedef struct node { struct node *next; ...information... } node;
并且我们定义如下的操作:
node * head(node * elt, const node * tail);
二、抽象数据类型:
当我们没有向用户展现具体实现,称为抽象数据类型,比如,我们可以从一个队列中移除一个元素,同事也可以按照一定的顺序向其中添加一个元素。
抽象数据类型给程序员提供了最大的灵活性,因为定义中不包含具体的实现,我们可以很自由地选择任何简单高效的实现。
抽象数据类型满足好的编程原则:信息隐藏与分治策略
代表数据项的信息只展现给需要知道的人:对程序员但不对用户。
通过抽象数据类型,我们可以方便地隔离程序的制定与实现:以自己的方式将一个大的任务拆成小的模块
三、例子--Set
我们怎样构建一个抽象数据类型呢?一个集合set包含如下操作:add, find, drop……,它们将提供集合一个元素并且会返回添加的元素。find操作被用作告诉我们是否某一个元素在集合内。
这样看来,set是一个抽象数据类型,声明我们对set的操作,从一个Set.h头文件开始:
#ifndef SET_H #define SET_H extern const void * Set; void * add (void * set, const void * element); void * find (const void * set, const void * element); void * drop (void * set, const void * element); int contains (const void * set, const void * element); unsigned count (const void * set); #endif
Set将在某种程度上展示我们在sets上的操作,add( )向set中添加一个元素,返回是否已经存在于set或是添加成功,find( )在set中寻找一个元素,返回位置或是空指针。drop( )定位一个元素并从set中移除,返回移除元素。contains( )将find( )的结果转换为一个具体的值。
通用指针void*贯穿始终,一方面,通过它可以隐藏set的一些细节,另一方面,它允许我们虚拟的传递任何的类型给add( )以及其他的函数。
四、内存管理
如何获取一个set集合?Set是一个指针,并不是通过typedef定义的类型,结果,我们不能把Set类型定义为局部变量或是全局变量。相反,我们只能通过使用指针指向sets与其中的元素,在new.h中定义如下代码:
#ifndef NEW_H #define NEW_H void * new (const void * type, ...); void delete (void * item); #endif
五、Object
假如我们打算收集set中的任何感兴趣的数据,需要另一种数据类型Object,在Object.h中描述如下:
#ifndef OBJECT_H #define OBJECT_H extern const void * Object; /* new(Object); */ int differ (const void * a, const void * b); #endif
六、应用
通过上述头文件,可以写出如下的应用main.c :
#include <stdio.h> #include "new.h" #include "Object.h" #include "Set.h" int main () { void * s = new(Set); void * a = add(s, new(Object)); void * b = add(s, new(Object)); void * c = new(Object); if (contains(s, a) && contains(s, b)) puts("ok"); if (contains(s, c)) puts("contains?"); if (differ(a, add(s, a))) puts("differ?"); if (contains(s, drop(s, a))) puts("drop?"); delete(drop(s, b)); delete(drop(s, c)); return 0; }
在下篇文章中(C面向对象编程--抽象数据类型(2)),将逐一实现本文所有头文件中声明的函数
相关推荐
该书主要探讨了如何在基于ISO C89标准的C语言项目中运用面向对象设计技巧,使这些项目能够享受到面向对象编程带来的好处。作者假设读者已经具备良好的C语言基础,同时了解C++的面向对象模型也将有助于更好地理解这些...
面向对象编程(Object-Oriented Programming,简称OOP)是一种常用的软件开发方法,它通过将数据和处理数据的方法封装在对象中,使程序结构清晰、易于理解和维护。本篇文章将根据给定的“面向对象编程-选择题.pdf”...
通过抽象数据类型、对象、内存管理和动态链接等手段,可以在C语言中实现面向对象编程的核心理念,提升代码的组织性和复用性。 11. 练习 为了巩固这些知识,应该通过解决实际问题和编写练习代码来加深理解和应用,...
Java面向对象编程PDF ...Java面向对象编程的基础知识包括对象和类的概念、抽象的数据类型、类的成员、类的组成和类的转化过程。这些知识点是Java编程的基础,理解这些概念对于学习Java编程非常重要。
面向对象编程:Java中的抽象数据类型.doc
- 类是一种数据类型,它是对一组具有相同属性和行为的对象的抽象。 - 类可以看作是创建对象的模板,每个类的实例都是一个对象。 - 例如,定义一个“学生”类,可以包含姓名、年龄等属性,以及学习、休息等方法。 **...
1. 抽象:在MATLAB面向对象编程中,抽象指的是从实际世界中提取问题的本质特征,并在程序中通过对象来表示这些特征。例如,我们可以创建一个代表汽车的对象,这个对象只需要包含汽车的基本属性如品牌、型号、颜色和...
在LabVIEW中创建类可以定义用户自定义的数据类型,并且这些类型支持面向对象编程的特性,如封装和继承。 - **封装**:通过将数据和方法绑定到一起,使得数据对非成员VI不可见。这意味着外部VI只能通过成员VI访问类...
面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它基于“对象”的概念,将数据和操作数据的方法封装在一起。在“写给大家看的面向对象编程书(第3版)”中,作者深入浅出地介绍了这一主题,...
5. **模板与泛型编程**:虽然不是面向对象特性,但C++的模板功能允许我们编写通用代码,处理不同类型的对象,与面向对象编程相结合,能提供强大的抽象能力。 6. **异常处理**:C++提供了异常处理机制,通过`try`, `...
Java是一种广泛使用的面向对象编程语言,它封装了数据和操作数据的行为,并支持继承和多态特性,使得Java程序可以高度模块化和复用。在Java中,面向对象编程(OOP)的三大基本特性是封装、继承和多态。 封装是面向...
为了充分体验C语言的面向对象编程,读者需要对ANSI-C有良好的掌握,包括结构体、指针、函数原型和函数指针的使用。随着书中内容的深入,读者会遇到面向对象编程中的“新术语”,并学会如何将这些抽象概念转化为实际...
面向对象编程(Object-Oriented Programming,简称OOP)是一种广泛应用的编程范式,它将程序设计中的实体抽象为对象,通过对象之间的交互来实现功能。这种编程方式使得代码更易于理解和维护,同时也增强了代码的复用...
1. **封装**:这是面向对象编程的基础,它涉及将数据和操作数据的函数封装在一起。在C中,可以通过结构体和函数指针来实现封装。结构体存储数据,而函数指针则指向处理这些数据的函数。 2. **继承**:在C中,可以...
《JAVA面向对象编程》是孙卫琴老师的一本经典教材,深入浅出地讲解了Java语言的核心特性,尤其是面向对象编程的理念与实践。这本教材的示例源代码提供了丰富的学习资源,帮助读者通过实际操作理解理论知识。 首先,...
《C# 面向对象编程详解》 C# 是一种强大的、类型安全的编程语言,广泛用于构建各种类型的软件,尤其是Windows平台的应用程序。面向对象编程(Object-Oriented Programming,OOP)是C#的核心特性之一,它提供了一种...
在面向对象编程中,抽象通常通过抽象类和接口来实现。抽象类不能实例化,但可以作为其他类的基础;接口则定义了一组方法签名,具体的实现由实现该接口的类来完成。 #### Delphi中的面向对象编程实践 在Delphi中...
"exercise1"标签表明这是一个系列练习的第一个部分,旨在帮助学生理解和应用面向对象编程的基本原则。 面向对象编程(Object-Oriented Programming, OOP)的核心概念包括类(Class)、对象(Object)、封装...