1.2.03_C++ 類訪問修飾符

C++ 類 & 對(duì)象

數(shù)據(jù)封裝是面向?qū)ο缶幊痰囊粋€(gè)重要特點(diǎn),它防止函數(shù)直接訪問類類型的內(nèi)部成員

類成員的訪問限制是通過在類主體內(nèi)部對(duì)各個(gè)區(qū)域標(biāo)記 public峭梳、private持偏、protected 來指定的。關(guān)鍵字 public痹筛、private莺治、protected 稱為訪問修飾符廓鞠。

一個(gè)類可以有多個(gè) public、protected 或 private 標(biāo)記區(qū)域谣旁。每個(gè)標(biāo)記區(qū)域在下一個(gè)標(biāo)記區(qū)域開始之前或者在遇到類主體結(jié)束右括號(hào)之前都是有效的床佳。成員和類的默認(rèn)訪問修飾符是 private。

class Base {
 
   public:
 
  // 公有成員
 
   protected:
 
  // 受保護(hù)成員
 
   private:
 
  // 私有成員
 
};

公有(public)成員

公有成員在程序中類的外部是可訪問的榄审。您可以不使用任何成員函數(shù)來設(shè)置和獲取公有變量的值砌们,如下所示:
實(shí)例

#include <iostream>
 
using namespace std;
 
class Line
{
   public:
      double length;
      void setLength( double len );
      double getLength( void );
};
 
// 成員函數(shù)定義
double Line::getLength(void)
{
    return length ;
}
 
void Line::setLength( double len )
{
    length = len;
}
 
// 程序的主函數(shù)
int main( )
{
   Line line;
 
   // 設(shè)置長度
   line.setLength(6.0); 
   cout << "Length of line : " << line.getLength() <<endl;
 
   // 不使用成員函數(shù)設(shè)置長度
   line.length = 10.0; // OK: 因?yàn)?length 是公有的
   cout << "Length of line : " << line.length <<endl;
   return 0;
}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

Length of line : 6
Length of line : 10

私有(private)成員

私有成員變量或函數(shù)在類的外部是不可訪問的搁进,甚至是不可查看的怨绣。

只有類和友元函數(shù)可以訪問私有成員

默認(rèn)情況下拷获,類的所有成員都是私有的篮撑。例如在下面的類中,width 是一個(gè)私有成員匆瓜,這意味著赢笨,如果您沒有使用任何訪問修飾符,類的成員將被假定為私有成員:
實(shí)例

class Box
{
   double width;
   public:
      double length;
      void setWidth( double wid );
      double getWidth( void );
};

實(shí)際操作中驮吱,我們一般會(huì)在私有區(qū)域定義數(shù)據(jù)茧妒,在公有區(qū)域定義相關(guān)的函數(shù),以便在類的外部也可以調(diào)用這些函數(shù)左冬,如下所示:
實(shí)例

#include <iostream>
 
using namespace std;
 
class Box
{
   public:
      double length;
      void setWidth( double wid );
      double getWidth( void );
 
   private:
      double width;
};
 
// 成員函數(shù)定義
double Box::getWidth(void)
{
    return width ;
}
 
void Box::setWidth( double wid )
{
    width = wid;
}
 
// 程序的主函數(shù)
int main( )
{
   Box box;
 
   // 不使用成員函數(shù)設(shè)置長度
   box.length = 10.0; // OK: 因?yàn)?length 是公有的
   cout << "Length of box : " << box.length <<endl;
 
   // 不使用成員函數(shù)設(shè)置寬度
   // box.width = 10.0; // Error: 因?yàn)?width 是私有的
   box.setWidth(10.0);  // 使用成員函數(shù)設(shè)置寬度
   cout << "Width of box : " << box.getWidth() <<endl;
 
   return 0;
}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí)桐筏,它會(huì)產(chǎn)生下列結(jié)果:

Length of box : 10
Width of box : 10

保護(hù)(protected)成員

保護(hù)成員變量或函數(shù)與私有成員十分相似,但有一點(diǎn)不同拇砰,保護(hù)成員在派生類(即子類)中是可訪問的梅忌。

在下一個(gè)章節(jié)中,您將學(xué)習(xí)到派生類和繼承的知識(shí)〕疲現(xiàn)在您可以看到下面的實(shí)例中牧氮,我們從父類 Box 派生了一個(gè)子類 smallBox。

下面的實(shí)例與前面的實(shí)例類似瑰枫,在這里 width 成員可被派生類 smallBox 的任何成員函數(shù)訪問踱葛。
實(shí)例

#include <iostream>
using namespace std;
 
class Box
{
   protected:
      double width;
};
 
class SmallBox:Box // SmallBox 是派生類
{
   public:
      void setSmallWidth( double wid );
      double getSmallWidth( void );
};
 
// 子類的成員函數(shù)
double SmallBox::getSmallWidth(void)
{
    return width ;
}
 
void SmallBox::setSmallWidth( double wid )
{
    width = wid;
}
 
// 程序的主函數(shù)
int main( )
{
   SmallBox box;
 
   // 使用成員函數(shù)設(shè)置寬度
   box.setSmallWidth(5.0);
   cout << "Width of box : "<< box.getSmallWidth() << endl;
 
   return 0;
}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

Width of box : 5

繼承中的特點(diǎn)

