C++的關(guān)鍵字public,private和protected

先寫最基礎(chǔ)的吧绅这。
C進(jìn)入C++最先碰到的就是class赔桌,跟structure很像瓢剿,但是一開始就多了幾個(gè)關(guān)鍵字public,private和protected帘睦。
下面就我目前自己的理解來說一說袍患。
這幾個(gè)關(guān)鍵都是修飾class內(nèi)部成員的訪問權(quán)限,簡單的理解就是:

  • 這些都是我的東西竣付,你想要的話诡延,是可以直接拿呢;還是需要我給你一把鑰匙先古胆?
  • 能直接拿的肆良,那就是public成員筛璧。
  • 需要鑰匙的,那就是private或者protected成員惹恃。

不過實(shí)際用起來夭谤,我理解可以分成兩種case:

1. 聲明class時(shí),修飾內(nèi)部成員屬性

看一段code:

#include<iostream>
#include<assert.h>
using namespace std;
class A{
public:
    int a;
    A() {
        a1 = 1;
        a2 = 2;
        a3 = 3;
        a = 4;
    }
    void fun() {
        cout << a << endl;        //  在類內(nèi)部訪問巫糙,正確
        cout << a1 << endl;       //  內(nèi)部訪問朗儒,正確
        cout << a2 << endl;       //  內(nèi)部訪問,正確
        cout << a3 << endl;       //  內(nèi)部訪問参淹,正確
    }
public:
    int a1;
protected:
    int a2;
private:
    int a3;
};
int main() {
    A itema;
    itema.a = 10;       // 在類外部訪問public成員a醉锄,正確
    itema.a1 = 20;      // 在類外部訪問public成員a1,正確
    itema.a2 = 30;      // 在類外部訪問protected成員a2浙值,錯(cuò)誤恳不,類外不能訪問protected成員
    itema.a3 = 40;      // 在類外部訪問private成員a3,錯(cuò)誤亥鸠,類外不能訪問private成員
    system("pause");
    return 0;
}

由注釋可以看到妆够,通過不同的關(guān)鍵字修飾的類成員识啦,其訪問權(quán)限就有了區(qū)別负蚊。

小結(jié)一下:

  • public成員可以在類外部被訪問。
  • private成員只屬于類自己颓哮,外部想訪問private成員家妆,只能通過類方法。
  • protected成員目前的訪問屬性與private成員一樣

2. 類繼承時(shí)冕茅,使基類成員屬性在派生類中發(fā)生變化

類如果不發(fā)生派生伤极,好像就看不出protected和private的區(qū)別的,別慌姨伤,繼續(xù)往下走哨坪。
因?yàn)槭?個(gè)關(guān)鍵字,所以就有了3種繼承方式:

2.1 public繼承

剛開始乍楚,我是我爸爸生的当编,我想各方面都跟我爹保持一致,我不想對父類的各個(gè)成員屬性作任何改變徒溪,那么忿偷,我就用public繼承。
還是看code和注釋一目了然:

#include<iostream>
#include<assert.h>
using namespace std;
 
class A {
public:
    int a;
    A() {
        a1 = 1;
        a2 = 2;
        a3 = 3;
        a = 4;
    }
    void fun() {
          cout << a << endl;    // 訪問public成員a臊泌,正確
          cout << a1 << endl;   // 訪問public成員a1鲤桥,正確
          cout << a2 << endl;   // 類成員函數(shù)訪問protected成員a2,正確
          cout << a3 << endl;   // 類成員函數(shù)訪問private成員a3渠概,正確
    }
public:
      int a1;
protected:
      int a2;
private:
      int a3;
};

// 類B public繼承 類A茶凳,所以,B繼承了A的成員a1,a2贮喧,屬性也完全一樣(注:B無法繼承A的private成員a3)
class B : public A {                 
public:
      int a;
      B(int i) {
          A();
          a = i;
      }
      void fun() {
          cout << a << endl;        // 正確顷牌,訪問自己的public成員
          cout << a1 << endl;       // 正確,基類的public成員塞淹,在派生類中仍是public成員窟蓝。
          cout << a2 << endl;       // 正確,基類的protected成員饱普,在派生類中仍是protected,并且可以被派生類訪問运挫。
          cout << a3 << endl;       // 錯(cuò)誤,基類的private成員不能被派生類訪問套耕。(private成員只能由本類的成員訪問)
      }
};

