`

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
分享到:
评论

相关推荐

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

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

    面向对象编程:Java的简单数据类型

    数据类型就是对内存位置的抽象表达。程序员可以利用多种数据类型:某些由编程语言定义,某些由外部库定义,还有些则由程序员来定义。很多编程语言都依赖于特定的计算机类型和对数据类型属性的具体编译实现,比如word...

    Java学习笔记---15.面向对象编程10-Java中final关键字,抽象类与接口

    接口的定义方式为: interface 接口名 { 数据类型 常量名 = 常量值; 返回值类型 方法名(); .......} 在Java中,一个类只能继承一个类,但是却可以实现(implements)多个接口. 如果实现接口的类不是抽象类的话,则该...

    DataStructures-ADT:抽象数据类型(ADT)算法的实现

    在像Java这样的面向对象的语言中,抽象数据类型及其实现共同构成一个类。 与ADT相关的每个操作都由成员,功能或方法实现。 定义数据项所需空间的变量称为数据成员。 对象是类的实例,即在计算机程序执行期间创建并...

    C++面向对象高效编程

    全书共分为两部分,第一部分介绍面向对象编程的基础和应用;第二部分说明了如何建立抽象的概念及其策略,并研究了C++对象模型。书中带有大量的代码实例,使读者不仅能够从理论上得以提高,而且还能够轻松地在实践中...

    Python面向对象编程指南

    Python面向对象编程指南深入介绍Python语言的面向对象特性,全书分3个部分共18章。第1部分讲述用特殊方法实现Python风格的类,分别介绍了__init__()方法、与Python无缝集成—基本特殊方法、属性访问和特性及修饰符、...

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

     在本文中,我们将考察Java中的数据类型,但是我们将介绍抽象数据类型(ADT)的概念。我们还将通过介绍Java Collections Framework(Java 集合架构)来学习Java定义的一些ADT。 ADT 一个ADT是一个仅由保存的...

    了解C++面向对象编程.rar

    C++既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计。 ...

    C面向对象编程基础

    C++是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多种程序设计风格。

    C编程思想--chinapub书籍--文本PDF

    2.7 抽象数据类型 35 2.8 对象细节 35 2.9 头文件形式 36 2.10 嵌套结构 37 2.11 小结 41 2.12 练习 41 第3章 隐藏实现 42 3.1 设置限制 42 3.2 C++的存取控制 42 3.3 友元 44 3.3.1 嵌套友元 45 3.3.2 它是纯的吗 ...

    SCALA从入门到精通个人笔记含代码

    面向对象编程初级 类和对象 包 包对象 面向对象编程中级 封装 继承 多态 面向对象编程高级 伴生对象 特质 嵌套类 类型约束 Scala数据结构之集合 函数式编程高级 隐式转换和隐式值 偏函数 高阶函数 ...

    写给大家看的面向对象编程书(第3版).[美]Matt Weisfeld(带详细书签).pdf

    第1章 面向对象概念介绍 1 1.1 过程式程序设计与OO程序设计 2 1.2 从过程式开发转向面向对象开发 4 1.2.1 过程式程序设计 5 1.2.2 OO程序设计 5 1.3 对象到底是什么 5 1.3.1 对象数据 5 1.3.2 对象行为 6 ...

    java面向对象程序设计.pptx

    4.1.2 用类实现抽象数据类型:时钟类(续) 例4-1 时钟类的实现。 该例子包含两个文件Time1.java和TimeTest1.java。 Time1.java是用于定义时钟类。 TimeTest1类是一个用于测试时钟类的包含main方法的主类,在main...

    跟我学Java面向对象程序设计技术及应用——Java中的面向对象技术(第1部分).pdf

    2) 面向对象编程的四个基本机制是什么? 3) 你知道 java 语言在面向对象编程方面有何独特的特点吗? 1.1.1 面向对象技术基础 1、面向对象(OO)的基本概念 (1)面向对象的基本思想 面向对象是一种新兴的程序设计...

    Java基础笔记知识点.rar

    JavaSE 之前整理的笔记,一共16章:1.Java概述,2....面向对象4(抽象类 接口 包装类),8.GUI编程--awt,9.GUI编程--计算器案例,10.GUI编程--Swing,11.集合,12.多线程,13.IO流,14.网络编程,15.JDBC编程,16.异常处理

    面向对象考试试卷A(2014).doc

    有关C++的一些资料,对C++的一些基本定义,C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。...

    上课时的练习代码主要为C语言代码,部分C++.rar

    可以使用抽象数据类型进行基于对象的编程;可以使用多继承、多态进行面向对象的编程;可以担负起以模版为特征的泛型化编程。C++与C语言的本质差别:在于C++是面向对象的,而C语言是面向过程的 这是有关于C++的一个...

    C++想面向对象编程思

    内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚函数、模板和包容器...

    PHP_面向对象教程(强力推荐)

    面向对象编程 (ObjectOrientedProgramming,OOP, 面向对象程序设计)是一种计算机编程 架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成,OOP 达到了软件工程的三个目标:...

    实验04 Java面向对象编程2.doc

    ○1将Person类设计为抽象类,pay()为抽象方法,设计程序实现多态性。 ○2将Person类设计为接口,设计程序实现多态性。 提示:设置授课时数teachingHours为成员变量,计算工资支出为成员方法,考虑是否定义构造方法。...

Global site tag (gtag.js) - Google Analytics