有public, protected, private三種繼承方式光坝,它們相應(yīng)地改變了基類成員的訪問屬性尸诽。

  1. public 繼承
    基類 public 成員,protected 成員盯另,private 成員的訪問屬性在派生類中分別變成:public, protected, private

  2. protected 繼承
    基類public 成員性含,protected 成員,private 成員的訪問屬性在派生類中分別變成:protected, protected, private

  3. private 繼承
    基類 public 成員土铺,protected 成員胶滋,private 成員的訪問屬性在派生類中分別變成:private, private, private

但無論哪種繼承方式板鬓,上面兩點(diǎn)都沒有改變:

  1. private 成員只能被本類成員(類內(nèi))和友元訪問,不能被派生類訪問究恤;
  2. protected 成員可以被派生類訪問俭令。

public 繼承

實(shí)例

#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;
};
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成員不能被派生類訪問悟耘。
  }
};
int main(){
  B b(10);
  cout << b.a << endl;
  cout << b.a1 << endl;   //正確
  cout << b.a2 << endl;   //錯(cuò)誤,類外不能訪問protected成員
  cout << b.a3 << endl;   //錯(cuò)誤织狐,類外不能訪問private成員
  system("pause");
  return 0;
}

protected 繼承

實(shí)例

#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;
};
class B : protected A{
public:
  int a;
  B(int i){
    A();
    a = i;
  }
  void fun(){
    cout << a << endl;       //正確暂幼,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;       //正確设易。public成員
  cout << b.a1 << endl;      //錯(cuò)誤,protected成員不能在類外訪問蛹头。
  cout << b.a2 << endl;      //錯(cuò)誤,protected成員不能在類外訪問戏溺。
  cout << b.a3 << endl;      //錯(cuò)誤渣蜗,private成員不能在類外訪問。
  system("pause");
  return 0;
}

private 繼承

實(shí)例

#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;
};
class B : private A{
public:
  int a;
  B(int i){
    A();
    a = i;
  }
  void fun(){
    cout << a << endl;       //正確旷祸,public成員耕拷。
    cout << a1 << endl;       //正確,基類public成員,在派生類中變成了private,可以被派生類訪問托享。
    cout << a2 << endl;       //正確骚烧,基類的protected成員浸赫,在派生類中變成了private,可以被派生類訪問。
    cout << a3 << endl;       //錯(cuò)誤赃绊,基類的private成員不能被派生類訪問既峡。
  }
};
int main(){
  B b(10);
  cout << b.a << endl;       //正確。public成員
  cout << b.a1 << endl;      //錯(cuò)誤碧查,private成員不能在類外訪問运敢。
  cout << b.a2 << endl;      //錯(cuò)誤, private成員不能在類外訪問。
  cout << b.a3 << endl;      //錯(cuò)誤忠售,private成員不能在類外訪問传惠。
  system("pause");
  return 0;
}

代碼鏈接:https://github.com/karst87/cpp/tree/master/learning/com.runoob

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市稻扬,隨后出現(xiàn)的幾起案子卦方,更是在濱河造成了極大的恐慌,老刑警劉巖泰佳,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盼砍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡乐纸,警方通過查閱死者的電腦和手機(jī)衬廷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汽绢,“玉大人吗跋,你說我怎么就攤上這事∧眩” “怎么了跌宛?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長积仗。 經(jīng)常有香客問我疆拘,道長,這世上最難降的妖魔是什么寂曹? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任哎迄,我火速辦了婚禮,結(jié)果婚禮上隆圆,老公的妹妹穿的比我還像新娘漱挚。我一直安慰自己,他們只是感情好渺氧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布旨涝。 她就那樣靜靜地躺著,像睡著了一般侣背。 火紅的嫁衣襯著肌膚如雪白华。 梳的紋絲不亂的頭發(fā)上慨默,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音弧腥,去河邊找鬼厦取。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鸟赫,可吹牛的內(nèi)容都是我干的蒜胖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼抛蚤,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼台谢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起岁经,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤朋沮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后缀壤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體樊拓,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年塘慕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了筋夏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡图呢,死狀恐怖条篷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛤织,我是刑警寧澤赴叹,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站指蚜,受9級(jí)特大地震影響乞巧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜摊鸡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一绽媒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧免猾,春花似錦些椒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赢乓。三九已至忧侧,卻和暖如春石窑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚓炬。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工松逊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肯夏。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓经宏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親驯击。 傳聞我的和親對(duì)象是個(gè)殘疾皇子烁兰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • C++文件 例:從文件income. in中讀入收入直到文件結(jié)束,并將收入和稅金輸出到文件tax. out徊都。 檢查...
    SeanC52111閱讀 2,776評(píng)論 0 3
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法沪斟,類相關(guān)的語法,內(nèi)部類的語法暇矫,繼承相關(guān)的語法主之,異常的語法,線程的語...
    子非魚_t_閱讀 31,622評(píng)論 18 399
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,516評(píng)論 1 51
  • photo by will wan vingerden 走吧李根,趁早別太晚槽奕。 他們 走在路上,經(jīng)撤拷危看著他們的背影粤攒。 ...
    般步閱讀 286評(píng)論 0 0
  • 晨曦照大地, 萬物皆生輝冀续, 茶花含苞放琼讽, 澀澀笑迎春。
    海浪低吟淺唱閱讀 106評(píng)論 0 0