范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

C语言对象编程第一弹封装与抽象

  前言
  上次整理了一篇关于面向对象的笔记:什么是面向对象?简单地分享了面向对象的一些基础知识。C语言虽不是面向对象的语言,但也可以使用面向对象的思想来设计我们的程序,C语言 + 面向对象的思想在我们嵌入式中使用得很广泛,主要优点就是能使我们的软件拓展性更好、更易读、更容易维护等。
  因为这一块知识也比较重要,属于通用知识,所以打算分享几篇笔记与大家一起学习一下。当然,C语言并不是面向对象的语言,要想完全实现与C++一样的一些面向对象的特性会比较难。所以我们分享的内容也面向基础、实用的为主。
  本篇笔记分享的是:封装与抽象。封装与抽象
  封装性是面向对象编程的三大特性(封装性、继承性、多态性)之一,但也是最重要的特性。封装+抽象相结合就可以对外提供一个低耦合的模块。
  数据封装是一种把数据和操作数据的函数捆绑在一起的机制,数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制。
  在C语言中,数据封装可以从结构体入手,结构体里可以放数据成员和操作数据的函数指针成员。当然,结构体里也可以只包含着要操作的数据。
  下面以一个简单的实例作为演示。
  设计一个软件模块,模块中要操作的对象是长方形,需要对外提供的接口有:1、创建长方形对象;
  2、设置长、宽;
  3、获取长方形面积;
  4、打印长方形的信息(长、宽、高);
  5、删除长方形对象。
  下面我们来一起完成这个demo代码。首先,我们思考一下,我们的接口命名大概是怎样的?其实这是有规律可循的,我们看RT-Thread的面向对象接口是怎么设计的:
  我们也模仿这样子的命名形式来给我们这个demo的几个接口命名:1、rect_create 2、rect_set 3、rect_getArea 4、rect_display 5、rect_delete
  我们建立一个rect.h的头文件,在这里声明我们对外提供的几个接口。这时候我们头文件可以设计为:
  这样做是没有什么问题的。可是数据隐藏得不够好,我们提供给外部用的东西要尽量简单。我们可以思考一下,对于C语言的文件操作,C语言库给我们提供怎么样的文件操作接口?如:FILE *fopen(const char *pathname, const char *mode); size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
  我们会创建一个文件句柄(描述符),然后之后只要操作这个文件句柄就可以,我们不用关心FILE具体是怎么实现的。
  什么是句柄?看一下百度百科的解释:
  我们也可以创建我们的对象句柄,对外提供的头文件中只需暴露我们的对象句柄,不用暴露具体的实现。以上头文件rect.h代码可以修改为:
  这里用到了void*,其为无类型指针,void *可以指向任何类型的数据。然后具体要操作怎么样的结构体可以在.c中实现:
  下面我们依次实现上述五个函数:1、rect_create函数/* 创建长方形对象 */ HandleRect rect_create(const char *object_name) {     printf(">>>>>>>>>> %s: %s (line: %d) <<<<<<<<<< ", __FILE__, __FUNCTION__, __LINE__);      /* 给rect结构体变量分配内存 */     pRect rect = (pRect)malloc(sizeof(Rect));     if (NULL == rect)     {         printf("rect memory malloc failed! ");         abort();     }     /* 给rect->object_name字符串申请内存 */     rect->object_name = (char*)malloc(strlen(object_name) + 1);     if (NULL == rect->object_name)     {         printf("rect->object_name memory malloc failed! ");         abort();     } ​     /* 给结构体各成员进行初始化 */     strncpy(rect->object_name, object_name, strlen(object_name) + 1);     rect->length = 0;     rect->width = 0;          return ((HandleRect)rect); }
  rect对象创建函数:首先分配内存,然后对rect结构体各个成员进行赋值操作,最后返回的是rect对象句柄。rect的object_name成员是个字符串,因此要单独分配内存。2、rect_set函数/* 设置长方形对象长、宽 */ void rect_set(HandleRect rect, int length, int width) {     printf(">>>>>>>>>> %s: %s (line: %d) <<<<<<<<<< ", __FILE__, __FUNCTION__, __LINE__);     if (rect)     {         ((pRect)rect)->length = length;         ((pRect)rect)->width = width;     } }3、rect_getArea函数/* 获取长方形对象面积 */ int rect_getArea(HandleRect rect) {     return ( ((pRect)rect)->length * ((pRect)rect)->width ); }4、rect_display函数/* 打印显示长方形对象信息 */ void rect_display(HandleRect rect) {     printf(">>>>>>>>>> %s: %s (line: %d) <<<<<<<<<< ", __FILE__, __FUNCTION__, __LINE__);     if (rect)     {         printf("object_name = %s ", ((pRect)rect)->object_name);         printf("length = %d ", ((pRect)rect)->length);         printf("width = %d ", ((pRect)rect)->width);         printf("area = %d ", rect_getArea(rect));     } }5、rect_delete函数void rect_delete(HandleRect rect) {     printf(">>>>>>>>>> %s: %s (line: %d) <<<<<<<<<< ", __FILE__, __FUNCTION__, __LINE__);     if (rect)     {         free(((pRect)rect)->object_name);         free(rect);         ((pRect)rect)->object_name = NULL;         rect = NULL;     } }
  rect对象删除函数:主要是对创建函数中的malloc申请的内存做释放操作。
  可以看到这五个对象接口主要包含三类:创建对象函数、操作函数、删除对象函数。这里的操作函数就是rect_set函数、rect_getArea函数与rect_display函数,当然还可以有其它更多的操作函数。操作函数的特点是至少需要传入一个表示对象的句柄,在函数的内部再做实际数据结构的转换,然后再进行相应的操作。6、测试程序:#include  #include  #include "rect.h" ​ int main(void) {     HandleRect rect = rect_create("rect_obj");  // 创建Rect对象句柄     rect_set(rect, 20, 5);                      // 设置          rect_display(rect);                         // 打印显示      rect_delete(rect);                          // 删除Rect对象句柄           return 0; }运行结果:
  在基于对象的编程中,封装性是最基础也最重要的内容。其对象主要包含两方面内容:属性与方法。在基于C语言的对象编程中,可以使用句柄来表示对象,即句柄指向的数据结构的成员代表对象的属性,实际操作句柄的函数则表示对象的方法。
  以上就是本次的分享,如有错误,欢迎指出!谢谢

