【C语言】C语言实现面向对象编程之封装
00. 目录
文章目录
- 00. 目录
- 01. 前言
- 02. 简单程序示例
- 03. 程序示例优化
- 04. 总结
- 05. 参考
01. 前言
面向对象编程(OOP)并不是一种特定的语言或者工具,它只是一种设计方法、设计思想。它表现出来的三个最基本的特性就是封装、继承与多态。很多面向对象的编程语言已经包含这三个特性了,例如 Smalltalk、C++、Java。但是你也可以用几乎所有的编程语言来实现面向对象编程,例如 ANSI-C。要记住,面向对象是一种思想,一种方法,不要太拘泥于编程语言。
C语言不是面向对象的语言,因此使用C语言完全实现面向对象的编程是不可能。但是使用C语言可以很容易实现基于对象的编程,并且基本实现对象的封装性,部分实现对象的继承。
02. 简单程序示例
C语言实现对象封装的小程序,包含三部分:接口,调用和实现,均使用C语言的基本语法实现。
头文件test.h声明如下
#ifndef __TEST_H__
#define __TEST_H__#ifdef __cplusplus
//表示是C语言的头文件
extern "C"
{#endiftypedef 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#endif /*__TEST_H__*/
test.c文件如下
#define _CRT_SECURE_NO_WARNINGS
#include "test.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define NAMEMAX 32//Person表示HPERSON句柄指向的结构体
typedef struct _Person {char name[NAMEMAX];int age;int id;
}Person;//创建对象
HPERSON createPerson(const char * name)
{Person *p = NULL;printf("创建对象\n");if (strlen(name) + 1 <= NAMEMAX){p = malloc(sizeof(Person));if (NULL == p){printf("分配内存失败\n");return NULL;}memset(p, 0, sizeof(Person));strcpy(p->name, name);p->age = 0;p->id = 0;}return p;
}//设置对象
void setPerson(HPERSON person, int age, int id)
{Person *p = person;if (NULL != p){p->age = age;p->id = id;}
}//显示对象
void displayPerson(HPERSON person)
{Person *p = person;if (NULL == p){printf("displayPerson 参数非法\n");return;}printf("Name: %s age: %d id:%d\n", p->name, p->age, p->id);
}//删除对象
void deletePerson(HPERSON person)
{free(person);
}
main.c实现如下
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include "test.h"int main()
{HPERSON p = createPerson("LiMing");setPerson(p, 18, 1);displayPerson(p);deletePerson(p);system("pause");return 0;
}
测试结果
创建对象
Name: LiMing age: 18 id:1
请按任意键继续. . .
总结
对象的操作一直使用句柄HPERSON,在调用的过程中看不到程序处理的细节,比如对象的建立和释放。接口掩盖了实现的很多细节,在接口中看不到指针的使用,并且不能够也没有必要访问数据结构。
03. 程序示例优化
头文件test.h声明如下
#ifndef __TEST_H__
#define __TEST_H__#ifdef __cplusplus
//表示是C语言的头文件
extern "C"
{#endiftypedef 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#endif /*__TEST_H__*/
test.c文件实现如下
#define _CRT_SECURE_NO_WARNINGS
#include "test.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>//Person表示HPERSON句柄指向的结构体
typedef struct _Person
{//使用指针char *name;int age;int id;
}Person;//创建对象
HPERSON createPerson(const char * name)
{Person *p = NULL;printf("创建对象\n");p = malloc(sizeof(Person));if (NULL == p){printf("分配内存失败\n");return NULL;}memset(p, 0, sizeof(Person));p->name = malloc(strlen(name) + 1);if (NULL == p->name){printf("分配内存失败\n");return NULL;}strcpy(p->name, name);p->age = 0;p->id = 0;return p;
}//设置对象
void setPerson(HPERSON person, int age, int id)
{Person *p = person;if (NULL != p){p->age = age;p->id = id;}
}//显示对象
void displayPerson(HPERSON person)
{Person *p = person;if (NULL == p){printf("displayPerson 参数非法\n");return;}printf("Name: %s age: %d id:%d\n", p->name, p->age, p->id);
}//删除对象
void deletePerson(HPERSON person)
{Person *p = person;if (NULL == person){return;}if (NULL != p->name){free(p->name);}free(person);
}
main.c测试代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include "test.h"int main()
{HPERSON p = createPerson("LiMing");setPerson(p, 18, 1);displayPerson(p);deletePerson(p);system("pause");return 0;
}
测试结果
创建对象
Name: LiMing age: 18 id:1
请按任意键继续. . .
04. 总结
基于对象的C语言编程的流程,程序从接口到实现都是使用C语言实现的。
注:图片来源于嵌入式Linux上的C语言编程实践
05. 参考
代码:【C语言】C语言实现面向对象编程之封装代码.rar
【C语言】C语言实现面向对象编程之封装相关推荐
- c++ class struct同名_C/C++面向对象编程之封装
点击"蓝字"关注我们吧前言: 何为面向过程: 面向过程,本质是"顺序,循环,分支" 面向过程开发,就像是总有人问你要后续的计划一样,下一步做什么,再下一步做什么 ...
- JS面向对象编程之封装
我们所熟知的面向对象语言如 C++.Java 都有类的的概念,类是实例的类型模板,比如Student表示学生这种类型,而不表示任何具体的某个学生,而实例就是根据这个类型创建的一个具体的对象,比如zha ...
- C语言--面向对象编程之多态
系列文章目录 C语言–面向对象编程之封装 C语言–面向对象编程之继承 文章目录 系列文章目录 前言 一.多态是什么? 二.C语言实现多态 1.多态基本实现原理 2.一个简单的demo 3.简要分析 三 ...
- C/C++面向对象编程之多态
C/C++面向对象编程 目录: 1.类型转换 2.为什么引入多态和虚函数 3.编译器如何实现多态和虚函数 4.多态的思想 5.C语言用实现多态的思想 目录: C/C++面向对象编程之封装 C/C++面 ...
- C语言--面向对象编程之继承
系列文章目录 C语言实现面向对象编程的第二篇,在第一篇里面我们已经了解到了何为面向对象以及实现面向对象的第一大特性–封装,对于C来说,实现继承和多态要稍微麻烦一些. C语言实现面向对象- - 封装 C ...
- Python语言学习:python编程之pip命令集合、python调式、头部代码、代码运行等常见概念详细攻略(解决问题为导向)
Python语言学习:python编程之pip命令集合.python调式.头部代码.代码运行等常见概念详细攻略(解决问题为导向) 目录 一.pip命令集合 1.pip常规命令 1.1 pip下载se ...
- 面向对象编程之继承、多态、封装、抽象类、接口、包-上
面向对象编程之继承.多态.封装.抽象类.接口.包-上 继承 类的继承格式 为什么要继承 继承的特点 继承的种类及关键字 访问权限 多态 向上转型 动态绑定 方法重写 重写和重载的区别比较 多态的优点 ...
- 【客服系统】在线客服系统源码外贸聊天通讯带翻译多语言支持网页安卓苹果打包封装APP
随着全球化的加速推进,外贸行业对于在线客服系统的需求日益增长.一款功能强大.支持多语言交流.适用于网页和移动端的在线客服系统源码成为了众多企业的首选.本文将介绍一款名为"外贸聊天通讯带翻译多 ...
- python面向对象编程指南 脚本之家_Python面向对象编程之继承与多态详解
本文实例讲述了Python面向对象编程之继承与多态.分享给大家供大家参考,具体如下: Python 类的继承 在OOP(Object Oriented Programming)程序设计中,当我们定义一 ...
最新文章
- 强制类型转换(Java)
- 【Scratch】青少年蓝桥杯_每日一题_8.17_报数
- 设计模式:组合模式(Composite)
- linux应用程序之----文件操作
- 《C++ Primer 第五版》(第6.1~6.3节) 函数形参和实参传递,可变参数列表和函数返回值
- leetcode 1074. 元素和为目标值的子矩阵数量(map+前缀和)
- 在PropertyGrid中使用密码显示
- win10+Idea遇到一个bug的解决办法
- C++socket编程(一):绪论
- 征信报告上那些你不知道的事
- oracle子接点与父节点上下级关系数据库查询语句,及联查询,
- weblogic系列漏洞整理 -- 1. weblogic安装
- Html5+Css3小试牛刀
- IDL——数据的输入、输出与读写
- UA OPTI570 量子力学 角动量 公式与结论总结
- 基于树莓派SHT20温湿度采样
- 分析即服务(AaaS)到底是什么?终于有人讲明白了
- 电脑N卡跟A卡是什么,有区别么?
- 树形结构的处理——组合模式(一)
- Skype for Business 中的键盘快捷方式
热门文章
- xmanager 使用
- NDK(三方库引入、Mk文件)
- hdu 1874 畅通工程续(模板题 spfa floyd)
- 二值图像连通 C语言,二值图像统计连通区域C语言版
- 用到f6的快捷键_RHINO快捷键这么多,GH电池组又太复杂怎么办?
- 实验7.3 字符串 7-8 删除重复字符
- 算法设计棋盘覆盖问题c语言,棋盘覆盖问题(用分治法求解)
- python建立虚拟环境不成功_virtualenv 创建虚拟环境不成功
- 列表数据提交_Mybatis-实现数据的增删改查
- 十六、python沉淀之路--迭代器