成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C語言:春節(jié)回家過年,我發(fā)現(xiàn)只有我沒有對象!

開發(fā) 開發(fā)工具
C語言春節(jié)回家過年,遇到了不少小伙伴:Java , Python, JavaScript,Ruby......

 聚會

C語言春節(jié)回家過年,遇到了不少小伙伴:Java , Python, JavaScript,Ruby......

大家在大城市發(fā)展得都不錯,回到老家,聚到一起吃飯, 談天說地,都是喜氣洋洋。

尤其是Python和JavaScript,更是成了明星,一個吹噓說自己是人工智能的必備,另外一個炫耀說自己是世界上最流行的語言,不信有某某語言流行度排行榜為證, 還有GitHub上的眾多項目云云。

老練的Java則是一直拿TIOBE排行榜說事兒:“我已經(jīng)連續(xù)10多年排行第一了,高處不勝寒啊!”

提到TIOBE,Python更是得意:“我今年還被選為TIOBE的年度編程語言呢!”

雖然常年排名TIOBE第二,C語言有點黯然神傷,人類用自己寫的程序可真不少,可都是處于底層,在系統(tǒng)級編程,什么操作系統(tǒng),數(shù)據(jù)庫,編譯器...... 與應(yīng)用層比起來,沒那么光鮮亮麗。

現(xiàn)在很多人培訓(xùn)了Python, Java 就說自己會編程了, 不懂指針,不懂內(nèi)存,不懂底層的基本原理, 那能算會編程嗎?

C語言開始憤憤不平,悶頭吃菜,似乎要把這股郁悶之氣發(fā)泄到美味佳肴上去。

觥籌交錯之間,Java 摟住C的肩膀,親切地說:“兄弟,你有對象了嗎?”

這下可捅了馬蜂窩,大家的眼光齊刷刷地聚集到C語言的身上。

C嚅囁了半天:“沒...... 沒有。”

“哈哈哈...... 我們都有對象,你這么大了還沒對象?!” Python笑道。

“是啊,一個沒有對象的編程語言還有什么前途?”JavaScript補刀,他原來沒有class的概念,是通過“原型”實現(xiàn)的OOP,最近幾年才在語法層面引入class關(guān)鍵字。

“我雖然沒有對象,但是有指針啊,功能非常強大。”

“指針?你說的是那容易出錯的指針嗎? 現(xiàn)在有誰用指針啊?” JavaScript說道。

“不會用指針,就不是真正的程序員!” C語言漲紅了臉。

餐桌的氣氛變得有些尷尬,捅了簍子的Java招呼著說:“來來來,繼續(xù)喝酒。”

好不容易熬到聚餐結(jié)束,C語言回到了自己的家,家里冷冷清清,自己的“親爹”丹尼斯·里奇(Dennis Ritchie),有史以來最偉大的程序員之一, 已經(jīng)于2011年10月不幸去世。

桌子上擺著的一本《C程序設(shè)計語言》,那是丹尼斯·里奇唯一的遺著, 拿起這本書,C不由悲從心來。

 

串門

C語言突然想起來對門的 Ken Thompson,那是Dennis Ritchie的“好基友”,他們倆一起創(chuàng)造了偉大的Unix操作系統(tǒng),獲得了計算機界的最高獎:圖靈獎。

要不問問Ken? 為什么不讓我有對象?不讓我面向?qū)ο缶幊?

C來到Ken Thompson的門口,按了門鈴,門開了,C語言一眼就看到Ken Thompson正在和Go玩得不亦樂乎,心中更是凄苦,Go才是人家的親兒子,我算老幾, 轉(zhuǎn)身便要離去。

Ken 卻從后面叫住了他:“小C啊,快進(jìn)來,和你的兄弟Go玩一會兒。”

看到C滿臉沮喪,Ken也大為吃驚:“大過年的,怎么回事?”

C不滿地說:“當(dāng)年你們?yōu)槭裁床蛔屛矣袑ο?”

“對象,什么對象? 奧,你是說面向?qū)ο缶幊贪?其實吧你親爹把你設(shè)計出來,主要是做系統(tǒng)級編程的,要的是貼近硬件,要的是效率,要那復(fù)雜玩意兒干啥?中看不中用,再說了,你和Go一樣,不是有struct嗎? ” Ken 轉(zhuǎn)向Go,擠了擠眼睛。

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

“但是struct也實現(xiàn)不了OOP啊, Python,JavaScript他們都嘲笑我! ”

“那你說說,什么是OOP?”Ken問道。

“嗯,就是封裝、繼承、多態(tài)吧? ” C回答到。

“好,我來給你掰扯掰扯,用C語言怎么實現(xiàn)封裝、繼承還有多態(tài)!”

封裝

Ken Thompson 真不愧是老司機,唰唰唰迅速就寫成了一段代碼。

他說道:“我們先來說說封裝,這封裝就是把信息給隱藏起來,你先看看這段代碼。”

shape.h

 

shape.c

 

main.c

 

這里定義了一個叫做Shape的結(jié)構(gòu)體,外界只能通過相關(guān)的函數(shù)來對這個Shape進(jìn)行操作,例如創(chuàng)建(Shape_create), 移動(Shape_move), 還有獲取位置(Shape_getX)等,不能直接訪問Shape的內(nèi)部數(shù)據(jù)結(jié)構(gòu)。

雖然這里沒有class這樣的關(guān)鍵字,數(shù)據(jù)結(jié)構(gòu)和相關(guān)操作是分開寫的,看起來不太完美, 但確實是實現(xiàn)了封裝。

 

