C语言:春节回家过年,我发现只有我没有对象!

栏目: C · 发布时间: 6年前

内容简介:C语言春节回家过年,遇到了不少小伙伴:Java , Python, JavaScript,Ruby......大家在大城市发展得都不错,回到老家,聚到一起吃饭, 谈天说地,都是喜气洋洋。尤其是Python和JavaScript,更是成了明星,一个吹嘘说自己是人工智能的必备,另外一个炫耀说自己是世界上最流行的语言,不信有某某语言流行度排行榜为证, 还有GitHub上的众多项目云云。

聚会

C语言春节回家过年,遇到了不少小伙伴:Java , Python, JavaScript,Ruby......

大家在大城市发展得都不错,回到老家,聚到一起吃饭, 谈天说地,都是喜气洋洋。

尤其是 Python 和JavaScript,更是成了明星,一个吹嘘说自己是人工智能的必备,另外一个炫耀说自己是世界上最流行的语言,不信有某某语言流行度排行榜为证, 还有GitHub上的众多项目云云。

老练的 Java 则是一直拿TIOBE排行榜说事儿:“我已经连续10多年排行第一了,高处不胜寒啊!”

提到TIOBE,Python更是得意:“我今年还被选为TIOBE的年度编程语言呢!”

虽然常年排名TIOBE第二,C语言有点黯然神伤,人类用自己写的程序可真不少,可都是处于底层,在系统级编程,什么操作系统,数据库,编译器...... 与应用层比起来,没那么光鲜亮丽。

现在很多人培训了Python, Java 就说自己会编程了, 不懂指针,不懂内存,不懂底层的基本原理, 那能算会编程吗?

C语言开始愤愤不平,闷头吃菜,似乎要把这股郁闷之气发泄到美味佳肴上去。

觥筹交错之间,Java 搂住C的肩膀,亲切地说:“兄弟,你有对象了吗?”

这下可捅了马蜂窝,大家的眼光齐刷刷地聚集到 C语言 的身上。

C嚅嗫了半天:“没...... 没有。”

“哈哈哈...... 我们都有对象,你这么大了还没对象?!” Python笑道。

“是啊,一个没有对象的编程语言还有什么前途?”JavaScript补刀,他原来没有class的概念,是通过“原型”实现的OOP,最近几年才在语法层面引入class关键字。

“我虽然没有对象,但是有指针啊,功能非常强大。”

“指针?你说的是那容易出错的指针吗? 现在有谁用指针啊?” JavaScript说道。

“不会用指针,就不是真正的程序员!” C语言涨红了脸。

餐桌的气氛变得有些尴尬,捅了篓子的Java招呼着说:“来来来,继续喝酒。”

好不容易熬到聚餐结束,C语言回到了自己的家,家里冷冷清清,自己的“亲爹”丹尼斯·里奇(Dennis Ritchie),有史以来最伟大的 程序员 之一, 已经于2011年10月不幸去世。

桌子上摆着的一本《C程序设计语言》,那是丹尼斯·里奇唯一的遗著, 拿起这本书,C不由悲从心来。

C语言:春节回家过年,我发现只有我没有对象!

串门

C语言突然想起来对门的 Ken Thompson,那是Dennis Ritchie的“好基友”,他们俩一起创造了伟大的Unix操作系统,获得了计算机界的最高奖:图灵奖。

要不问问Ken? 为什么不让我有对象?不让我面向对象编程!

C来到Ken Thompson的门口,按了门铃,门开了,C语言一眼就看到Ken Thompson正在和 Go 玩得不亦乐乎,心中更是凄苦,Go才是人家的亲儿子,我算老几, 转身便要离去。

Ken 却从后面叫住了他:“小C啊,快进来,和你的兄弟Go玩一会儿。”

看到C满脸沮丧,Ken也大为吃惊:“大过年的,怎么回事?”

C不满地说:“当年你们为什么不让我有对象?”

“对象,什么对象? 奥,你是说面向对象编程吧!其实吧你亲爹把你设计出来,主要是做系统级编程的,要的是贴近硬件,要的是效率,要那复杂玩意儿干啥?中看不中用,再说了,你和Go一样,不是有struct吗? ” Ken 转向Go,挤了挤眼睛。

“是啊是啊,struct很好用的!” Go马上附和。

“但是struct也实现不了OOP啊, Python,JavaScript他们都嘲笑我! ”

“那你说说,什么是OOP?”Ken问道。

“嗯,就是封装、继承、多态吧? ” C回答到。

“好,我来给你掰扯掰扯,用C语言怎么实现封装、继承还有多态!”