鹏博士智慧云事业部与阿里云达成数据库全面合作近年来,企业面临着复杂多变的内外部发展环境,数据作为企业的核心资产,如何最大化价值,数据库建设成为重要一环。伴随着中国企业上云步伐的加快,云数据库服务异军突起,成为行业趋势。在全面北京电信通企业宽带可视化服务平台,品质安全无忧沃信通系列产品为鹏博士与北京联通联合推出品牌,电信通作为该品牌北京地区的唯一经销商,依托于鹏博士强大的运维支撑团队为用户提供一级云运营商品质的互联网接入产品。为什么选择电信通企业宽鹏博士崔航让客户更专注于自己的业务云计算市场发展进入快车道,成为企业数字化转型的关键要素,这其中需要强大的网络能力支撑。云网协同的重要性逐渐凸显,这蕴含着巨大的行业价值,也要求相关企业紧密合作。在鹏博士总裁崔航看来连锁企业怎么依靠云连锁服务走向巅峰?众所周知,连锁企业经营成功的要诀在于连锁复制扩张,而复制的前提是标准化,复制的最佳结果也是标准化,企业没有标准化,何来连锁复制。那企业的标准化是什么?以提高经济效益为目的,制定的各亏损2。2亿翻身的鸿星尔克,背后的真相究竟是什么?自从河南遭受暴雨侵袭,各地都纷纷对河南伸出了援手。不少明星和公司纷纷捐款,献出了自己的一份力量。其中,鸿星尔克捐款5000万后爆红网络成了舆论焦点,频频登上微博热搜,一夜之间成了国怎样打造面向未来的企业云办公?现如今,企业数字化转型的浪潮席卷各个行业,科技赋能对引领数字时代起到至关重要的作用,对企业而言,是机遇更是挑战。在网络安全协作绿色高效等领域不断创新,融合高新智能硬件设施软件应用服鹏博士与汽配旺旺的上云故事疫情刚爆发的时候,所有汽配城都是不开门的,但生意还在继续。这个时候,传统的系统都在汽配城里,就无法开张。但如果使用的是云端SaaS系统,即便汽配城不开门,店家商品管理和服务也是在线企业专线宽带和家庭宽带有什么不同?宽带主要分为专线(企业宽带)和家庭宽带两种,是运营商根据客户做的区分,并根据两者的需求点实施了不同的服务和政策,因此专线和家庭宽带在价格和速度上是有区别的。企业专线宽带是运营商为集白露逢单,地上不干论天气对农业的重要性蒹葭苍苍,白露为霜。今日17点52分46秒,白露至。此时,夏季的闷热基本结束,逐渐转向秋季的凉爽,进入一年中最舒适的时节。白露之际,农业生产进入繁忙的秋收。既要做好秋季作物的管理,小米有品硬核测评罗永浩的网易严选人体工学椅,为啥不建议买最近换了办公室,新的办公椅坐着贼难受,不少同事纷纷讨论买一把人体工学椅回来。首先敲定的就是罗永浩在网易严选多功能人体工学椅,有罗永浩坐镇,再加上便宜(仅999),这把椅子很快就火便气候临界点到来,墨迹天气的新基建角色凸显气象是盐2021年,人类对这句话体会的尤为深刻,因为气候突变的常态化,迫使人们将查阅天气预报变成日常习惯。德国的洪灾,美国的暴风,希腊的烈火,巴西的冰雪,还有中国华北地区延续到10
选Python,还是选Golang?开发者们吵起来了在本文中,我们探讨了Python和Go这两种世界上最流行的编程语言的差异相似之处和用例。从对两者的快速比较开始,然后看看它们在可读性速度易学性等方面如何叠加。Python和Go不同全球6大视频AI技术开放平台,都有一个共同点计算机视觉AI系统是人工智能和机器学习的一个子集。该领域专注于使用摄像机数据和算法来理解数字图像视频和其他视觉输入。它具有广泛的应用,从人脸面部识别密码保护(银行)到工厂生产线的缺Java和Python,哪个更适合开发AI人工智能?当今的机器世界需要能够改变我们生活工作和娱乐方式的技术。考虑到智能系统和具有行为算法智能搜索和能够自行学习的智能系统的需求,约翰麦卡锡将人工智能引入了我们的世界,并被亲切地称为人工人工智能岗位薪资飙升,如何转型成为AI开发工程师?人工智能或机器学习是一种新兴的技术趋势,这已不是什么秘密。根据Gartner报告,到2022年,人工智能将创造250万个工作岗位,取代它将消除的180万个工作岗位。就业增长已经席卷联瑞电子八口防雷POE网卡满足室外应用场景POE供电由于施工布线简单成本低廉及部署灵活等特点,被很多网络摄像机厂家官方应用。但由于很多系统集成商及工程上对POE技术不是很了解,在使用过程中会出现一些问题,尤其是室外应用的场促进智能机器人发展上海浙江江苏主要措施(一)上海2018第20届中国国际工业博览会发布长三角智能制造协同创新发展倡议。倡议提出了,共建长三角智能制造协同发展联盟共促长三角地区智能制造标准一体化发展共建长三角地区智能制造乐享智能生活,赋能智能产品,鸿蒙智联全场景统筹一体化日常生活中,我们不难感受到科技发展和数字化的到来,不断更新换代的智能产品涌入我们的生活之中。从居家到出行,它们几乎无处不在。而随着我国在5GAIIoT技术的逐渐成熟化,中国消费者能5G典型应用场景与全产业链厂商分析一5G典型应用场景5G,即第五代移动通信技术,包含7个关键指标用户体验速率连接数密度端到端延时移动性流量密度用户峰值速率能源效率。从用户体验上主要数值指标1000x的容量提升100年关朋友开口借钱?看看这位江南富商如何体面地拒绝末代皇帝每逢年关,大家难免就会遇见这个问题有朋友开口借钱。借给别人钱就像地球运动,借钱是自转,还钱就是公转了,地球自转一圈就是一天,公转一圈那就是一年了。如今的社会,欠钱的是大爷,借钱的是不能挖掘的秦陵地宫,秦陵博物馆与大话西游2联袂共探秘近期三星堆遗址考古新发现六个祭祀坑,出土了黄金面具青铜尊玉璧象牙等重要文物,甚至是丝绸,再次惊动天下。古蜀先民的生活点滴,在时光的变幻之中,青铜大立人像黄金权杖青铜神树青铜纵目面具行走在南浔古镇的女孩又纯又欲的新综艺,如诗如画,如痴如醉我水晶晶的家乡,这里有水晶晶的水,水晶晶的少女,水晶晶的小镇,水晶晶的倒影。映出了这个水晶晶的世界!这是呵,这里是我水晶晶的家乡!江南古镇,小桥流水岁月静好,如婉约的江南女子。南浔