C 看到Ken Thompson居然把那個指針的名稱叫做self, 和Python的相同,不由得笑了起來:“我明白了,那繼承該怎么做呢?”

繼承

Ken Thompson不吭聲,繼續(xù)寫代碼。

大牛的風(fēng)格看來都是類似的: 別瞎BB,給我上代碼。

 

這次定義了一個矩形(Rectangle)的結(jié)構(gòu)體,其中嵌套了Shape,難道這就實現(xiàn)了繼承? C有點疑惑。

Go小子在旁邊叫了起來:“我明白了,在內(nèi)存中,他們是這樣的。”

 

通過這種組合的方式,也算是實現(xiàn)了繼承吧。

 

多態(tài)

這么輕松就實現(xiàn)了封裝和繼承,C語言感到很興奮, 但是多態(tài)怎么實現(xiàn)呢?

這時候又傳來了門鈴聲,Linus大神拎著一瓶酒進(jìn)來,要找C小伙兒喝酒,看到這桌子上的代碼,立刻就明白了怎么回事。

他說道:“別整那么多花里胡哨的東西,還多態(tài),不就是函數(shù)指針嘛! 我給你舉個例子。”

 

“這個結(jié)構(gòu)體包含了兩個函數(shù)指針,一個用來計算圖形的面積,另外一個把這個圖形畫出來。我們把這個結(jié)構(gòu)體叫做虛函數(shù)表。”

“這有什么用啊?”

“在你的Shape中,添加一個指向該函數(shù)表的指針就行了。” Linus回答。

 

C和Go都是一臉茫然。

“蠢材, 你們想想啊,當(dāng)你創(chuàng)建一個子類對象的時候,比如Rectangle, 把那個虛函數(shù)指針vptr指向另外一組函數(shù),會怎么樣?”

兩人還是不懂,Linus只好繼續(xù)畫圖:

 

現(xiàn)在C有點明白了, 無論是Rectangle對象,還是Square對象,在調(diào)用Shape_area方法的時候, 都需要通過vptr這個指針找到虛函數(shù)表中的area方法,對于Rectangle,找到的是Rectangel_area方法,對于Square,找到的是Square_area方法。

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

Shape_area((struct Shape *) r);

“其實吧,你的兄弟C++的多態(tài)實現(xiàn)原理也是類似的!在運行時查找真正的函數(shù)去執(zhí)行。” Ken 總結(jié)到。

“對,這種函數(shù)指針的使用方法太常見了,在我的Linux操作系統(tǒng)中也會定義類似的東西” Linus接口道,

 

“只要IO設(shè)備提供這幾個函數(shù)的實際定義,就可以將File結(jié)構(gòu)體的函數(shù)指針指向?qū)?yīng)的實現(xiàn),那就實現(xiàn)了用同一套接口操作不同的IO設(shè)備。”

C語言高興起來:“哈哈,我就說我的指針很厲害吧,這些全是通過指針來實現(xiàn)的。”

“是啊,別聽Java, Python, JavaScript他們瞎BB,你也有對象,也能進(jìn)行面向?qū)ο蟮木幊?”

C語言說道:“走,喝酒去!”

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

【本文為51CTO專欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號coderising獲取授權(quán)】

 

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2021-02-21 10:28:34

C語言Python系統(tǒng)

2018-02-08 15:30:19

2020-01-21 22:02:23

物聯(lián)網(wǎng)IOT物聯(lián)網(wǎng)應(yīng)用

2013-02-22 11:01:52

路由器無線路由器飛魚星

2020-09-23 16:55:43

C語言編程語言

2019-12-24 09:44:02

界面12306系統(tǒng)

2013-01-31 10:02:25

產(chǎn)品經(jīng)理火車

2022-03-01 21:05:39

TCP網(wǎng)絡(luò)協(xié)議

2019-02-03 10:33:56

2020-07-20 09:04:05

Java語言Vue

2020-03-01 13:52:46

Go語言項目

2022-04-26 06:43:12

文檔TCPLinux

2013-08-16 10:12:57

C編程風(fēng)格

2013-01-22 09:31:20

獵豹瀏覽器

2022-11-15 17:45:46

數(shù)據(jù)庫MySQL

2020-06-29 09:18:32

Python數(shù)據(jù)工具

2021-02-11 09:13:27

責(zé)任鏈模式業(yè)務(wù)

2012-01-12 10:29:06

ipad快盤

2013-01-28 10:33:58

快牙
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久热9| 免费看的黄网站 | 天天久久| 欧美日韩福利视频 | 久久久久国产精品www | 欧美日韩在线精品 | 久久网亚洲 | 久久久久成人精品 | 久久久国产精品网站 | 免费黄色特级片 | 91久久久久久久久久久久久 | 欧洲精品久久久久毛片完整版 | 欧美一级在线 | 丁香五月网久久综合 | 久久国产一区二区三区 | 日韩在线观看中文字幕 | 羞羞视频网| 欧美精品一区二区三区在线四季 | 黄色免费在线观看 | 国产精品一区二区久久 | 黄色91在线| av资源在线看 | 欧美精品久久 | 日韩中文字幕在线视频观看 | 三级成人在线 | 电影91久久久 | 2021天天干夜夜爽 | 一区二区三区四区日韩 | 午夜免费视频观看 | 亚洲一区二区三区在线播放 | 久久久久免费观看 | 国产精品日本一区二区在线播放 | 日韩一区二区在线视频 | 久久av一区二区三区 | www.中文字幕.com | 久久久久中文字幕 | 夜夜骑首页 | 成人在线看片 | 一区二区三区久久 | 国产午夜精品一区二区三区四区 | 色综合区|