倉頡中的class和struct

遙想當(dāng)年學(xué)習(xí)C/C++時(shí),譚浩強(qiáng)老師那本紅皮的經(jīng)典教材《C語言程序設(shè)計(jì)》,前面大半本書都在講C語言的內(nèi)容,最后一兩個(gè)章節(jié)把C++的Class和面向?qū)ο蟮娜筇匦园岢鰜砹税锤担F(xiàn)在回憶起來當(dāng)時(shí)真的沒太學(xué)明白,只記得面向?qū)ο蟮奶匦允欠庋b胧卤、繼承唯绍、多態(tài)况芒,但也僅僅停留在能背出來绝骚,沒能理解什么真正的面向?qū)ο缶幊獭?/p>

真正理解面向?qū)ο缶幊蹋€得是感謝Java的出現(xiàn)止剖,Java寫的多了才開始對(duì)面向?qū)ο笥辛烁羁痰睦斫膺窗拢辉俚胶髞韺W(xué)習(xí)Python、C#待德、Swift橡庞、Kotlin才感覺如此輕松簡單。

今天來研究一下倉頡語言的class和struct法竞。



先說結(jié)論俯渤,在倉頡語言中,struct跟class的區(qū)別只有兩點(diǎn):

1略水、struct是值類型渊涝、class是引用類型

2厌处、struct不能繼承,class可以繼承

其他沒有什么區(qū)別缆娃。

倉頡spec還沒公開贯要,公開之后我可以給大家分析spec中關(guān)于struct和class的定義。

從實(shí)現(xiàn)層面來說,在編譯器前端,struct和class只是兩個(gè)關(guān)鍵字;在編譯器后端,class就是*struct尖飞。



一沮明、Struct

在倉頡語言的官方doc中琳袄,對(duì)struct的描述是這樣的:

“struct類型的定義以關(guān)鍵字struct開頭,后跟struct的名字碎紊,接著是定義在一對(duì)花括號(hào)中的struct定義體。struct定義體中可以定義一系列的成員變量、成員屬性(參見[屬性])、靜態(tài)初始化器、構(gòu)造函數(shù)和成員函數(shù)∑仔埃”

紙上得來終覺淺,我們還是一邊寫一邊理解吧。當(dāng)年大學(xué)C語言畢業(yè)設(shè)計(jì),相信大家都寫過C語言版本的“圖書管理系統(tǒng)”库继、“學(xué)生成績管理系統(tǒng)”之類的東西,我們就來寫一個(gè)倉頡版本的學(xué)生成績管理系統(tǒng)試試。


先寫一個(gè)學(xué)科的struct


定義一個(gè)學(xué)生的struct


定義一些成員函數(shù)


實(shí)現(xiàn)toString方法,方便println

結(jié)合上一篇文章中的冒牌排序,稍作修改,實(shí)現(xiàn)一個(gè)總分排名的功能函數(shù):


實(shí)例化10位同學(xué)惋砂,排名玩一下罗标。


輸出結(jié)果:

student sort:[

(小明, 195.000000, A),

(小智, 192.000000, A),

(小櫻, 187.500000, A),

(小一, 171.000000, B),

(小桃, 157.000000, C),

(小楓, 140.000000, C),

(小鬼, 110.000000, E),

(小小, 107.000000, E),

(小衫, 103.000000, E),

(小旭, 93.000000, E)]

補(bǔ)考前 s1:

(小楓, 140.000000, C)

補(bǔ)考后 s1:

(小楓, 200.000000, A)

補(bǔ)考后原始 student[5]:

(小楓, 140.000000, C)

可以看到代碼321行谢澈,s1=student[5]拷貝后,對(duì)s1的修改沒有影響student[5],這就是值類型,相當(dāng)于321行完成了一次python中的深拷貝;從實(shí)現(xiàn)層面來說甲献,就是s1是新開辟的一塊內(nèi)存空間,跟student[5]完全指向兩個(gè)不同的內(nèi)存地址。

總結(jié)一下幾個(gè)關(guān)鍵點(diǎn):

- struct可以定義成員變量、靜態(tài)成員變量、成員函數(shù)输涕、靜態(tài)成員函數(shù)莱坎,即可以實(shí)現(xiàn)封裝

- struct可以定義名為init的構(gòu)造函數(shù)螟深,init構(gòu)造函數(shù)可以重載即定義多個(gè)

- struct可以定義與名稱相同的主構(gòu)造函數(shù)划栓,成員變量形參同時(shí)扮演定義成員變量和構(gòu)造函數(shù)參數(shù)的功能。例如,public Subject(var name: String, var grade: Float32) {} 在定義主構(gòu)造函數(shù)的時(shí)候同時(shí)申明了Subject的兩個(gè)成員變量:name和grade

- struct可以實(shí)現(xiàn)多態(tài)吱窝,即通過interface實(shí)現(xiàn)鲫惶,例如struct Student <: ToString

二、class

我們用class把剛才的student和subject重新實(shí)現(xiàn)一次啄清。

