C 中訪問控制

2021-06-21 21:49:47 字數 4578 閱讀 6969

1 #include

2 using namespace std;

3 4 class a

11      void disp(a &a)

12      ;

那麼某個函式通過類p訪問

o中成員時,該函式對類o中的

public

成員只有

protected

許可權。 我們經常聽到這樣的說法:

protected:

private:

public繼承

public

protected

---下面摘自專客園的一篇,相當精闢的理解:

protected

protected

---private

繼承 搬出

c++ object model,

可以畫出各個物件的記憶體

map就可以更清晰的看出

:總結:

c++的訪問修飾符的作用是以類為單位,而不是以物件為單位。

通雅的講,同類的物件間可以

「互相訪問

」對方的資料成員,只不過訪問路子不是直接訪問.步

驟是:通過乙個物件呼叫其

public

成員函式

,此成員函式可以訪問到自己的或者同類其他物件的

public/private/protected

資料成員和成員函式

(類的所有物件共用

),而且借需要指明是哪個物件的資料成員

(呼叫函式的物件自己的成員不用指明,因為有

this

指標;其他物件的資料成員可

以通過引用或指標間接指明

)c++

中public,protected,private

訪問小結

第一:private,public,protected

方法的訪問範圍.(

public

繼承下)

private:

只能由該類中的函式、其友元函式訪問

,不能被任何其他訪問,該類的物件也不能訪問

. protected:

可以被該類中的函式、子類的函式、以及其友元函式訪問

,但不能被該類的物件訪問

public:

可以被該類中的函式、子類的函式、其友元函式訪問

,也可以由該類的物件訪問

注:友元函式包括兩種:設為友元的全域性函式,設為友元類中的成員函式第兩:

類的繼承後方法屬性變化

: 使用

private繼承,

父類的所有方法在子類中變為

private;

使用protected繼承,

父類的protected

和public

方法在子類中變為

protected,private

方法不變

; 使用

public繼承,

父類中的方法屬性不發生改變;

private

---

protected

繼承和private

繼承能降低訪問許可權

再次提到:可以**訪問行為的主語為「函式

」。類體內的訪問沒有訪問限制一說,即

private

函式可以訪問

public/protected/private

成員函式或資料成員,同理,

protected

函式,public

函式也可以任意訪問該類體中定義的成員

public

繼承下,基類中的

public

和protected

成員繼承為該子類的

public

和protected

成員(成員函式或資料成員),然後訪問仍然按類內的無限制訪問

protected繼承

1#include

2using

namespace

std;34

classc7

private:8

intm_c;9};

1011

class

d: publicc14

intm_d;

15};

1617

intmain()

1832

33同樣,加進虛函式,可以看到

vc編譯器將

vptr

放置在資料區的最開頭

想清楚一點,其實主語(施事)指的是乙個函式,而不是(當然更不是變數)。

private/public/protected

要控制的是乙個函式(施事)對乙個類的成員(包括成員變數及成員方法)的訪問許可權。因此比較完整的說法是:

對類域範圍內,成員函式訪問無所謂訪問限制。

對繼承情形下的基類

private

成員,在派生類中仍然繼承了下來,只不過它不能直接訪問

, 即使在類裡也不行

, 更不用說是類物件了。

可以通過下列例子看到:

下面這個題目摘自

論壇的乙個帖子:已知

3個類o、

p和q,類

o中定義了乙個私有方法

f1、乙個公有方法

f2和乙個受保護的方法

f3:類p和類

q是類o的派生類,其繼承方式以下所示:

class p : protected o ;

class q : public o ;

關於方法

f1的描述中準確的是

___(34)___

;關於方法

f2韻描述中準確的是

___(35)___

;關於方法

f3的描述中準確的是

___(36)___

。(34)

a.方法

f1無法被訪問

b.只有在類

o內才能訪問方法

f1 c

.只有在類

p內才能訪問方法

f1 d

.只有在類

q內才能訪問方法

f1 (35)a.類

o、p和

q的物件都可以訪問方法

f2 b.類p

和q完美世界的物件都可以訪問方法

f2 c.類0

和q的物件都可以訪問方法f2d

.只有在類

p內才能訪問方法

f2 (36)a.類0

、p和q

的物件都可以訪問方法

f3 b.類0

、p和q

的物件都不可以訪問方法

f3 c.類0

和q的物件都可以訪問方法

f3 d.類p

和q的物件都可以訪問方法f3。

有甚麼法子可以簡單地記住這很多的規則?

下文告訴你乙個基本不需要記的法子。

顧名思義,

private/public/protected

分別表示私有/

公開/保護,它們是一組用於訪問許可權控制的關鍵字。那麼首先,需要澄清的乙個關鍵點是,是要控制誰訪問誰的許可權?這個訪問的主語(施事)是誰?賓語(受事)是誰?

public:

1)乙個類友元可以訪問該類的任何成員(包括成員變數及成員方法,下同)。2)

private成員只有該類自身可以訪問,

protected成員只有該類及其派生類可以訪問,

public成員所有的人都可以訪問。

賓語(受事)是誰這一點很明確,是類的成員(包括成員變數及成員方法)。主語(施事)是誰?這是讓大家發生混淆的關鍵點。也是這個說法中闇昧不清的處所。

1)乙個類友元(包含友元函式或者友元類的所有成員函式)可以訪問該類的任何成員(包括成員變數及成員方法)。

2)除往友元外,

private成員只有該類自身的成員函式可以訪問,

protected成員只有該類的成員函式及其派生類的成員函式可以訪問,

public成員則所有的函式都可以訪問。

也就是說,當我們說乙個類可以訪問

***,其實暗指這個類的成員函式可以訪問

***。認識了這一點,外加一條顯而易見的規則,上面的題目就不難回答了。這條規則是:

private

class a

; class spya : public a

;void testspy(a* pa)

由於這種技術用到了強制型別轉換,當謹慎使用。

彌補:有一種技術叫

member spy

(類成員間諜)

,通過該技術派生類可將基類的

protected

成員修改為

public

許可權。這種技術用到了

using

關鍵字。舉例以下:

C 中訪問控制

第一 private,public,protected 訪問標號的訪問範圍,在沒有繼承的情況下 private 只能由1.該類中的函式 2.其友元函式訪問。不能被任何其他訪問,該類的物件也不能訪問。protected 可以被1.該類中的函式 2.子類的函式 以及3.其友元函式訪問。但不能被該類的物件...

C 訪問控制

在c 中有三種訪問控制說明符 public protected private 一 訪問類中成員情況 private 只允許類內成員函式和友元函式訪問,不允許類的物件訪問 protected 只允許類內成員函式 子類內成員函式和友元函式訪問,不允許類的物件訪問 public 允許類內成員函式 子類內...

c 訪問控制

1.類內的訪問控制 在基類中,public和private具有普通的含義 使用者 即基類的物件 可以訪問public成員 包括函式 資料 而不能訪問private成員。private只能被基類的成員和友員訪問。注 基類的物件無權訪問private成員 派生類對基類的public和private具有相...