C语言面向对象编程

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函数指针所指向的函数。归根结底,多态是函数指针的一种应用。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值