int main() {
    B b(10);
    cout << b.a << endl;
    cout << b.a1 << endl;   // 正確谁帕,類外可以訪問b的public成員a1
    cout << b.a2 << endl;   // 錯(cuò)誤,類外不能訪問protected成員a2
    cout << b.a3 << endl;   // 錯(cuò)誤冯袍,類外不能訪問private成員
    system("pause");
    return 0;
}

小結(jié)一下:

  • public繼承出來的派生類匈挖,基類的成員屬性在派生類中不會(huì)發(fā)生任何變化。
  • 派生類無法訪問基類的private成員康愤。(我理解為:派生類無法繼承基類的private成員儡循,因此派生類就沒有這個(gè)成員,自然也就無法訪問)
  • 派生類可以繼承基類的protected成員征冷,并且在派生類中择膝,仍然是protected屬性。

2.2 protected繼承

OK检激,龍生九子肴捉,總有熊孩子。雖然我是我爸爸生出來的叔收,但我爸當(dāng)年讓你直接隨便拿的一些東西(蒼老師教學(xué)片)齿穗,在我這兒,我不想讓你直接取了(我要私藏起來饺律,鎖抽屜里窃页,隱私,懂不懂@渡埂腮出?),我想變一下芝薇,那咋辦胚嘲?
那好辦,C++就是這點(diǎn)好,你想要的洛二,它都能給你 : )
那我們就不public繼承了嘛馋劈,關(guān)鍵字不是還有2個(gè)嗎攻锰,protected也可以用?
那當(dāng)然了妓雾,請看code:

#include<iostream>
#include<assert.h>
using namespace std;
class A {
public:
    int a;
    A() {
        a1 = 1;
        a2 = 2;
        a3 = 3;
        a = 4;
    }
    void fun() {
        cout << a << endl;    // 正確娶吞,自己的方法訪問自己的成員
        cout << a1 << endl;   //正確
        cout << a2 << endl;   //正確
        cout << a3 << endl;   //正確
    }
public:
    int a1;
protected:
    int a2;
private:
    int a3;
};

// B protected繼承 A,那么A的public成員械姻,在B中就“降級”變成protected妒蛇,protected和private成員屬性不變
class B : protected A {
public:
    int a;
    B(int i) {
        A();
        a = i;
    }
    void fun() {
        cout << a << endl;       //正確,B自己的public成員楷拳。
        cout << a1 << endl;       //正確绣夺,基類的public成員,在派生類中變成了protected欢揖,可以被派生類訪問陶耍。
        cout << a2 << endl;       //正確,基類的protected成員她混,在派生類中還是protected烈钞,可以被派生類訪問。
        cout << a3 << endl;       //錯(cuò)誤坤按,基類的private成員不能被派生類訪問毯欣。
    }
};

int main() {
    B b(10);
    cout << b.a << endl;       //正確,對象b自己的的public成員a
    cout << b.a1 << endl;      //錯(cuò)誤晋涣,b.a1這時(shí)候是protected屬性仪媒,protected成員不能在類外訪問。
    cout << b.a2 << endl;      //錯(cuò)誤谢鹊,protected成員不能在類外訪問。
    cout << b.a3 << endl;      //錯(cuò)誤留凭,private成員不能在類外訪問佃扼。
    system("pause");
    return 0;
}

你看,這樣蔼夜,爸爸的public片片兼耀,在兒子這里,就鎖起來了吧求冷!
小結(jié)一下

  • protected繼承出的派生類瘤运,基類的成員屬性在派生類中會(huì)發(fā)生改變。
  • 基類的public成員匠题,在派生類中被“降級”成protected拯坟。
  • 基類的protected成員,在派生類中仍然是protected韭山。
  • 基類的private成員郁季,派生類依然無法訪問冷溃。

