很多学C的人相信都有一个疑惑C语言是面向过程编程的,怎么可以做面向对象?
但是C语言也是最底层的语言所以也可以通过一些结构体与指针来完成面向对象的开发,其实,面向对象是一种编程的思想,与你使用的语言没有太大的关系,其实,大部分的编程语言都可以实现面向对象编程。但是面向对象的语言中实现封装等操作被封装在语言中,这使得面向对象开发变得更加方便。
面向对象编程(oop)最基本的三个特点就是:封装、继承、多态。
封装:将字段制作为私有化,对外暴露便捷的公共方法供外界访问类中的成员。
继承:提升代码重复使用,降低代码重复率,表现出一种层次关系(体系)
多态:把子类对象赋值给父类类型变量,编译时以父类类型的标准编译,编译时可以屏蔽子类之间的实现差异,从而做到通用编程,代码复用功能。
#include "stdio.h"
typedef struct
{
int x;
int y;
}var1;
void num_init(var1 *const var,int init_num)
{
var->x = init_num;
var->y = init_num;
}
void num_add(var1 *const var,int a)
{
var->x = var->x + a;
}
void num_sub(var1 *const var,int b)
{
var->y = var->y - b;
}
int get_x(var1 *const var)
{
return var->x;
}
int get_y(var1 *const var)
{
return var->y;
}
//主函数在另一个.c文件中
void main()
{
var1 var2,var3;
num_init(&var2,15);
num_init(&var3,20);
printf("var2\tx = %d\ty = %d\n",get_x(&var2),get_y(&var2));
printf("var3\tx = %d\ty = %d\n\n",get_x(&var3),get_y(&var3));
num_add(&var2,5);
printf("var2\tx = %d\ty = %d\n",get_x(&var2),get_y(&var2));
printf("var3\tx = %d\ty = %d\n\n",get_x(&var3),get_y(&var3));
num_sub(&var3,5);
printf("var2\tx = %d\ty = %d\n",get_x(&var2),get_y(&var2));
printf("var3\tx = %d\ty = %d\n\n",get_x(&var3),get_y(&var3));
}
/*****************************************************************
* 运行结果:
* var2 x = 15 y = 15
* var3 x = 20 y = 20
*
* var2 x = 20 y = 15
* var3 x = 20 y = 20
*
* var2 x = 20 y = 15
* var3 x = 20 y = 15
******************************************************************/
运行结果
/******************第二个类**********************/
typedef struct
{
var1 var;
int row;
int line;
}calc;
//构造函数
void structure_function(calc * const myclac,int x,int y,int row,int line)
{
num_init(&myclac->var,x);
myclac->line = line;
myclac->row = row;
}
//假如主函数在另一个.c文件中
void main()
{
calc c1,c2;
//实例化对象
structure_function(&c1,1,2,3,4);
structure_function(&c2,5,6,7,8);
printf("c1\tx = %d\ty = %d\n",get_x(&c1.var),get_y(&c1.var));
printf("c2\tx = %d\ty = %d\n\n",get_x(&c2.var),get_y(&c2.var));
}
运行结果
主函数(使用部分)
#include "include.h"
int main()
{
dev.init(2);
dev.ins(50);
dev.print();
printf("%d", dev.a);
return 0;
}
头文件及其相应源文件内容
#ifndef __INCLUDE_H_
#define __INCLUDE_H_
#include <stdio.h>
struct _m_usmart_dev
{
int a;
void (*init)(int); //初始化
int (*ins)(int); //识别函数名及参数
void (*print)();
};
void init(int sum);
int insert(int num);
void print();
extern struct _m_usmart_dev dev;
#endif // !__INCLUDE_H_
#include "include.h"
void init(int sum)
{
dev.a = sum;
}
int insert(int num)
{
dev.a = num;
return 1;
}
void print()
{
printf("%d\n", dev.a);
}
struct _m_usmart_dev dev =
{
0,
init,
insert,
print,
};