前言浅谈:面向过程的C语言算是比较偏底层的高级语言,而C++、C#、Java、Python等都是面向对象的高级语言,但是C语言却稳坐编程语言排行榜前列,说明C的应用十分广泛和强大,小到输出“HELLO,WOELD!”,点亮单片机的LED等,大到用来进行嵌入式系统开发、编写操作系统和实现其他高级语言。掌握C语言有助于我们学习其他编程语言,甚至可以深入理解如何提高开发的效率。
C++、C#、Java、Python等高级语言创造了多姿多彩、功能强大的软件世界,C语言创造了这些语言!
C语言写一个类,主要注意以下几点:
①类的组成:成员和方法
②类的特性:封装性、继承性、多态性(当然严格来说不能完全实现C++的特性)
③结构体不能定义函数(在C++中的结构体又能定义函数了),可以用函数指针实现方法
④结构体的成员默认public属性
⑤如果要继承,那么两个结构体相同的成员都要定义成一样,新增的成员变量放在后面。定义的顺序很重要,先定义的作为基类。
⑥“类”的构造函数、析构函数不能放在“类”中,只能放在“类”外
进入例子:C实现C++的一个String类
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define C_class typedef struct
C_class string //class string
{
public:
char *str;
void (*show)(string *This);
} string;
C_class substring //class substring 伪继承了string类
{
public:
char *str;
void (*show)(substring *This);
void (*showsubstrlen)(substring *This);
} substring;
//成员函数的实现
void str_show(string *This)
{
printf("%s\n", This->str);
}
void substr_show(substring *This)
{
printf("%s\n", This->str);
}
void showsubstrlen(substring *This)
{
printf("showsubstrlen:%d\n", strlen(This->str));
}
//伪构造函数
string *newstring( char *s)
{
string *newstr = (string*)malloc(sizeof(string));
char *S = (char*)malloc(strlen(s) + 1);
newstr->str = S;
strcpy(S, s);
newstr->show = str_show;
return newstr;
}
substring *newsubstring( char *s)
{
substring *newstr = (substring*)malloc(sizeof(substring));
char *S = (char*)malloc(strlen(s) + 1);
newstr->str = S;
strcpy(S, s);
newstr->show = substr_show;
newstr->showsubstrlen=showsubstrlen;
return newstr;
}
//伪析构函数
void Deletestring(string *obj) // 3 分
{
free(obj->str);
free(obj);
}
void Deletesubstring(substring *obj) // 3 分
{
free(obj->str);
free(obj);
}
int main()
{
string *sp=newstring("I am string!"); //实例化对象
substring *ssp=newsubstring("I am substring!");
//类指针间接调用成员
sp->show(sp);
ssp->show(ssp);
ssp->showsubstrlen(ssp);
//伪多态
string *a; //引入多态指针
a=sp;
a->show(a);
a=(string *)ssp;
a->show(a);
//伪析构函数释放对象内存
Deletestring(sp);
Deletesubstring(ssp);
return 0;
}
结果:
当然,还有许多方法可以实现C模拟类,这里的实现形式也存在一些不足之处,希望大家共勉!在C语言模拟面向对象虽然没有实用意义,但是最重要的是提高自己的能力、丰富自己的编程思想啦!