您好,登錄后才能下訂單哦!
上節(jié)我們講了類,我們知道類有繼承和組合的關(guān)系。那么電腦一般而言是由 CPU、內(nèi)存、主板鍵盤(pán)和硬盤(pán)等部件組合而成。那么我們想下,學(xué)習(xí)電腦組裝是否需要學(xué)習(xí)顯示器、鍵盤(pán)、鼠標(biāo)、內(nèi)存等部件的設(shè)計(jì)與制造呢?肯定是不需要了,那么我們的類也是一樣。它分為兩個(gè)部分:a> 類的實(shí)現(xiàn)細(xì)節(jié);b> 類的使用方式。對(duì)于前面的問(wèn)題來(lái)說(shuō),我們只需要知道電腦的使用方式即可,并不需要了解它內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)。
當(dāng)使用類時(shí),不需要關(guān)心其實(shí)現(xiàn)細(xì)節(jié);當(dāng)創(chuàng)建類時(shí),才需要考慮其內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。我們舉個(gè)例子:當(dāng)普通用戶使用手機(jī)時(shí),他只需要學(xué)習(xí)如何發(fā)短信、打電話等等;而手機(jī)開(kāi)發(fā)工程師呢?他需要考慮的是手機(jī)內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)。那么這時(shí)就會(huì)用到封裝了,根據(jù)經(jīng)驗(yàn),并不是類的每個(gè)屬性都是對(duì)外公開(kāi)的。如:女孩子不希望外人知道自己的體重和年齡;男孩子不希望外人知道自己的身高和收入。而一些類的屬性是對(duì)外公開(kāi)的,如:人的姓名、學(xué)歷以及國(guó)籍等。必須在類的表示法中定義屬性和行為的公開(kāi)級(jí)別,類似于文件系統(tǒng)中文件的權(quán)限。
C++ 中類的封裝有兩個(gè):成員變量和成員函數(shù)。成員變量是 C++ 中用于表示類屬性的變量,成員函數(shù)是 C++ 中用于表示類行為的函數(shù);在 C++ 中可以給成員變量和成員函數(shù)定義訪問(wèn)級(jí)別,分為 public 和 private。public 表示的是成員變量和成員函數(shù)可以在類的內(nèi)部和外界訪問(wèn)和調(diào)用,而 private 則表示成員變量和成員函數(shù)只能在類的內(nèi)部被訪問(wèn)和調(diào)用。
下來(lái)我們以代碼為例進(jìn)行說(shuō)明
#include <stdio.h> struct Biology { bool living; }; struct Animal:Biology { bool movable; void findFood() {} }; struct Plant:Biology { bool lgrowable; }; struct Beast:Animal { void sleep() {} }; struct Humann:Animal { void sleep() {} void work() {} }; struct Gril : Humann { private: int age; int weight; public: void print() { age = 22; weight = 48; printf("I'm a gril, I'm %d years old.\n", age); printf("My weight is %d kg.\n", weight); } }; struct Boy : Humann { private: int height; int salary; public: int age; int weight; void print() { height = 175; salary = 9000; printf("I'm a boy, my height is %d cm.\n", height); printf("My salary is %d RMB.\n", salary); } }; int main() { Gril g; Boy b; g.age = 23; g.print(); b.age = 24; b.weight = 120; b.print(); return 0; }
我們先來(lái)分析下這個(gè)程序,這份程序是以我們上節(jié)的程序?yàn)榛A(chǔ)進(jìn)行編寫(xiě)的。定義了 Gril 和 Boy,他們都繼承于 Human 類。第 62、63 行定義了他們的對(duì)象,第 65 行它給女孩的 age 進(jìn)行賦值,因?yàn)榕⒌?age 是私有屬性,所以會(huì)報(bào)錯(cuò)。但是在類中定義的 print 函數(shù)中的給私有成員變量進(jìn)行賦值是允許的。第 68 行給男孩的 age 和 weight 進(jìn)行賦值是可以的,因?yàn)樗鼈兪枪谐蓡T。我們來(lái)看看編譯結(jié)果
我們看到 65 行報(bào)錯(cuò)了,它說(shuō) g.age 是私有屬性,不能直接進(jìn)行賦值,我們注釋掉第 65 行,再來(lái)編譯下
我們看到程序編譯通過(guò)了,并且也打印出了相關(guān)信息。
下來(lái)我們講個(gè)類成員的作用域,就是我們之前的 print 函數(shù)為啥能直接對(duì)他的私有成員進(jìn)行賦值操作,原因就是類成員的作用域只在類的內(nèi)部,外部無(wú)法直接訪問(wèn)。成員函數(shù)可以直接訪問(wèn)成員變量和調(diào)用成員函數(shù);類的外部可以通過(guò)類變量訪問(wèn) public 成員,類成員的作用域與訪問(wèn)級(jí)別沒(méi)有關(guān)系。在 C++ 中用 struct 定義的類中所有成員默認(rèn)為 public。
下來(lái)我們以示例代碼為例進(jìn)行說(shuō)明
#include <stdio.h> int i = 1; struct Test { private: int i; public: int j; int getI() { i = 3; return i; } }; int main() { int i = 2; Test test; test.j = 4; printf("i = %d\n", i); // i = 2; printf("::i = %d\n", ::i); // ::i = 1; printf("test.i = %d\n", test.i); // Error printf("test.j = %d\n", test.j); // test.j = 4 printf("test.getI() = %d\n", test.getI()); // test.getI() = 3 return 0; }
我們定義了一個(gè) Test 類,在第 28 行打印的是 main 函數(shù)作用域的 i,所以打印的應(yīng)該為 2,。在第 29 行加上 :: ,表示的是默認(rèn)空間,打印的便是全局變量 i 了,為 1。第 30 行直接打印 test.i,因?yàn)?i 在 test 類中為私有成員,所以這行會(huì)報(bào)錯(cuò)。第 31 打印的便是 4,第 32 打印的便是 3 了。我們來(lái)看看編譯結(jié)果
我們看到第 30 行報(bào)錯(cuò)了,我們注釋掉這行再來(lái)編譯
我們看到編譯的結(jié)果和我們所分析的是一致的。通過(guò)對(duì)類的封裝的學(xué)習(xí),總結(jié)如下:1、類通常可以分為使用方式和內(nèi)部細(xì)節(jié)兩部分,類的封裝機(jī)制使得使用方式和內(nèi)部細(xì)節(jié)相分離;2、C++ 中通過(guò)定義類成員的訪問(wèn)級(jí)別實(shí)現(xiàn)封裝機(jī)制;3、public 成員可以在類的內(nèi)部和外界訪問(wèn)和調(diào)用,private 成員只能在類的內(nèi)部被訪問(wèn)和使用。
歡迎大家一起來(lái)學(xué)習(xí) C++ 語(yǔ)言,可以加我QQ:243343083。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。