本篇文章的講解將按照上述的方式,逐層遞進(jìn),進(jìn)一步幫你拿捏C++類和對象這部分。
狗改不了吃屎,這其中的狗吃屎(狗選擇了什么食物來填飽肚子)就可以理解為面向?qū)ο?br />
而吃狗屎,(狗吃屎的過程)狗享受食物的這個過程就可以理解為面向過程
狗的食物需求種類豐富多樣,可以是大米飯,也可以是豬排骨,還可以是屎…在這些用來填飽肚子的食物當(dāng)中,狗對自己的便便算得上是情有獨(dú)鐘了,畢竟吃起來回味無窮,這樣看起來如此秀色可餐的美食也讓我們每個人都垂涎三尺了,但是很可惜的是我們無福消受。
我以定義菜單上的食物類為例,向大家講解他們之間的區(qū)別:
(1)C語言的方式
(2)C++的方式
從上述的例子,我們就能輕而易舉地看出其區(qū)別,C語言只允許有成員變量在結(jié)構(gòu)體中,而C++的結(jié)構(gòu)體中不僅僅只有成員變量,而且還允許有成員方法(即所謂的函數(shù)),也就是C++將結(jié)構(gòu)體升級成為了類,所以更喜歡用class來表示類,而不是struct。(注:class在英文翻譯中不單單是只有班級的意思,更還有類這方面的意思)
(1)模板樣式
class為定義類的關(guān)鍵字,ClassName為類的名字,{}中為類的主體,注意類定義結(jié)束時后面是有分號的,千萬不要忘記,有的編譯器會幫你自動補(bǔ)充,但是也有不會幫你自動補(bǔ)充的!
類中的元素稱為類的成員:類中的數(shù)據(jù)稱為類的屬性或者成員變量; 類中的函數(shù)稱為類的方法或者成員函數(shù)。
(2)類的兩種定義方式:
以我前面寫的食物類為例:
【1】 聲明和定義全部放在類體中,需要注意:成員函數(shù)如果在類中定義,編譯器可能會將其當(dāng)成內(nèi)聯(lián)函數(shù)處理。
擴(kuò)展遷移(何為內(nèi)聯(lián)函數(shù)?懂得小伙伴可以略過)
很多小伙伴可能不太清楚內(nèi)聯(lián)函數(shù)是什么意思,那這里我再簡單講解下內(nèi)聯(lián)函數(shù):
①概念:以inline修飾的函數(shù)叫做內(nèi)聯(lián)函數(shù),編譯時C++編譯器會在調(diào)用內(nèi)聯(lián)函數(shù)的地方展開,沒有函數(shù)壓棧的開銷,內(nèi)聯(lián)函數(shù)提升程序運(yùn)行的效率。
②特性:
a. inline是一種以空間換時間的做法,省去調(diào)用函數(shù)額開銷。所以代碼很長或者有循環(huán)/遞歸的函數(shù)不適宜使用作為內(nèi)聯(lián)函數(shù)。
b. inline對于編譯器而言只是一個建議,編譯器會自動優(yōu)化,如果定義為inline的函數(shù)體內(nèi)有循環(huán)/遞歸等
等,編譯器優(yōu)化時會忽略掉內(nèi)聯(lián)。
c. inline不建議聲明和定義分離,分離會導(dǎo)致鏈接錯誤。因為inline被展開,就沒有函數(shù)地址了,鏈接就會
找不到。
【2】聲明放在.h文件中,類的定義放在.cpp文件中
一般情況下,更期望采用第二種方式。
(1)訪問限定符
C++實現(xiàn)封裝的方式:用類將對象的屬性與方法結(jié)合在一塊,讓對象更加完善,通過訪問權(quán)限選擇性的將其接口提供給外部的用戶使用。
【訪問限定符說明】
①public修飾的成員在類外可以直接被訪問
②protected和private修飾的成員在類外不能直接被訪問(此處protected和private是類似的)
③訪問權(quán)限作用域從該訪問限定符出現(xiàn)的位置開始直到下一個訪問限定符出現(xiàn)時為止
④class的默認(rèn)訪問權(quán)限為private,struct為public(因為struct要兼容C)
注意:訪問限定符只在編譯時有用,當(dāng)數(shù)據(jù)映射到內(nèi)存后,沒有任何訪問限定符上的區(qū)別
拓展引申:
基于第④小點,我們就可以明確地清楚C++中struct和class的主要區(qū)別是什么?
即C++需要兼容C語言,所以C++中struct可以當(dāng)成結(jié)構(gòu)體去使用。另外C++中struct還可以用來定義類。
和class是定義類是一樣的,區(qū)別是struct的成員默認(rèn)訪問方式是public,class是的成員默認(rèn)訪問方式是
private。
(2)封裝
在類和對象階段,我們只研究類的封裝特性,那什么是封裝呢?
概念:將數(shù)據(jù)和操作數(shù)據(jù)的方法進(jìn)行有機(jī)結(jié)合,隱藏對象的屬性和實現(xiàn)細(xì)節(jié),僅對外公開接口來和對象進(jìn)行交互。
封裝本質(zhì)上是一種管理:
就比如說當(dāng)下全球都受到新冠疫情的影響,我國作為世界上少有的大國,又是如何做到疫情防控楷模,有效地抑制疫情在中國的傳播呢?我們使用健康碼通行制度(紅碼、黃碼、綠碼),只有當(dāng)你是綠碼的時候,你才能自由通行去想去的地方,否則就要進(jìn)行隔離,并且當(dāng)有地方出現(xiàn)疫情以后,也會根據(jù)疫情的嚴(yán)重程度變?yōu)橹懈唢L(fēng)險區(qū)、高風(fēng)險區(qū)等等,只有當(dāng)連續(xù)14天都沒有出現(xiàn)疫情才降為低風(fēng)險區(qū),正是因為國家這么合理有效地管控疫情,我國疫情才能如此的平穩(wěn)。很難想象如果我國不采用這些制度來管控疫情,那么我國疫情的現(xiàn)狀又該如何?說到這里,我們就得大大的為國家點贊了,非常慶幸生在中國!感謝祖國的保護(hù)。
類的封裝(使用protected/private把成員封裝起來)也是一樣的道理,好比你這邊是疫情高風(fēng)險區(qū),就必須得封控起來不讓你出去,也不能讓外面進(jìn)來,進(jìn)而才能有效地抑制疫情的發(fā)展。如果你類的封裝不夠完善,安全性不高,就如同這疫情防控一樣,豈不是亂套了嗎?
5、類的作用域:類定義了一個新的作用域,類的所有成員都在類的作用域中。在類體外定義成員,需要使用 :: 作用域解析符指明成員屬于哪個類域。
以我前面寫的食物類為例:
用類類型創(chuàng)建對象的過程,稱為類的實例化。
①類只是一個模型一樣的東西,限定了類有哪些成員,定義出一個類并沒有分配實際的內(nèi)存空間來存儲它。
②一個類可以實例化出多個對象,實例化出的對象 占用實際的物理空間,存儲類成員變量。
③做個比方。類實例化出對象就像現(xiàn)實中使用建筑設(shè)計圖建造出房子,類就像是設(shè)計圖,只設(shè)計出需要什
么東西,但是并沒有實體的建筑存在,同樣類也只是一個設(shè)計,實例化出的對象才能實際存儲數(shù)據(jù),占
用物理空間。
以我前面寫的食物類為例:
(1)如何計算類對象的大???
問題:類中既可以有成員變量,又可以有成員函數(shù),那么一個類的對象中包含了什么?如何計算一個類的大小呢?
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