`

C面向对象编程--抽象数据类型(1)

阅读更多

一、数据类型:

      在任何编程语言中,数据类型作为一个整体,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)),将逐一实现本文所有头文件中声明的函数

 

1
0
分享到:
评论

相关推荐

    C语言面向对象编程

    该书主要探讨了如何在基于ISO C89标准的C语言项目中运用面向对象设计技巧,使这些项目能够享受到面向对象编程带来的好处。作者假设读者已经具备良好的C语言基础,同时了解C++的面向对象模型也将有助于更好地理解这些...

    面向对象编程-选择题.pdf

    面向对象编程(Object-Oriented Programming,简称OOP)是一种常用的软件开发方法,它通过将数据和处理数据的方法封装在对象中,使程序结构清晰、易于理解和维护。本篇文章将根据给定的“面向对象编程-选择题.pdf”...

    ANSI-C面向对象编程1

    通过抽象数据类型、对象、内存管理和动态链接等手段,可以在C语言中实现面向对象编程的核心理念,提升代码的组织性和复用性。 11. 练习 为了巩固这些知识,应该通过解决实际问题和编写练习代码来加深理解和应用,...

    java面向对象编程pdf

    Java面向对象编程PDF ...Java面向对象编程的基础知识包括对象和类的概念、抽象的数据类型、类的成员、类的组成和类的转化过程。这些知识点是Java编程的基础,理解这些概念对于学习Java编程非常重要。

    面向对象编程:Java中的抽象数据类型.doc

    面向对象编程:Java中的抽象数据类型.doc

    JAVA编程基础-05面向对象基础-zhouxl.pdf

    - 类是一种数据类型,它是对一组具有相同属性和行为的对象的抽象。 - 类可以看作是创建对象的模板,每个类的实例都是一个对象。 - 例如,定义一个“学生”类,可以包含姓名、年龄等属性,以及学习、休息等方法。 **...

    Matlab面向对象编程

    1. 抽象:在MATLAB面向对象编程中,抽象指的是从实际世界中提取问题的本质特征,并在程序中通过对象来表示这些特征。例如,我们可以创建一个代表汽车的对象,这个对象只需要包含汽车的基本属性如品牌、型号、颜色和...

    Labview面向对象编程快速入门.pdf

    在LabVIEW中创建类可以定义用户自定义的数据类型,并且这些类型支持面向对象编程的特性,如封装和继承。 - **封装**:通过将数据和方法绑定到一起,使得数据对非成员VI不可见。这意味着外部VI只能通过成员VI访问类...

    写给大家看的面向对象编程书(第3版)代码

    面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它基于“对象”的概念,将数据和操作数据的方法封装在一起。在“写给大家看的面向对象编程书(第3版)”中,作者深入浅出地介绍了这一主题,...

    c++面向对象编程实例大全

    5. **模板与泛型编程**:虽然不是面向对象特性,但C++的模板功能允许我们编写通用代码,处理不同类型的对象,与面向对象编程相结合,能提供强大的抽象能力。 6. **异常处理**:C++提供了异常处理机制,通过`try`, `...

    面向对象编程(Java).pdf

    Java是一种广泛使用的面向对象编程语言,它封装了数据和操作数据的行为,并支持继承和多态特性,使得Java程序可以高度模块化和复用。在Java中,面向对象编程(OOP)的三大基本特性是封装、继承和多态。 封装是面向...

    C语言面向对象编程(doc格式)

    为了充分体验C语言的面向对象编程,读者需要对ANSI-C有良好的掌握,包括结构体、指针、函数原型和函数指针的使用。随着书中内容的深入,读者会遇到面向对象编程中的“新术语”,并学会如何将这些抽象概念转化为实际...

    写给大家看的面向对象编程书

    面向对象编程(Object-Oriented Programming,简称OOP)是一种广泛应用的编程范式,它将程序设计中的实体抽象为对象,通过对象之间的交互来实现功能。这种编程方式使得代码更易于理解和维护,同时也增强了代码的复用...

    c语言面向对象设计

    1. **封装**:这是面向对象编程的基础,它涉及将数据和操作数据的函数封装在一起。在C中,可以通过结构体和函数指针来实现封装。结构体存储数据,而函数指针则指向处理这些数据的函数。 2. **继承**:在C中,可以...

    JAVA面向对象编程源代码-孙卫琴

    《JAVA面向对象编程》是孙卫琴老师的一本经典教材,深入浅出地讲解了Java语言的核心特性,尤其是面向对象编程的理念与实践。这本教材的示例源代码提供了丰富的学习资源,帮助读者通过实际操作理解理论知识。 首先,...

    c# 面向对象 --用书.rar

    《C# 面向对象编程详解》 C# 是一种强大的、类型安全的编程语言,广泛用于构建各种类型的软件,尤其是Windows平台的应用程序。面向对象编程(Object-Oriented Programming,OOP)是C#的核心特性之一,它提供了一种...

    Delphi面向对象编程思想

    在面向对象编程中,抽象通常通过抽象类和接口来实现。抽象类不能实例化,但可以作为其他类的基础;接口则定义了一组方法签名,具体的实现由实现该接口的类来完成。 #### Delphi中的面向对象编程实践 在Delphi中...

    面向对象--卡内基--ssd3

    "exercise1"标签表明这是一个系列练习的第一个部分,旨在帮助学生理解和应用面向对象编程的基本原则。 面向对象编程(Object-Oriented Programming, OOP)的核心概念包括类(Class)、对象(Object)、封装...

Global site tag (gtag.js) - Google Analytics