【C语言】C语言实现面向对象编程之封装
程序员文章站
2024-01-01 16:09:22
...
文章目录
1.前言
面向对象编程,并不是一种语言或特定的工具,它是一种设计思想,设计方法。
面向对象编程三大特征:封装、继承、多态。
典型的语言:C++,java,都是面向对象编程的代表。
但是并不是只有这些已经公开说明是面向对象的语言才是能实现面向对象的思想。C一样可以,任何一门语言都可以。
2.简单实现封装(C语言)
C语言实现封装,主要是做三件事,提供接口,实现接口,调用接口,C语言基本语法实现。
2.1: test.h
#ifndef _TEST_H_
#define _TEST_h_
#ifdef _cplusplus
//下面的程序按照C标准编译
extern "C"
{
#endif
//万能指针取个别名
typedef void* HPERSON;
//创建对象
HPERSON createPerson(const char *name);
//设置对象
void setPerson(HPERSON person, int age, int id);
//显示对象
void displayPerson(HPERSON person);
//删除对象
void deletePerson(HPERSON person);
#ifdef _cplusplus
}
#endif
2.2: test.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 108
//Person表示HPERSON指向的结构体
typedef struct _Person
{
char name[MAXSIZE];
int age;
int id;
}Person;
//创建对象
HPERSON createPerson(const char *name)
{
Person* p = NULL;
//创建对象
printf("创建对象\n");
if(strlen(name)+1 <= MAXSIZE)
{
p = (Person*)malloc(sizeof(Person));
if(NULL == Person)
{
printf("malloc is failed.....\n");
return NULL;
}
//申请成功,清空内存
memset(p,0,sizeof(Person));
//拷贝值
strcpy(p->name,name);
p->age = 0;
p->id = 0;
}
return p; //返回对象p
}
//设置对象
void setPerson(HPERSON person, int age, int id)
{
Person *p = person;
//类似构造函数
if(p != NULL)
{
p->age = age;
p->id = id;
}
}
//显示对象
void displayPerson(HPERSON person)
{
Person* p = person;
if(p == NULL)
{
printf("displayPerson is failed.....\n");
}
//显示对象中的成员的值
printf("name=%s, age=%d, id=%d \n",p->name,p->age,p->id);
}
//删除对象
void deletePerson(HPERSON person)
{
Person* p = person;
//相当于析构函数
if(NULL != p)
{
free(p);
p = NULL;
}
}
2.3: main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int agec,char* argv[])
{
Person* p = createPerson("Cain");
setPerson(p,23,001);
displayPerson(p);
deletePerson(p);
system("pause");
return 0;
}
2.4: 运行结果
创建对象
name=Cain, age=23, id=001
请按任意键继续…
ps: 加密电脑不能截图,亲测没问题。
2.5: 总结
对象的操作一直使用句柄HPERSON,在调用的过程中,调用者不知道里面的具体实现,也不知道这是指针,更没有必要让调用者知道实现,这就是简单的用C语言实现面向对象编程之封装。
3.优化封装(C语言)
这里对上面的代码进行少量修改,实现优化程序的效果。
3.1: test.h
#ifndef _TEST_H_
#define _TEST_h_
#ifdef _cplusplus
//下面的程序按照C标准编译
extern "C"
{
#endif
//万能指针取个别名
typedef void* HPERSON;
//创建对象
HPERSON createPerson(const char *name);
//设置对象
void setPerson(HPERSON person, int age, int id);
//显示对象
void displayPerson(HPERSON person);
//删除对象
void deletePerson(HPERSON person);
#ifdef _cplusplus
}
#endif
3.2: test.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 108
//Person表示HPERSON指向的结构体
typedef struct _Person
{
char name[MAXSIZE];
int age;
int id;
}Person;
//创建对象
HPERSON createPerson(const char *name)
{
Person* p = NULL;
//创建对象
printf("创建对象\n");
if(strlen(name)+1 <= MAXSIZE)
{
p = (Person*)malloc(sizeof(Person));
if(NULL == Person)
{
printf("malloc is failed.....\n");
return NULL;
}
//申请成功,清空内存
memset(p,0,sizeof(Person));
p->name = (char*)malloc(strlen(name)+1);
if(p->name == NULL)
{
printf("p->name memroy malloc is failed....\n");
}
//拷贝值
strcpy(p->name,name);
p->age = 0;
p->id = 0;
}
return p; //返回对象p
}
//设置对象
void setPerson(HPERSON person, int age, int id)
{
Person *p = person;
//类似构造函数
if(p != NULL)
{
p->age = age;
p->id = id;
}
}
//显示对象
void displayPerson(HPERSON person)
{
Person* p = person;
if(p == NULL)
{
printf("displayPerson is failed.....\n");
}
//显示对象中的成员的值
printf("name=%s, age=%d, id=%d \n",p->name,p->age,p->id);
}
//删除对象
void deletePerson(HPERSON person)
{
Person* p = person;
//相当于析构函数,这里注意释放的顺序,小心内存泄漏
if(NULL != p->name)
{
free(p->name);
p->name = NULL;
}
if(NULL != p)
{
free(p);
p = NULL; //置空
}
}
3.3: main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int agec,char* argv[])
{
Person* p = createPerson("Cain");
setPerson(p,23,001);
displayPerson(p);
deletePerson(p);
system("pause");
return 0;
}
3.4: 运行结果
创建对象
name=Cain, age=23, id=001
请按任意键继续…
4.C语言实现封装总结
基于对象的C语言编程的流程,程序从接口到实现都是使用的纯C实现。下面贴一张嵌入式Linux编程实践图。
上面的内容就是C语言实现封装的实现了。纯C编程,一样可以实现面向对象编程。
借鉴文章:沧海一笑-dj:C语言实现封装
嗯,朋友的blog,写得很好,就借鉴了一篇。