2.3 private繼承

來到最后一個(gè)關(guān)鍵字private。
沒有最熊梦裂,只有更熊的娃似枕。我爸讓你能直接看的所有東西,現(xiàn)在到我這兒年柠,對不起凿歼,我都不想再讓你直接看了;并且冗恨,我還不想給我的兒子繼承了R阃(蒼老師只屬于我,自己親兒子也別想E山)
那要達(dá)到這樣的效果攀唯,就需要private繼承了。
看code:

#include<iostream>
#include<assert.h>
using namespace std;
class A{
public:
    int a;
    A() {
        a1 = 1;
        a2 = 2;
        a3 = 3;
        a = 4;
    }
    void fun() {
        cout << a << endl;    //正確
        cout << a1 << endl;   //正確
        cout << a2 << endl;   //正確
        cout << a3 << endl;   //正確
    }
public:
    int a1;
protected:
    int a2;
private:
    int a3;
};

// B private繼承 A渴丸,那么在B里侯嘀,A的public和protected成員都變成了B的private成員
class B : private A {
public:
    int a;
    B(int i) {
        A();
        a = i;
    }
    void fun() {
        cout << a << endl;       //正確,內(nèi)部訪問public成員a谱轨。
        cout << a1 << endl;       //正確戒幔,基類public成員,在派生類中變成了private,可以被派生類訪問。
        cout << a2 << endl;       //正確土童,基類的protected成員诗茎,在派生類中變成了private,可以被派生類訪問献汗。
        cout << a3 << endl;       //錯(cuò)誤敢订,基類的private成員不能被派生類訪問。
    }
};

int main(){
  B b(10);
  cout << b.a << endl;       //正確罢吃。b.a是b的public成員
  cout << b.a1 << endl;      //錯(cuò)誤楚午,private成員不能在類外訪問。
  cout << b.a2 << endl;      //錯(cuò)誤, private成員不能在類外訪問尿招。
  cout << b.a3 << endl;      //錯(cuò)誤矾柜,private成員不能在類外訪問。
  system("pause");
  return 0;
}

再次小結(jié)一下

  • private繼承后就谜,基類的public和protected成員怪蔑,在派生類里都被“降級”成private。
  • 訪問派生類的private成員丧荐,自然遵循private規(guī)則缆瓣。
  • 如果有派生類再派生“孫子”類,那么這個(gè)“孫子”類將無法訪問“爺爺”類和“父親”類中的任何private成員篮奄。

好啦捆愁,今天就碼到這里割去,第一次寫技術(shù)文字,獻(xiàn)丑獻(xiàn)丑昼丑,有謬誤之處,請不吝指教菩帝,多謝多謝~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咖城,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子呼奢,更是在濱河造成了極大的恐慌宜雀,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件握础,死亡現(xiàn)場離奇詭異辐董,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)禀综,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門简烘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人定枷,你說我怎么就攤上這事孤澎。” “怎么了欠窒?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵覆旭,是天一觀的道長。 經(jīng)常有香客問我岖妄,道長型将,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任衣吠,我火速辦了婚禮茶敏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缚俏。我一直安慰自己,他們只是感情好贮乳,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布忧换。 她就那樣靜靜地躺著,像睡著了一般向拆。 火紅的嫁衣襯著肌膚如雪亚茬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天浓恳,我揣著相機(jī)與錄音刹缝,去河邊找鬼碗暗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛梢夯,可吹牛的內(nèi)容都是我干的言疗。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼颂砸,長吁一口氣:“原來是場噩夢啊……” “哼噪奄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起人乓,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤勤篮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后色罚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碰缔,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年戳护,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了金抡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡姑尺,死狀恐怖竟终,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情切蟋,我是刑警寧澤统捶,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站柄粹,受9級特大地震影響喘鸟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜驻右,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一什黑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧堪夭,春花似錦愕把、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至爬迟,卻和暖如春橘蜜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背付呕。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工计福, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留跌捆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓象颖,卻偏偏與公主長得像佩厚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子力麸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

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