C语言面向对象编程
面向对象的编程支持封装、继承和多态三种特性,通过这三种特性,来理解什么是面向对象。
封装:
通过采用封装特性,把一组相关联的函数和数据圈起来,使圈外面的代码只能看见部分函数,数据则完全不可见。在.h文件中定义数据结构以及函数,在程序文件中实现。本例中数据结构在.h文件中定义。
typedef struct
{
double x;
double y;
}ST_POINT_T;
extern ST_POINT_T* creatPoint(double x, double y);
extern double distance(ST_POINT_T* p1, ST_POINT_T* p2);
ST_POINT_T* creatPoint(double x, double y)
{
ST_POINT_T* p = (ST_POINT_T *)malloc(sizeof(ST_POINT_T));
if (p != NULL)
{
p->x = x;
p->y = y;
return p;
}
}
double distance(ST_POINT_T* p1, ST_POINT_T* p2)
{
double dx = p1->x - p2->x;
double dy = p1->y - p2->y;
return sqrt(dx * dx + dy * dy);
}
继承:
typedef struct
{
double x;
double y;
char* name;
}ST_NAMEPOINT_T;
extern ST_NAMEPOINT_T* creatNamePoint(double x, double y, char* name);
ST_NAMEPOINT_T* creatNamePoint(double x, double y, char* name)
{
ST_NAMEPOINT_T* p = (ST_POINT_T *)malloc(sizeof(ST_NAMEPOINT_T));
if (p != NULL)
{
p->x = x;
p->y = y;
p->name = name;
return p;
}
}
void main()
{
ST_NAMEPOINT_T* point1 = (ST_NAMEPOINT_T *)malloc(sizeof(ST_NAMEPOINT_T));
ST_NAMEPOINT_T* point2 = (ST_NAMEPOINT_T *)malloc(sizeof(ST_NAMEPOINT_T));
double dis;
point1 = creatNamePoint(1, 2, "leftpoint");
point2 = creatNamePoint(1, 3, "rightpoint");
dis = distance((ST_POINT_T*)point1, (ST_POINT_T*)point2);
printf("distance is %f", dis);
}
ST_NAMEPOINT_T数据结构被当做是ST_POINT_T数据结构的衍生体,两者前两个成员的顺序一样。看上去投机取巧,在面向对象理论提出之前,这已经很常见了。
多态:
void copy()
{
int c;
while ((c = getchar()) != EOF)
{
putchar(c);
}
}
在这个程序中,getchar主要负责从STDIN中读取数据,putchar将数据写入STDOUT,但是STDIN和STDOUT具体指代哪个设备呢,是不确定的。这类函数就具有多态性,依赖于STDIN和STDOUT的具体类型。
struct FILE
{
void (*open)(char * name, int mode);
void (*close)();
int (*read)();
void (*write)(char);
void (*seed)(long index, int mode);
};
struct FILE* STDIN;
int getchar()
{
return STDIN->read();
}
getchar()只是调用了STDIN所指向的FILE数据结构体中的read函数指针所指向的函数。归根结底,多态是函数指针的一种应用。