面向对象的语言更贴近人类的思维方式,在很大程度上降低了代码的复杂度,同时提高了代码的可读性和可维护性。传统的C代码也可以设计成更易读、易维护、复杂度低的优美代码,本文将通过一个实际的例子来说明这一点。基本知识结构C语言除了提供基本的数据类型外,还为用户提供了自定义数据类型即结构体的能力。在C语言中,您可以使用结构来表示任何实体。结构体是面向对象语言中类概念的雏形,如:typedefstruct{floatx;floaty;}Point;定义平面坐标系中的一个点,该点中有两个字段,x坐标和y坐标。结构中的字段称为结构成员。结构中的数据类型可以是简单数据类型,也可以是其他结构,甚至结构本身也可以嵌套。例如,一个标准的链表结构可以定义如下:typedefstructnode{void*data;//数据指针intdataLength;//数据长度structnode*next;//指向下一个节点}Node;可以看到结构体node中next指针的类型就是节点类型。函数指针指针是C语言的灵魂,也是C比其他语言灵活和强大的地方。所以学习C语言一定要掌握好指针。函数指针是指向内存映射中函数首地址的指针。通过函数指针,可以将一个函数作为参数传递给另一个函数,并在适当的时候调用,实现异步通信等功能。例如UNIX/Linux系统中信号注册函数的原型如下:void(*signal(intsigno,void(*func)(int)))(int)使用时需要定义一个信号处理外部函数(信号处理程序),然后使用signal(sigNo,handler)在进程上注册处理程序。当信号发生时,进程可以回调信号处理函数。使用函数指针作为结构的成员前面提到,结构的成员可以是简单的数据结构,也可以是其他结构,当然也可以是指针。当函数指针作为结构体的成员,而这些函数只用来操作结构体中的数据时,就可以形成一个独立的实体,既包含数据又包含对数据的操作,所以自然而然地引出了概念班级(类)。面向对象语言的特性一般来说,继承、封装和多态被认为是面向对象语言必须支持的三大特性。正是通过这三个特点,面向对象才优于面向过程。.由于语言开发者的宣传或其他原因,表面上的面向对象的思想应该通过语言作为载体来实现。然而,面向对象实际上是一种软件设计思想,可以完全独立于具体的实现。的。即便如此,不可否认的是,这些所谓的纯面向对象语言在代码可读性和与人的自然思维的匹配度上,都比面向过程的语言要好很多。语言层面的面向对象我们一般需要描述一个对象,一般需要描述这个对象的一些属性,比如一个盒子(box)是一个实体,它有6个面,有颜色,重量,还有是不是空的,能不能放东西进去,能不能放东西出来。在面向对象的语言中,这样的对象通常被抽象成一个类(class)::Box.put(cake);ox.get();//从盒子里取出东西。在面向过程的语言中,实体通常被传递给一个贯穿整个世界的函数。以Box为例,在对Box进行操作时,往往是这样的:Put(Box,cake);//把蛋糕放进盒子里Get(Box);//从盒子里取出东西第一种代码形式更符合常识,所以大多数面向对象语言都提供了对这种语言级细节的支持,使得代码的可读性和可理解性大大增加。C语言,作为一门灵活简单的语言,我们可以通过C语言提供的简单机制来实现这样一种更加优美的代码形式。语言无关。在本节中,我以一个链表(list)的例子来说明如何用C语言设计一个面向对象的代码。接口的定义接口是面向对象语言中一个比较重要的概念。接口只告诉实现接口的实体可以执行什么功能,但不暴露实现方式。这样做的好处是实现者可以在不接触接口用户代码的情况下调整实现。我们看一下链表的接口定义:清单1.链表的接口定义#ifndef_ILIST_H#define_ILIST_H//定义链表中的节点结构typedefstructnode{void*data;structnode*next;}Node;//定义链表结构typedefstructlist{structlist*_this;Node*head;intsize;void(*insert)(void*node);//函数指针void(*drop)(void*node);void(*clear)();int(*getSize)();void*(*get)(intindex);void(*print)();}List;voidinsert(void*node);voiddrop(void*node);voidclear();intgetSize();void*get(intindex);voidprint();#endif/*_ILIST_H*/IList界面中可以清楚的看到,对于一个列表实体(也就是一个对象),可以对其进行insert,drop,clear,getSize,get(index)它和打印等操作。接口实现列表2.构造方法Node*node=NULL;List*list=NULL;voidinsert(void*node);voiddrop(void*node);voidclear();intgetSize();voidprint();void*get(intindex);List*ListConstruction(){list=(List*)malloc(sizeof(List));node=(Node*)malloc(sizeof(Node));list->head=node;list->insert=insert;//在列表实体上注册插入函数实现list->drop=drop;list->clear=clear;list->size=0;list->getSize=getSize;list->get=get;list->print=print;list->_this=list;//用_this指针保存list本身return(List*)list;}需要注意的是这里的_this指针可以保证外部对list的操作映射到对_this的操作简化了代码。List3.插入和删除//向列表对象中插入一个节点voidinsert(void*node){Node*current=(Node*)malloc(sizeof(Node));current->data=node;current->next=list->_this->head->next;list->_this->head->next=current;(list->_this->size)++;}//删除指定节点nodevoiddrop(void*node){Node*t=list->_this->head;Node*d=NULL;inti=0;for(i;i