1、由于class中可以使用prop關(guān)鍵字浅缸,封裝性會(huì)看起來會(huì)更好一點(diǎn)蚌父;使用prop可以通過getter和setter方法將一個(gè)private的成員變量隱藏起來朝聋,使class之外完全不知道class內(nèi)部有什么成員變量


2、class可以使用繼承民宿,那么Student結(jié)構(gòu)完全可以拆解為Person和Student兩個(gè)class,并通過繼承復(fù)用父類的成員變量和方法



其他函數(shù)的實(shí)現(xiàn)沒有區(qū)別,我就不截圖了。

還是實(shí)例化10個(gè)student,然后排序、拷貝驗(yàn)證一下。


輸出結(jié)果:

[

(小明, 195.000000, A),

(小智, 192.000000, A),

(小櫻, 187.500000, A),

(小一, 171.000000, B),

(小桃, 157.000000, C),

(小楓, 140.000000, C),

(小鬼, 110.000000, E),

(小小, 107.000000, E),

(小衫, 103.000000, E),

(小旭, 93.000000, E)]

補(bǔ)考前 cs1:

(小楓, 140.000000, C)

補(bǔ)考后 cs1:

(小楓, 200.000000, A)

補(bǔ)考后原始 cstudent[5]:

(小楓, 200.000000, A)

可以看到代碼340行cs1對(duì)cstudent[5]拷貝之后秘豹,對(duì)cs1的修改最終影響到了cstudent[5]疲扎,就好比python中的淺拷貝管怠;實(shí)現(xiàn)層面上渤弛,cs1和cstudent[5]指向同一個(gè)內(nèi)存地址祝拯。

class其實(shí)跟其他高級(jí)語言的class沒什么區(qū)別,但凡寫過高級(jí)語言上手都能直接用她肯,當(dāng)然佳头,一些細(xì)節(jié)大家最好還是去讀一遍doc文檔。



最后晴氨,關(guān)于內(nèi)存的問題康嘉,大家如果只是寫高級(jí)語言可以不太理解,我下次再寫一篇關(guān)于C語言籽前、倉頡語言的內(nèi)存管理的文章亭珍。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末敷钾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子肄梨,更是在濱河造成了極大的恐慌阻荒,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件众羡,死亡現(xiàn)場離奇詭異侨赡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)粱侣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門羊壹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人甜害,你說我怎么就攤上這事舶掖。” “怎么了尔店?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵眨攘,是天一觀的道長。 經(jīng)常有香客問我嚣州,道長鲫售,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任该肴,我火速辦了婚禮情竹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘匀哄。我一直安慰自己秦效,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布涎嚼。 她就那樣靜靜地躺著阱州,像睡著了一般。 火紅的嫁衣襯著肌膚如雪法梯。 梳的紋絲不亂的頭發(fā)上苔货,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音立哑,去河邊找鬼夜惭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛铛绰,可吹牛的內(nèi)容都是我干的诈茧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼捂掰,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼敢会!你這毒婦竟也來了镊叁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤走触,失蹤者是張志新(化名)和其女友劉穎晦譬,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體互广,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敛腌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惫皱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片像樊。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖旅敷,靈堂內(nèi)的尸體忽然破棺而出生棍,到底是詐尸還是另有隱情,我是刑警寧澤媳谁,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布涂滴,位于F島的核電站,受9級(jí)特大地震影響晴音,放射性物質(zhì)發(fā)生泄漏柔纵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一锤躁、第九天 我趴在偏房一處隱蔽的房頂上張望搁料。 院中可真熱鬧,春花似錦系羞、人聲如沸郭计。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昭伸。三九已至,卻和暖如春杠人,著一層夾襖步出監(jiān)牢的瞬間勋乾,已是汗流浹背宋下。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國打工嗡善, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人学歧。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓罩引,卻偏偏與公主長得像,于是被迫代替她去往敵國和親枝笨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子袁铐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

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

  • 前言 Google Play應(yīng)用市場對(duì)于應(yīng)用的targetSdkVersion有了更為嚴(yán)格的要求揭蜒。從 2018 年...
    申國駿閱讀 64,259評(píng)論 14 98
  • """1.個(gè)性化消息: 將用戶的姓名存到一個(gè)變量中,并向該用戶顯示一條消息剔桨。顯示的消息應(yīng)非常簡單屉更,如“Hello ...
    她即我命閱讀 2,902評(píng)論 0 5
  • 我們都是軟弱的人,所以才會(huì)說謊洒缀。我們都是膽小的人瑰谜,所以才要武裝。我們都是一群笨蛋树绩,所以才會(huì)互相傷害萨脑。
    所羅門的偽證_dc0a閱讀 2,075評(píng)論 0 3
  • 為了讓我有一個(gè)更快速、更精彩饺饭、更輝煌的成長渤早,我將開始這段刻骨銘心的自我蛻變之旅!從今天開始瘫俊,我將每天堅(jiān)持閱...
    李薇帆閱讀 1,721評(píng)論 0 2
  • 似乎最近一直都在路上鹊杖,每次出來走的時(shí)候感受都會(huì)很不一樣。 1扛芽、感恩一直遇到好心人仅淑,很幸運(yùn)。在路上總是...
    時(shí)間里的花Lily閱讀 1,197評(píng)論 0 1