Java中這個三個保留字用來修飾類的資料成員和成員函數,以及類本身,而C++中修飾類的資料成員和成員函數,以及類的繼承,但不用來修飾類本身。
◆ C++中應用:
1.Public, Private, and Protected 的成員
如果使用 class 關鍵字來定義類,那麼定義在第一個訪問標號前的任何成員都隱式指定為 private;如果使用 struct 關鍵字,那麼這些成員都是 public。使用 class 還是 struct 關鍵字來定義類,僅僅影響預設的初始存取層級。預設情況下(沒有使用任何關鍵字的場合),struct 的成員為 public,而 class 的成員為 private。
· public: 程式的任何地方都能使用;
· protected:只能是類本身及其衍生類別以及友元訪問。並且,衍生類別只能通過衍生類別對象訪問其基類的 protected 成員,衍生類別對其基類類型對象的 protected 成員沒有特殊存取權限。像private一樣,類的對象執行個體是不能訪問的protected類成員的。
例如,假定 Bulk_item 定義了一個成員函數,接受一個 Bulk_item 對象的引用和一個 Item_base 對象的引用,該函數可以訪問自己對象的 protected 成員以及 Bulk_item 形參的 protected 成員,但是,它不能訪問 Item_base 形參的 protected 成員。
void Bulk_item::memfcn(const Bulk_item &d, const Item_base &b)
{
// attempt to use protected member
double ret = price; // ok: uses this->price
ret = d.price; // ok: uses price from a Bulk_item object
ret = b.price; // error: no access to price from an Item_base
}
· private:只能是類本身,以及友元函數和友元類訪問;類的對象執行個體是不能訪問 private 類成員的。
2.Public, Private, and Protected 的繼承
基類本身指定對自身成員的最小存取控制。如果成員在基類中為 private,則只有基類和基類的友元可以訪問該成員。衍生類別不能訪問基類的 private 成員,也不能使自己的使用者能夠訪問那些成員。如果基類成員為 public 或 protected,則衍生的資料行表中使用的訪問標號決定該成員在衍生類別中的存取層級:
· 如果是Public 繼承,基類成員保持自己的存取層級:基類的 public 成員為衍生類別的 public 成員,基類的 protected 成員為衍生類別的 protected 成員。
· 如果是 protected 繼承,基類的 public 和 protected 成員在衍生類別中為 protected 成員。
· 如果是 private 繼承,基類的的所有成員在衍生類別中為 private 成員。
假如,size 在 Base 中為 public,但在 Derived 中 因為 private 繼承 Base 後變為 private。為了使 size 在 Derived 中成為 public,可以在 Derived 的 public 部分增加一個 using 聲明。如下這樣改變 Derived 的定義,可以使 size 成員能夠被使用者訪問,並使 n 能夠被從 Derived 派生的類訪問:
class Derived : private Base {
public:
// maintain access levels for members related to the size of the object
using Base::size;
protected:
using Base::n;
// ...
};
· 預設繼承保護層級
上面介紹過用 struct 和 class 保留字定義的類具有不同的預設存取層級,同樣,預設繼承存取層級根據使用哪個保留字定義衍生類別也不相同。使用 class 保留字定義的派生預設具有 private 繼承,而用 struct 保留字定義的類預設具有 public 繼承。
· 友元關係不能繼承
先看下面的代碼:
class Base {
friend class Frnd;
protected:
int i;
};
// Frnd has no access to members in D1
class D1 : public Base {
protected:
int j;
};
class Frnd {
public:
int mem(Base b) { return b.i; } // ok: Frnd is friend to Base
int mem(D1 d) { return d.i; } // error: friendship doesn't inherit
};
// D2 has no access to members in Base
class D2 : public Frnd {
public:
int mem(Base b) { return b.i; } // error: friendship doesn't inherit
};
如上,基類的友元對從該基類派生的類型沒有特殊存取權限。同樣,如果基類和衍生類別都需要訪問另一個類,那個類必須特地將存取權限授予基類的和每一個衍生類別。
· 繼承與靜態成員
如果基類定義 static 成員,則整個繼承層次中只有一個這樣的成員。無論從基類派生出多少個衍生類別,每個 static 成員只有一個執行個體。static 成員遵循常規存取控制:如果成員在基類中為 private,則衍生類別不能訪問它。假定可以訪問成員,則既可以通過基類訪問 static 成員,也可以通過衍生類別訪問 static 成員。一般而言,既可以使用範圍操作符也可以使用點或箭頭成員訪問操作符。
struct Base {
static void statmem(); // public by default
};
struct Derived : Base {
void f(const Derived&);
};
void Derived::f(const Derived &derived_obj)
{
Base::statmem(); // ok: Base defines statmem
Derived::statmem(); // ok: Derived in herits statmem
// ok: derived objects can be used to access static from base
derived_obj.statmem(); // accessed through Derived object
statmem(); // accessed through this class
· 衍生類別到基類轉換的可訪問性
如果是 public 繼承,則使用者代碼和後代類都可以使用衍生類別到基類的轉換。如果類是使用 private 或 protected 繼承派生的,則使用者代碼不能將衍生類別型對象轉換為基類對象。如果是 private 繼承,則從 private 繼承類派生的類不能轉換為基類。如果是 protected 繼承,則後續衍生類別的成員可以轉換為基類類型。
無論是什麼派生訪問標號,衍生類別本身都可以訪問基類的 public 成員,因此,衍生類別本身的成員和友元總是可以訪問衍生類別到基類的轉換。
◆ Java中應用:
1. 在Java中,這三個關鍵字就沒有C++那麼複雜,修飾資料成員和成員方法時,存取權限如下表
private
只能被類本身以及內部類的方法訪問。
protected
可以被類本身,子類,以及同一包中的其它類訪問。
public
可以在所有類中訪問。
關於內部類的相關用法說明,打算另寫一篇文章單獨學習。
2. public 修飾類本身
在一個java源檔案中, 只能有一個public類,但可以有多個非public類。public類一般是含有main方法,並且名字與檔案名稱相同。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/chopin407/archive/2009/04/24/4107795.aspx