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

聚會

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不由悲從心來魁淳。

image

串門

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

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

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

Ken 卻從后面叫住了他:“小C啊夫椭,快進來,和你的兄弟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 真不愧是老司機睬魂,唰唰唰迅速就寫成了一段代碼终吼。

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

如果有正在學(xué)C/C++的程序員喉钢,可來我們的C/C++扣qun哦:556791282姆打,小編花了近一個月整理了一份非常適合18年學(xué)習(xí)的C/C++干貨,加入就免費送C/C++的視頻教程噢肠虽!而且我每天晚上都會在里面直播講C/C++知識幔戏,從零基礎(chǔ)學(xué)習(xí)到有基礎(chǔ)進階,歡迎初學(xué)和進階中的小伙伴税课。

shape.h

image

shape.c

image

main.c

image

這里定義了一個叫做Shape的結(jié)構(gòu)體闲延,外界只能通過相關(guān)的函數(shù)來對這個Shape進行操作,例如創(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)了封裝击狮。

image

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

繼承

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

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

image

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

Go小子在旁邊叫了起來:“我明白了辽狈,在內(nèi)存中,他們是這樣的呛牲」蚊龋”

image

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

image

多態(tài)

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

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

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

image

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

“這有什么用啊?”

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

image

C和Go都是一臉茫然。

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

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

image

現(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接口道,

image

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

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

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尽狠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子叶圃,更是在濱河造成了極大的恐慌袄膏,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掺冠,死亡現(xiàn)場離奇詭異沉馆,居然都是意外死亡,警方通過查閱死者的電腦和手機德崭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門斥黑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人眉厨,你說我怎么就攤上這事锌奴。” “怎么了憾股?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵鹿蜀,是天一觀的道長。 經(jīng)常有香客問我服球,道長耻姥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任有咨,我火速辦了婚禮琐簇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己婉商,他們只是感情好似忧,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丈秩,像睡著了一般盯捌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蘑秽,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天饺著,我揣著相機與錄音,去河邊找鬼肠牲。 笑死幼衰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缀雳。 我是一名探鬼主播渡嚣,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肥印!你這毒婦竟也來了识椰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤深碱,失蹤者是張志新(化名)和其女友劉穎腹鹉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敷硅,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡功咒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了竞膳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片航瞭。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖坦辟,靈堂內(nèi)的尸體忽然破棺而出刊侯,到底是詐尸還是另有隱情,我是刑警寧澤锉走,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布滨彻,位于F島的核電站,受9級特大地震影響挪蹭,放射性物質(zhì)發(fā)生泄漏亭饵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一梁厉、第九天 我趴在偏房一處隱蔽的房頂上張望辜羊。 院中可真熱鬧踏兜,春花似錦、人聲如沸八秃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昔驱。三九已至疹尾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骤肛,已是汗流浹背纳本。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留腋颠,地道東北人繁成。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像秕豫,于是被迫代替她去往敵國和親朴艰。 傳聞我的和親對象是個殘疾皇子观蓄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容