封装

Ken Thompson 真不愧是老司机,唰唰唰迅速就写成了一段代码。

他说道:“我们先来说说封装,这封装就是把信息给隐藏起来,你先看看这段代码。”

shape.h

C语言:春节回家过年,我发现只有我没有对象!

shape.c

C语言:春节回家过年,我发现只有我没有对象!

main.c

C语言:春节回家过年,我发现只有我没有对象!

这里定义了一个叫做Shape的结构体,外界只能通过相关的函数来对这个Shape进行操作,例如创建(Shape_create), 移动(Shape_move), 还有获取位置(Shape_getX)等,不能直接访问Shape的内部数据结构。

虽然这里没有class这样的关键字,数据结构和相关操作是分开写的,看起来不太完美, 但确实是实现了封装。

C语言:春节回家过年,我发现只有我没有对象!

C 看到Ken Thompson居然把那个指针的名称叫做self, 和Python的相同,不由得笑了起来:“我明白了,那继承该怎么做呢?”

继承

Ken Thompson不吭声,继续写代码。

大牛的风格看来都是类似的: 别瞎BB,给我上代码。

C语言:春节回家过年,我发现只有我没有对象!

这次定义了一个矩形(Rectangle)的结构体,其中嵌套了Shape,难道这就实现了继承? C有点疑惑。

Go小子在旁边叫了起来:“我明白了,在内存中,他们是这样的。”

C语言:春节回家过年,我发现只有我没有对象!

通过这种组合的方式,也算是实现了继承吧。

C语言:春节回家过年,我发现只有我没有对象!

多态

这么轻松就实现了封装和继承,C语言感到很兴奋, 但是多态怎么实现呢?

这时候又传来了门铃声,Linus大神拎着一瓶酒进来,要找C小伙儿喝酒,看到这桌子上的代码,立刻就明白了怎么回事。

他说道:“别整那么多花里胡哨的东西,还多态,不就是函数指针嘛! 我给你举个例子。”

C语言:春节回家过年,我发现只有我没有对象!

“这个结构体包含了两个函数指针,一个用来计算图形的面积,另外一个把这个图形画出来。我们把这个结构体叫做虚函数表。”

“这有什么用啊?”

“在你的Shape中,添加一个指向该函数表的指针就行了。” Linus回答。

C语言:春节回家过年,我发现只有我没有对象!

C和Go都是一脸茫然。

“蠢材, 你们想想啊,当你创建一个子类对象的时候,比如Rectangle, 把那个虚函数指针vptr指向另外一组函数,会怎么样?”

两人还是不懂,Linus只好继续画图:

C语言:春节回家过年,我发现只有我没有对象!

现在C有点明白了, 无论是Rectangle对象,还是Square对象,在调用Shape_area方法的时候, 都需要通过vptr这个指针找到虚函数表中的area方法,对于Rectangle,找到的是Rectangel_area方法,对于Square,找到的是Square_area方法。

struct Rectangle *r = Rectangle_create(5,5,10,10);

Shape_area((struct Shape *) r);

“其实吧,你的兄弟C++的多态实现原理也是类似的!在运行时查找真正的函数去执行。” Ken 总结到。

“对,这种函数指针的使用方法太常见了,在我的 Linux 操作系统中也会定义类似的东西” Linus接口道,

C语言:春节回家过年,我发现只有我没有对象!

“只要IO设备提供这几个函数的实际定义,就可以将File结构体的函数指针指向对应的实现,那就实现了用同一套接口操作不同的IO设备。”

C语言高兴起来:“哈哈,我就说我的指针很厉害吧,这些全是通过指针来实现的。”

“是啊,别听Java, Python, JavaScript他们瞎BB,你也有对象,也能进行面向对象的编程!”

C语言说道:“走,喝酒去!”

注: 本文的例子主要来源于https://www.state-machine.com/doc/AN_OOP_in_C.pdf 我做了修改。

C语言:春节回家过年,我发现只有我没有对象!

【本文为51CTO专栏作者“刘欣”的原创稿件,转载请通过作者微信公众号coderising获取授权】

戳这里,看该作者更多好文


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Understanding Machine Learning

Understanding Machine Learning

Shai Shalev-Shwartz、Shai Ben-David / Cambridge University Press / 2014 / USD 48.51

Machine learning is one of the fastest growing areas of computer science, with far-reaching applications. The aim of this textbook is to introduce machine learning, and the algorithmic paradigms it of......一起来看看 《Understanding Machine Learning》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

SHA 加密
SHA 加密

SHA 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具