【C语言】C实现C++类(以String类为例)

    前言浅谈:面向过程的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语言模拟面向对象虽然没有实用意义,但是最重要的是提高自己的能力、丰富自己的编程思想啦!

猜你喜欢

转载自blog.csdn.net/yechongbinbin/article/details/114242891