溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

類與封裝的概念(十二)

發(fā)布時(shí)間:2020-05-15 04:46:09 來(lái)源:網(wǎng)絡(luò) 閱讀:992 作者:上帝之子521 欄目:編程語(yǔ)言

        上節(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

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI